Overview
OpenClaw is a self-hosted personal AI assistant. Its gateway includes a built-indiagnostics-otel plugin that exports OpenTelemetry traces and logs over OTLP/HTTP.
Pointed at Bronto, every model call your assistant makes lands in Bronto with full token, model, provider, and (optionally) prompt/response context.
You can ship telemetry to Bronto in one of two ways:
- Through an OpenTelemetry Collector that forwards to Bronto (recommended). More reliable and easier to debug when something doesn’t show up in Bronto.
- Directly from the
diagnostics-otelplugin to Bronto’s OTLP endpoints. Fewer moving parts, but harder to troubleshoot.
Before you start
You will need:- A running OpenClaw gateway. The configuration is the same wherever the gateway runs - only the path to
openclaw.jsonand~/.openclaw/.envdiffers. - A Bronto API key — see API Keys.
- Your Bronto region (
euorus) — see Bronto Ingestion Endpoints.
diagnostics-otel plugin must be installed and enabled on the gateway:
Recommended: OpenTelemetry Collector
1. Run a Collector next to OpenClaw
Install the OpenTelemetry Collector on the same host as the OpenClaw gateway, or anywhere the gateway can reach over the network. The OpenTelemetry Collector installation docs cover Docker, Linux packages, Homebrew, Windows, and Kubernetes; see also Connect OpenTelemetry Collector to Bronto for richer Bronto-specific configuration. Use the config below as your starting point.- It accepts OTLP/HTTP on port
4318 - It prints every received signal to the Collector’s standard output via the
debugexporter - It forwards everything to Bronto.
The
debug exporter is included intentionally, as it is a useful tool for confirming that signals are reaching the Collector, and what they look like.Recommended for initial setup, but remove it from the exporters block and from each pipeline once telemetry is flowing reliably into Bronto.otel-collector-config.yaml
<REGION> with eu or us and <YOUR_API_KEY> with your Bronto API key. Per-signal endpoints (traces_endpoint, logs_endpoint, metrics_endpoint) are required because Bronto’s OTLP host does not follow the default OTLP path convention.
2. Point OpenClaw at the Collector
Add adiagnostics block at the top level of your ~/.openclaw/openclaw.json, alongside the existing top-level keys (gateway, agents, models, plugins, etc…, not nested inside any of them).
openclaw.json
endpoint to wherever the Collector’s OTLP/HTTP receiver is reachable from the gateway.
http://localhost:4318 is correct when both run on the same host.
If they run as separate containers on a shared Docker network, use the Collector’s service or container name instead (e.g. http://otel-collector:4318).
Add the following to your ~/.openclaw/.env:
~/.openclaw/.env
OTEL_SEMCONV_STABILITY_OPT_IN opts the gateway in to the stable GenAI semantic-convention attributes (gen_ai.request.model, gen_ai.usage.input_tokens, etc.).
It is an environment variable and cannot be set in openclaw.json.
Without it, spans carry only OpenClaw’s own openclaw.* attributes.
Restart the gateway to pick up the new configuration. Use whichever of the following matches your setup:
- OpenClaw CLI
- Docker Compose
- Plain Docker
- Process supervisor
3. Confirm signals are flowing
Send your OpenClaw assistant a message, then watch the Collector’s output. Thedebug exporter writes to the Collector’s standard output, so where you find that depends on how you launched it:
- Docker —
docker logs -f <container_name_or_id>. - Foreground terminal — if you launched the Collector binary directly in a shell, debug lines appear in that terminal.
- systemd —
journalctl -u otelcol -f(orotelcol-contrib -ffor the contrib build). - Other supervisors — wherever you redirected the Collector’s stdout / stderr (for example
/var/log/otelcol/otelcol.log).
If you see all three after sending a message to the assistant, OpenClaw is emitting telemetry correctly. The next thing to verify is that it has reached Bronto:
- Traces — open Traces and check that traces for the openclaw-gateway service are visible.
- Logs — open Log Search and check for data in the
openclaw-demo/openclawdataset.
Alternative: export directly from OpenClaw to Bronto
If you cannot run a Collector alongside the gateway, thediagnostics-otel plugin can send to Bronto’s OTLP endpoints directly. This works, but it gives limited visibility so debugging is harder.
1. Configure openclaw.json
Add a diagnostics block at the top level of your ~/.openclaw/openclaw.json. Authenticate with the x-bronto-api-key header.
openclaw.json
eu with us if your account is in the US region. The ${BRONTO_API_KEY} interpolation keeps the secret out of committed config — OpenClaw resolves the variable at load time and fails fast if it is unset.
OpenClaw’s logs toggle defaults to false, so set "logs": true to send log records alongside traces.
2. Configure ~/.openclaw/.env
~/.openclaw/.env
3. Restart and verify
Restart the gateway, then send the assistant a message and check Bronto:- Traces — open Traces and check that traces for the openclaw-gateway service are visible.
- Logs — open Log Search and check for data in the
openclaw-demo/openclawdataset.
The gateway logs only emit a
logs exporter enabled line on startup — they do not log a traces exporter line, and they do not log export failures.Reference
Endpoints by region
Headers
Notable openclaw.json diagnostics fields
Troubleshooting
Step one: isolate where the failure is
Before checking individual settings, determine which side of the pipeline is failing. The Collector path makes this trivial — itsdebug exporter prints every signal it receives.
- If using the Opentelemetry Collector: Tail the Collector’s output (see Confirm signals are flowing) and send the assistant a message.
- Signals appear in the Collector output but not in Bronto → the failure is between the Collector and Bronto. Check the API key, region, and headers in
otel-collector-config.yaml. - Signals do not appear in the Collector output → the failure is upstream of the Collector. The plugin is not enabled, the gateway has not been restarted, or no model activity is being generated.
- Signals appear in the Collector output but not in Bronto → the failure is between the Collector and Bronto. Check the API key, region, and headers in
- If sending telemetry directly: Test network and auth as described in the next section. If that fails switch to the OpenTelemetry Collector and run the same check. This is by far the fastest way to narrow the failure down - without it, you cannot see what OpenClaw is (or isn’t) emitting.
Network and auth test
Use this to check for networking or auth failures between the Collector and Bronto. Run both checks from the same host as the Collector (or your OpenClaw agent, if sending telemetry directly). The examples target the EU region — swapeu for us if your account is in the US region.
1. DNS resolution. Empty output means DNS is broken locally (split-DNS on a corporate VPN, misconfigured resolv.conf inside a container, captive portal, etc.).
curl command pre-filled with a hello-world payload and your API key — copy-paste it into a shell on the Collector’s host.
A 200 proves both connectivity and that the API key is valid for this region.
If it fails, re-run with -vvv for the full request, TLS handshake, and response, and Google the specific error.
Common issues
API key incorrect. Especially common when an AI agent edited the config - agents frequently mis-substitute the key (dropped characters, wrapped in extra quotes, replaced with a placeholder like<YOUR_API_KEY>). Re-paste the key by hand and confirm it matches exactly.
Logs arrive in Bronto but no traces or metrics. This is a known intermittent issue with the diagnostics-otel plugin. Fully restart the gateway service — docker compose restart openclaw-gateway, or restart the OpenClaw container / supervised process for native installs. A simple reload is not enough.
Traces arrive but no logs. OpenClaw’s logs toggle defaults to false in some plugin versions. Set "logs": true explicitly in openclaw.json.
Wrong region. The API key is region-scoped. EU keys do not work against us endpoints and vice versa. Confirm the key’s region in Bronto and use the matching ingestion.<region>.bronto.io host.
Spans arrive but gen_ai.* attributes are missing. Set OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental in ~/.openclaw/.env and restart the gateway. Without it, OpenClaw emits only its own openclaw.* attributes.
No prompt/response content on spans. Expected unless captureContent is true in the diagnostics.otel block.
Plugin not exporting at all. Confirm diagnostics-otel is in plugins.allow, the plugin is enabled, and both diagnostics.enabled and diagnostics.otel.enabled are true.
protocol ignored / nothing exported. The protocol field must be http/protobuf. OpenClaw ignores gRPC.
Configure with AI (experimental)
If you’d rather have an OpenClaw up to Bronto for you itself, paste one of the prompts below into an agent with access to your OpenClaw host (or your local checkout of~/.openclaw/). Substitute occurrences of <YOUR API KEY> with your Bronto API key before sending.
Direct path prompt
Direct path prompt
OpenTelemetry Collector path prompt
OpenTelemetry Collector path prompt
Troubleshooting prompt
Troubleshooting prompt
Hand the agent this prompt if telemetry isn’t showing up in Bronto after running one of the setup prompts above.

