thousands-dusk-35277
07/04/2026, 3:43 PMthousands-dusk-35277
07/06/2026, 3:02 PMlimited-student-10747
07/06/2026, 3:05 PMthousands-dusk-35277
07/06/2026, 3:06 PMthousands-dusk-35277
07/06/2026, 4:49 PMcalm-artist-7206
07/06/2026, 5:52 PMnutritious-balloon-65098
07/06/2026, 5:52 PMlimited-student-10747
07/06/2026, 5:53 PMcalm-artist-7206
07/06/2026, 5:55 PMthousands-dusk-35277
07/06/2026, 5:58 PMthousands-dusk-35277
07/06/2026, 5:59 PMnutritious-balloon-65098
07/06/2026, 6:08 PM/workspace/repos/agent-canvas
◦ /workspace/repos/software-agent-sdk
◦ /workspace/repos/docs
• Confirmed Agent Canvas Docker is built on top of <http://ghcr.io/openhands/agent-server|ghcr.io/openhands/agent-server>, and its entrypoint starts openhands-agent-server, so SDK observability env vars are inherited by the backend process.
• Added docs for the missing Agent Canvas Docker observability path:
◦ openhands/usage/agent-canvas/backend-setup/docker.mdx
◦ openhands/usage/agent-canvas/setup.mdx
◦ sdk/guides/observability.mdx
• Committed and pushed:
◦ commit: 8e8f3c1a docs: add Agent Canvas Docker observability guidance
◦ branch: docs/agent-canvas-docker-observability
Validation:
• git diff --check passed
• uv run --with pytest --with requests --with pyyaml pytest -q tests/ -k 'not pricing' passed: 30 passed, 6 deselected
• Full suite currently has an unrelated pricing-doc test error because <https://raw.githubusercontent.com/OpenHands/OpenHands/main/openhands/utils/llm.py> returns 404.
Slack-ready answer for Beryl:
Yes — even though the observability docs are written from the SDK perspective, they also apply to Agent Canvas when you run it with Docker. The Agent Canvas Docker image starts the OpenHands Agent Server inside the container, and that server uses the OpenHands SDK, so you enable tracing by passing the sameorLMNR_*environment variables to the container.OTEL_*
For Laminar:
```docker run -it --rm \
-p 8000:8000 \
-e LMNR_PROJECT_API_KEY="your-laminar-api-key" \
-v ~/.openhands:/home/openhands/.openhands \
-v ~/projects:/projects \
ghcr.io/openhands/agent-canvas:latest```
For an OTLP backend such as Jaeger, Tempo, Honeycomb, Datadog, or New Relic:
```docker run -it --rm \
--add-host=host.docker.internal:host-gateway \
-p 8000:8000 \
-e OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://host.docker.internal:4317" \
-e OTEL_EXPORTER_OTLP_TRACES_PROTOCOL="grpc" \
-v ~/.openhands:/home/openhands/.openhands \
-v ~/projects:/projects \
ghcr.io/openhands/agent-canvas:latest```
One important Docker gotcha:inside the Agent Canvas container means the container itself, not your host. If your collector is on your host, uselocalhoston Docker Desktop, or add the host gateway alias on Linux. If the collector is another container, put both containers on the same Docker network and use the collector service name, for examplehost.docker.internalor<http://jaeger:4317>.<http://tempo:4317>
For Prometheus/Grafana specifically: the SDK observability path is OTLP tracing, not a built-in PrometheusDo you want me to also add a Grafana Tempo-specific example to the PR, or keep this PR focused on the generic Laminar/OTLP Docker guidance?scrape endpoint. Grafana works well if you send OTLP traces to Tempo or Jaeger and add that as a Grafana data source. The SDK “metrics” docs are mostly token/cost/latency metrics accessible from SDK objects, not a Prometheus exporter for Agent Canvas Docker./metrics
thousands-dusk-35277
07/06/2026, 6:44 PMcalm-artist-7206
07/06/2026, 6:46 PMnutritious-balloon-65098
07/06/2026, 6:46 PMnutritious-balloon-65098
07/06/2026, 6:49 PMe77a2864 docs: clarify Agent Canvas observability boundaries
What I added:
• A new “View Backend Conversations and Events” section for Agent Canvas Docker:
◦ Uses built-in backend APIs.
◦ Shows X-Session-API-Key with LOCAL_BACKEND_API_KEY.
◦ Shows /api/conversations/search.
◦ Shows /api/conversations/{id}/events/search?limit=20.
◦ Clarifies this is separate from observability tracing.
• A new “Built-in Tracing vs. External Backends” section:
◦ Built in:
▪︎ Agent Server runs inside Agent Canvas Docker.
▪︎ SDK trace instrumentation/export is built in.
▪︎ Backend conversation/event APIs are built in.
◦ Not built in:
▪︎ No Prometheus /metrics endpoint for Agent Canvas Docker agent execution metrics.
▪︎ No Grafana connector that authenticates into Agent Canvas or makes conversations appear in the left panel.
▪︎ Laminar, Jaeger, Tempo, Prometheus, Grafana, Datadog, Honeycomb, New Relic are external systems.
• A clarification that SDK metrics are token/cost/latency tracking, not Prometheus scrape metrics.
• Updated the SDK observability note to make the same built-in-vs-external distinction.
Validation:
• git diff --check passed
• uv run --with pytest --with requests --with pyyaml pytest -q tests/ -k 'not pricing' passed: 30 passed, 6 deselected
I also updated the PR body to call out these changes explicitly.thousands-dusk-35277
07/06/2026, 7:09 PM