diff --git a/changelog.mdx b/changelog.mdx index e455af7..c42ef03 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -7,6 +7,25 @@ description: "Stay up to date with the latest agentsfleet product updates, new f agentsfleet is in **stealth-mode testing** and pre-production. APIs and agent behavior may change between releases without long deprecation windows. Email [agentsfleet@agentmail.to](mailto:agentsfleet@agentmail.to) if you want a hand calibrating an agent or to join as a design partner. + + ## The daemon exports traces, metrics, and logs over OTLP + + `agentsfleetd` now sends all three signals to one OpenTelemetry Protocol (OTLP) endpoint, named by the OpenTelemetry specification's own variables. With no endpoint set, the daemon starts, serves, and exports nothing. With an unreachable endpoint, requests are unaffected: batches drop and a counter records the loss. + + ## What's new + + - **`OTEL_EXPORTER_OTLP_ENDPOINT` names the collector** — traces post to `/v1/traces`, metrics to `/v1/metrics`, and logs to `/v1/logs` under it. No default. Unset means no export. + - **`OTEL_EXPORTER_OTLP_HEADERS` adds request headers** — comma-separated `key=value` pairs. A pair without `=` stops the daemon from starting. No default. + - **`OTEL_EXPORTER_OTLP_PROTOCOL` picks the encoding** — `http/protobuf` (default) or `http/json`. Any other value, `grpc` included, stops the daemon from starting. + - **`OTEL_EXPORTER_OTLP_TIMEOUT` bounds one export** — whole milliseconds, default `10000`. Zero or an unreadable value stops the daemon from starting. + - **`GRAFANA_OTLP_ENDPOINT`, `GRAFANA_OTLP_INSTANCE_ID`, and `GRAFANA_OTLP_API_KEY` still work** — the endpoint is read when the standard variable is unset, and the pair becomes a basic `Authorization` header. A standard header of the same name replaces it. These names retire with the previous daemon. + - **Metrics are collected every 5 seconds** — the interval the previous daemon used, so a series keeps its rate across the switch. + - **Lost telemetry is counted, never retried** — spans, log records, and metric collection cycles that failed to send are counted in the process. A resent window would double-count delta families. + - **The log signal counts without logging** — a warning about a failed log export would become a log record handed back to the exporter that just failed it. For logs the count is the whole report. + - **A family this build does not produce is named at start-up** — each is logged once, at `debug` level, with the reason, rather than exported as zeros. + - **The start-up line names where the endpoint came from, never its value** — `startup_otel_enabled` carries `source=OTEL_EXPORTER_OTLP_ENDPOINT` or `source=GRAFANA_OTLP_ENDPOINT`, because the header beside the endpoint carries a credential. + + ## Every command answers a mistyped invocation the same way diff --git a/docs.json b/docs.json index 5014d0c..d77a87b 100644 --- a/docs.json +++ b/docs.json @@ -119,8 +119,7 @@ "group": "Health", "pages": [ "GET /healthz", - "GET /readyz", - "GET /metrics" + "GET /readyz" ] }, { @@ -181,11 +180,26 @@ "pages": [ "POST /v1/runners", "GET /v1/fleets/runners", - "GET /v1/fleets/runners/{id}", - "PATCH /v1/fleets/runners/{id}", - "DELETE /v1/fleets/runners/{id}", - "GET /v1/fleets/runners/{id}/leases", - "GET /v1/fleets/runners/{id}/events" + "GET /v1/fleets/runners/{runner_id}", + "PATCH /v1/fleets/runners/{runner_id}", + "DELETE /v1/fleets/runners/{runner_id}", + "GET /v1/fleets/runners/{runner_id}/leases", + "GET /v1/fleets/runners/{runner_id}/events" + ] + }, + { + "group": "Runner plane", + "pages": [ + "GET /v1/runners/me", + "POST /v1/runners/me/heartbeats", + "POST /v1/runners/me/leases", + "POST /v1/runners/me/leases/{lease_id}/renew", + "POST /v1/runners/me/leases/{lease_id}/activity", + "POST /v1/runners/me/reports", + "POST /v1/runners/me/credentials/mint", + "GET /v1/runners/me/bundles/{content_hash}", + "GET /v1/runners/me/memory/{fleet_id}", + "POST /v1/runners/me/memory/{fleet_id}" ] }, { @@ -215,8 +229,8 @@ "pages": [ "GET /v1/workspaces/{workspace_id}/secrets", "POST /v1/workspaces/{workspace_id}/secrets", - "PUT /v1/workspaces/{workspace_id}/secrets/{secret_name}", - "DELETE /v1/workspaces/{workspace_id}/secrets/{secret_name}" + "PUT /v1/workspaces/{workspace_id}/secrets/{name}", + "DELETE /v1/workspaces/{workspace_id}/secrets/{name}" ] }, { @@ -228,7 +242,7 @@ "DELETE /v1/workspaces/{workspace_id}/connectors/{provider}", "GET /v1/connectors/{provider}/callback", "POST /v1/connectors/{provider}/callback", - "POST /v1/connectors/slack/events" + "POST /v1/connectors/{provider}/events" ] }, { @@ -236,8 +250,7 @@ "pages": [ "GET /v1/workspaces/{workspace_id}/approvals", "GET /v1/workspaces/{workspace_id}/approvals/{gate_id}", - "POST /v1/workspaces/{workspace_id}/approvals/{gate_id}:approve", - "POST /v1/workspaces/{workspace_id}/approvals/{gate_id}:deny" + "POST /v1/workspaces/{workspace_id}/approvals/{gate_id}/{decision}" ] }, { @@ -265,6 +278,7 @@ { "group": "Fleet messages", "pages": [ + "GET /v1/workspaces/{workspace_id}/fleets/{fleet_id}/messages", "POST /v1/workspaces/{workspace_id}/fleets/{fleet_id}/messages" ] }, @@ -283,7 +297,7 @@ "GET /v1/workspaces/{workspace_id}/fleets/{fleet_id}/schedules/{schedule_id}", "PATCH /v1/workspaces/{workspace_id}/fleets/{fleet_id}/schedules/{schedule_id}", "DELETE /v1/workspaces/{workspace_id}/fleets/{fleet_id}/schedules/{schedule_id}", - "POST /v1/workspaces/{workspace_id}/fleets/{fleet_id}/schedules/{schedule_id}:sync", + "POST /v1/workspaces/{workspace_id}/fleets/{fleet_id}/schedules/{schedule_id}/sync", "POST /v1/ingress/qstash/schedules" ] }, @@ -309,8 +323,7 @@ "POST /v1/webhooks/svix/{fleet_id}", "POST /v1/webhooks/{fleet_id}", "POST /v1/webhooks/{fleet_id}/approval", - "POST /v1/webhooks/{fleet_id}/github", - "POST /v1/webhooks/{fleet_id}/grant-approval" + "POST /v1/webhooks/{fleet_id}/github" ] }, {