OpenTelemetry export
Nora can export its agent telemetry under the OpenTelemetry GenAI semantic conventions (gen_ai.*), so per-agent token usage, estimated cost, and runtime resource metrics flow into the Datadog / Grafana / Langfuse / Honeycomb stack you already operate — no Nora-specific agent or scraper required.
It is disabled by default and fail-open: a collector outage or misconfiguration never affects chat or any other request path.
What gets exported
Spans (OTLP only): onechat span per recorded LLM exchange, with gen_ai.operation.name=chat, gen_ai.request.model, gen_ai.system (provider), gen_ai.usage.input_tokens / output_tokens, gen_ai.conversation.id (session), and nora.agent.id / nora.runtime.family / nora.sandbox.profile / nora.source. The span is bracketed around the runtime call, so its duration reflects real latency.
Metrics (OTLP and/or Prometheus):
| Instrument | Type | Notes |
|---|---|---|
gen_ai.client.token.usage | histogram | Tokens per exchange, split by gen_ai.token.type (input / output) |
nora.agent.cost.usd | counter | Estimated spend, attributed by agent + model, using the same model-aware pricing as /app/cost |
nora.agent.cpu.percent | gauge | Latest sampled container CPU per running agent |
nora.agent.memory.percent | gauge | Latest sampled container memory percent per running agent |
nora.agent.memory.usage | gauge | Latest sampled container memory (MB) per running agent |
Nora observes telemetry at the exchange granularity it actually receives from the runtimes.
Per-LLM-call and per-tool-call sub-spans depend on event streams OpenClaw and Hermes do not
currently expose to the control plane, and are tracked as a future enhancement. A2A Agent Cards
are likewise on the roadmap.
Enable it
Set the master switch and at least one exporter, then restart the backend:http://<backend-host>:9464/metrics.
Cost accuracy
Thenora.agent.cost.usd counter is emitted unrounded per exchange (sub-cent values accumulate accurately), using COST_PER_1K_TOKENS and the optional per-model COST_MODEL_RATES_JSON map — see environment variables. Configure those rates to match your providers for meaningful cost dashboards.
Verify
With Prometheus enabled:sandbox_profile=nemoclaw; the export should show nora.runtime.family=openclaw and nora.sandbox.profile=nemoclaw without any API-key labels.
