Gateway
OpenTelemetry-export
OpenClaw exporteert diagnostiek via de officiële diagnostics-otel plugin
met OTLP/HTTP (protobuf). Elke collector of backend die OTLP/HTTP
accepteert, werkt zonder codewijzigingen. Zie
Logging voor lokale bestandslogs en hoe je ze leest.
Hoe het samenhangt
- Diagnostiek-events zijn gestructureerde records binnen het proces die worden uitgezonden door de Gateway en gebundelde plugins voor modelruns, berichtstroom, sessies, wachtrijen en exec.
- De
diagnostics-otelplugin abonneert zich op die events en exporteert ze als OpenTelemetry metrics, traces en logs via OTLP/HTTP. - Providercalls ontvangen een W3C
traceparent-header van OpenClaw's vertrouwde spancontext voor modelcalls wanneer het providertransport aangepaste headers accepteert. Door plugins uitgezonden tracecontext wordt niet doorgegeven. - Exporters worden alleen gekoppeld wanneer zowel het diagnostiekoppervlak als de plugin zijn ingeschakeld, zodat de kosten binnen het proces standaard bijna nul blijven.
Snel starten
Installeer bij pakketinstallaties eerst de plugin:
openclaw plugins install clawhub:@openclaw/diagnostics-otel
{
plugins: {
allow: ["diagnostics-otel"],
entries: {
"diagnostics-otel": { enabled: true },
},
},
diagnostics: {
enabled: true,
otel: {
enabled: true,
endpoint: "http://otel-collector:4318",
protocol: "http/protobuf",
serviceName: "openclaw-gateway",
traces: true,
metrics: true,
logs: true,
sampleRate: 0.2,
flushIntervalMs: 60000,
},
},
}
Je kunt de plugin ook inschakelen via de CLI:
openclaw plugins enable diagnostics-otel
Geëxporteerde signalen
| Signaal | Wat erin terechtkomt |
|---|---|
| Metrics | Counters en histogrammen voor tokengebruik, kosten, run-duur, berichtstroom, Talk-events, wachtrijlanes, sessiestatus/-herstel, exec en geheugendruk. |
| Traces | Spans voor modelgebruik, modelcalls, harness-lifecycle, tooluitvoering, exec, webhook-/berichtverwerking, contextopbouw en toollussen. |
| Logs | Gestructureerde logging.file-records die via OTLP worden geëxporteerd wanneer diagnostics.otel.logs is ingeschakeld. |
Schakel traces, metrics en logs onafhankelijk van elkaar in of uit. Alle drie staan standaard aan
wanneer diagnostics.otel.enabled true is.
Configuratiereferentie
{
diagnostics: {
enabled: true,
otel: {
enabled: true,
endpoint: "http://otel-collector:4318",
tracesEndpoint: "http://otel-collector:4318/v1/traces",
metricsEndpoint: "http://otel-collector:4318/v1/metrics",
logsEndpoint: "http://otel-collector:4318/v1/logs",
protocol: "http/protobuf", // grpc is ignored
serviceName: "openclaw-gateway",
headers: { "x-collector-token": "..." },
traces: true,
metrics: true,
logs: true,
sampleRate: 0.2, // root-span sampler, 0.0..1.0
flushIntervalMs: 60000, // metric export interval (min 1000ms)
captureContent: {
enabled: false,
inputMessages: false,
outputMessages: false,
toolInputs: false,
toolOutputs: false,
systemPrompt: false,
},
},
},
}
Omgevingsvariabelen
| Variabele | Doel |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT |
Overschrijft diagnostics.otel.endpoint. Als de waarde al /v1/traces, /v1/metrics of /v1/logs bevat, wordt deze ongewijzigd gebruikt. |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_METRICS_ENDPOINT / OTEL_EXPORTER_OTLP_LOGS_ENDPOINT |
Signaalspecifieke endpoint-overschrijvingen die worden gebruikt wanneer de bijbehorende configuratiesleutel diagnostics.otel.*Endpoint niet is ingesteld. Signaalspecifieke configuratie wint van signaalspecifieke env, die wint van het gedeelde endpoint. |
OTEL_SERVICE_NAME |
Overschrijft diagnostics.otel.serviceName. |
OTEL_EXPORTER_OTLP_PROTOCOL |
Overschrijft het wire-protocol (vandaag wordt alleen http/protobuf gehonoreerd). |
OTEL_SEMCONV_STABILITY_OPT_IN |
Stel in op gen_ai_latest_experimental om het nieuwste experimentele GenAI-spanattribuut (gen_ai.provider.name) uit te zenden in plaats van de verouderde gen_ai.system. GenAI-metrics gebruiken altijd begrensde semantische attributen met lage cardinaliteit. |
OPENCLAW_OTEL_PRELOADED |
Stel in op 1 wanneer een andere preload of hostproces de globale OpenTelemetry SDK al heeft geregistreerd. De plugin slaat dan zijn eigen NodeSDK-lifecycle over, maar koppelt nog steeds diagnostieklisteners en respecteert traces/metrics/logs. |
Privacy en contentopname
Ruwe model-/toolcontent wordt standaard niet geëxporteerd. Spans bevatten begrensde identifiers (kanaal, provider, model, foutcategorie, request-id's met alleen hash) en bevatten nooit prompttekst, antwoordtekst, toolinputs, tooloutputs of sessiesleutels. Talk-metrics exporteren alleen begrensde eventmetadata zoals modus, transport, provider en eventtype. Ze bevatten geen transcripties, audiopayloads, sessie-id's, turn-id's, call-id's, room-id's of handoff-tokens.
Uitgaande modelrequests kunnen een W3C traceparent-header bevatten. Die header wordt
alleen gegenereerd uit door OpenClaw beheerde diagnostische tracecontext voor de actieve modelcall.
Bestaande door de caller aangeleverde traceparent-headers worden vervangen, zodat plugins of
aangepaste provideropties geen cross-service trace-afkomst kunnen spoofen.
Stel diagnostics.otel.captureContent.* alleen in op true wanneer je collector en
retentiebeleid zijn goedgekeurd voor prompt-, antwoord-, tool- of system-prompttekst.
Elke subsleutel is afzonderlijk opt-in:
inputMessages- inhoud van gebruikersprompt.outputMessages- inhoud van modelantwoord.toolInputs- payloads met toolargumenten.toolOutputs- payloads met toolresultaten.systemPrompt- samengestelde system-/developerprompt.
Wanneer een subsleutel is ingeschakeld, krijgen model- en toolspans alleen voor die klasse begrensde, geredigeerde
openclaw.content.*-attributen.
Sampling en flushen
- Traces:
diagnostics.otel.sampleRate(alleen root-span,0.0laat alles vallen,1.0behoudt alles). - Metrics:
diagnostics.otel.flushIntervalMs(minimum1000). - Logs: OTLP-logs respecteren
logging.level(bestandslogniveau). Ze gebruiken het redactiepad voor diagnostische logrecords, niet consoleformattering. Installaties met hoog volume moeten OTLP-collector-sampling/filtering verkiezen boven lokale sampling. - Correlatie met bestandslogs: JSONL-bestandslogs bevatten top-level
traceId,spanId,parentSpanIdentraceFlagswanneer de logcall een geldige diagnostische tracecontext bevat, waardoor logprocessors lokale logregels kunnen koppelen aan geëxporteerde spans. - Requestcorrelatie: Gateway-HTTP-requests en WebSocket-frames maken een
interne request-tracescope aan. Logs en diagnostiek-events binnen die scope
erven standaard de requesttrace, terwijl agent-run- en modelcall-spans worden
aangemaakt als children zodat provider-
traceparent-headers op dezelfde trace blijven.
Geëxporteerde metrics
Modelgebruik
openclaw.tokens(counter, attrs:openclaw.token,openclaw.channel,openclaw.provider,openclaw.model,openclaw.agent)openclaw.cost.usd(counter, attrs:openclaw.channel,openclaw.provider,openclaw.model)openclaw.run.duration_ms(histogram, attrs:openclaw.channel,openclaw.provider,openclaw.model)openclaw.context.tokens(histogram, attrs:openclaw.context,openclaw.channel,openclaw.provider,openclaw.model)gen_ai.client.token.usage(histogram, GenAI-semantic-conventions-metric, attrs:gen_ai.token.type=input/output,gen_ai.provider.name,gen_ai.operation.name,gen_ai.request.model)gen_ai.client.operation.duration(histogram, seconden, GenAI-semantic-conventions-metric, attrs:gen_ai.provider.name,gen_ai.operation.name,gen_ai.request.model, optioneelerror.type)openclaw.model_call.duration_ms(histogram, attrs:openclaw.provider,openclaw.model,openclaw.api,openclaw.transport, plusopenclaw.errorCategoryenopenclaw.failureKindbij geclassificeerde fouten)openclaw.model_call.request_bytes(histogram, UTF-8-bytegrootte van de uiteindelijke payload voor het modelrequest; geen ruwe payloadcontent)openclaw.model_call.response_bytes(histogram, UTF-8-bytegrootte van gestreamde modelresponse-events; geen ruwe responsecontent)openclaw.model_call.time_to_first_byte_ms(histogram, verstreken tijd vóór het eerste gestreamde response-event)
Berichtstroom
openclaw.webhook.received(counter, attrs:openclaw.channel,openclaw.webhook)openclaw.webhook.error(counter, attrs:openclaw.channel,openclaw.webhook)openclaw.webhook.duration_ms(histogram, attrs:openclaw.channel,openclaw.webhook)openclaw.message.queued(counter, attrs:openclaw.channel,openclaw.source)openclaw.message.processed(counter, attrs:openclaw.channel,openclaw.outcome)openclaw.message.duration_ms(histogram, attrs:openclaw.channel,openclaw.outcome)openclaw.message.delivery.started(counter, attrs:openclaw.channel,openclaw.delivery.kind)openclaw.message.delivery.duration_ms(histogram, attrs:openclaw.channel,openclaw.delivery.kind,openclaw.outcome,openclaw.errorCategory)
Talk
openclaw.talk.event(counter, attrs:openclaw.talk.event_type,openclaw.talk.mode,openclaw.talk.transport,openclaw.talk.brain,openclaw.talk.provider)openclaw.talk.event.duration_ms(histogram, attrs: hetzelfde alsopenclaw.talk.event; uitgezonden wanneer een Talk-event duur rapporteert)openclaw.talk.audio.bytes(histogram, attrs: hetzelfde alsopenclaw.talk.event; uitgezonden voor Talk-audioframe-events die bytelengte rapporteren)
Wachtrijen en sessies
openclaw.queue.lane.enqueue(teller, attributen:openclaw.lane)openclaw.queue.lane.dequeue(teller, attributen:openclaw.lane)openclaw.queue.depth(histogram, attributen:openclaw.laneofopenclaw.channel=heartbeat)openclaw.queue.wait_ms(histogram, attributen:openclaw.lane)openclaw.session.state(teller, attributen:openclaw.state,openclaw.reason)openclaw.session.stuck(teller, attributen:openclaw.state; alleen uitgezonden voor verouderde sessieboekhouding zonder actief werk)openclaw.session.stuck_age_ms(histogram, attributen:openclaw.state; alleen uitgezonden voor verouderde sessieboekhouding zonder actief werk)openclaw.session.recovery.requested(teller, attributen:openclaw.state,openclaw.action,openclaw.active_work_kind,openclaw.reason)openclaw.session.recovery.completed(teller, attributen:openclaw.state,openclaw.action,openclaw.status,openclaw.active_work_kind,openclaw.reason)openclaw.session.recovery.age_ms(histogram, attributen: hetzelfde als de bijbehorende herstelteller)openclaw.run.attempt(teller, attributen:openclaw.attempt)
Telemetrie voor sessie-levendheid
diagnostics.stuckSessionWarnMs is de leeftijdsdrempel zonder voortgang voor sessie-levendheidsdiagnostiek. Een processing-sessie veroudert niet richting deze drempel zolang OpenClaw voortgang observeert in antwoorden, tools, status, blokken of de ACP-runtime. Typing-keepalives tellen niet als voortgang, zodat een stil model of harnas nog steeds kan worden gedetecteerd.
OpenClaw classificeert sessies op basis van het werk dat het nog kan observeren:
session.long_running: actief ingebed werk, modelaanroepen of toolaanroepen maken nog steeds voortgang.session.stalled: actief werk bestaat, maar de actieve run heeft geen recente voortgang gerapporteerd. Vastgelopen ingebedde runs blijven eerst alleen-observeren en gaan daarna nadiagnostics.stuckSessionAbortMszonder voortgang naar abort-drain, zodat wachtrijbeurten achter de lane kunnen worden hervat. Wanneer niet ingesteld, gebruikt de afbreekdrempel standaard het veiligere uitgebreide venster van minstens 10 minuten en 5xdiagnostics.stuckSessionWarnMs.session.stuck: verouderde sessieboekhouding zonder actief werk. Dit geeft de betrokken sessie-lane onmiddellijk vrij.
Herstel zendt gestructureerde session.recovery.requested- en session.recovery.completed-gebeurtenissen uit. De diagnostische sessiestatus wordt pas als inactief gemarkeerd na een muterende hersteluitkomst (aborted of released) en alleen als dezelfde verwerkingsgeneratie nog steeds actueel is.
Alleen session.stuck zendt de teller openclaw.session.stuck, het histogram openclaw.session.stuck_age_ms en de span openclaw.session.stuck uit. Herhaalde session.stuck-diagnostiek gebruikt back-off zolang de sessie ongewijzigd blijft, dus dashboards moeten waarschuwen op aanhoudende stijgingen in plaats van op elke heartbeat-tick. Zie voor de configuratieknop en standaardwaarden de Configuratiereferentie.
Levenscyclus van het harnas
openclaw.harness.duration_ms(histogram, attributen:openclaw.harness.id,openclaw.harness.plugin,openclaw.outcome,openclaw.harness.phasebij fouten)
Exec
openclaw.exec.duration_ms(histogram, attributen:openclaw.exec.target,openclaw.exec.mode,openclaw.outcome,openclaw.failureKind)
Interne diagnostiek (geheugen en tool-lus)
openclaw.memory.heap_used_bytes(histogram, attributen:openclaw.memory.kind)openclaw.memory.rss_bytes(histogram)openclaw.memory.pressure(teller, attributen:openclaw.memory.level)openclaw.tool.loop.iterations(teller, attributen:openclaw.toolName,openclaw.outcome)openclaw.tool.loop.duration_ms(histogram, attributen:openclaw.toolName,openclaw.outcome)
Geëxporteerde spans
openclaw.model.usageopenclaw.channel,openclaw.provider,openclaw.modelopenclaw.tokens.*(input/output/cache_read/cache_write/total)- standaard
gen_ai.system, ofgen_ai.provider.namewanneer de nieuwste semantische GenAI-conventies zijn ingeschakeld gen_ai.request.model,gen_ai.operation.name,gen_ai.usage.*
openclaw.runopenclaw.outcome,openclaw.channel,openclaw.provider,openclaw.model,openclaw.errorCategory
openclaw.model.call- standaard
gen_ai.system, ofgen_ai.provider.namewanneer de nieuwste semantische GenAI-conventies zijn ingeschakeld gen_ai.request.model,gen_ai.operation.name,openclaw.provider,openclaw.model,openclaw.api,openclaw.transportopenclaw.errorCategoryen optioneelopenclaw.failureKindbij foutenopenclaw.model_call.request_bytes,openclaw.model_call.response_bytes,openclaw.model_call.time_to_first_byte_msopenclaw.provider.request_id_hash(begrensde op SHA gebaseerde hash van de request-id van de upstream-provider; ruwe id's worden niet geëxporteerd)
- standaard
openclaw.harness.runopenclaw.harness.id,openclaw.harness.plugin,openclaw.outcome,openclaw.provider,openclaw.model,openclaw.channel- Bij voltooiing:
openclaw.harness.result_classification,openclaw.harness.yield_detected,openclaw.harness.items.started,openclaw.harness.items.completed,openclaw.harness.items.active - Bij fout:
openclaw.harness.phase,openclaw.errorCategory, optioneelopenclaw.harness.cleanup_failed
openclaw.tool.executiongen_ai.tool.name,openclaw.toolName,openclaw.errorCategory,openclaw.tool.params.*
openclaw.execopenclaw.exec.target,openclaw.exec.mode,openclaw.outcome,openclaw.failureKind,openclaw.exec.command_length,openclaw.exec.exit_code,openclaw.exec.timed_out
openclaw.webhook.processedopenclaw.channel,openclaw.webhook
openclaw.webhook.erroropenclaw.channel,openclaw.webhook,openclaw.error
openclaw.message.processedopenclaw.channel,openclaw.outcome,openclaw.reason
openclaw.message.deliveryopenclaw.channel,openclaw.delivery.kind,openclaw.outcome,openclaw.errorCategory,openclaw.delivery.result_count
openclaw.session.stuckopenclaw.state,openclaw.ageMs,openclaw.queueDepth
openclaw.context.assembledopenclaw.prompt.size,openclaw.history.size,openclaw.context.tokens,openclaw.errorCategory(geen prompt-, geschiedenis-, antwoord- of sessiesleutelinhoud)
openclaw.tool.loopopenclaw.toolName,openclaw.outcome,openclaw.iterations,openclaw.errorCategory(geen lusberichten, params of tooluitvoer)
openclaw.memory.pressureopenclaw.memory.level,openclaw.memory.heap_used_bytes,openclaw.memory.rss_bytes
Wanneer inhoudsvastlegging expliciet is ingeschakeld, kunnen model- en tool-spans ook begrensde, geredigeerde openclaw.content.*-attributen bevatten voor de specifieke inhoudsklassen waarvoor je hebt gekozen.
Catalogus van diagnostische gebeurtenissen
De onderstaande gebeurtenissen ondersteunen de metrics en spans hierboven. Plugins kunnen zich er ook rechtstreeks op abonneren zonder OTLP-export.
Modelgebruik
model.usage- tokens, kosten, duur, context, provider/model/kanaal, sessie-id's.usageis provider-/turn-boekhouding voor kosten en telemetrie;context.usedis de huidige prompt-/contextsnapshot en kan lager zijn dan providerusage.totalwanneer gecachte input of tool-lusaanroepen betrokken zijn.
Berichtenstroom
webhook.received/webhook.processed/webhook.errormessage.queued/message.processedmessage.delivery.started/message.delivery.completed/message.delivery.error
Wachtrij en sessie
queue.lane.enqueue/queue.lane.dequeuesession.state/session.long_running/session.stalled/session.stuckrun.attempt/run.progressdiagnostic.heartbeat(geaggregeerde tellers: webhooks/wachtrij/sessie)
Levenscyclus van het harnas
harness.run.started/harness.run.completed/harness.run.error- levenscyclus per run voor het agentharnas. BevatharnessId, optioneelpluginId, provider/model/kanaal en run-id. Voltooiing voegtdurationMs,outcome, optioneelresultClassification,yieldDetectedenitemLifecycle-aantallen toe. Fouten voegenphase(prepare/start/send/resolve/cleanup),errorCategoryen optioneelcleanupFailedtoe.
Exec
exec.process.completed- terminale uitkomst, duur, doel, modus, exitcode en foutsoort. Commandotekst en werkmappen worden niet opgenomen.
Zonder exporter
Je kunt diagnostische gebeurtenissen beschikbaar houden voor Plugins of aangepaste sinks zonder diagnostics-otel uit te voeren:
{
diagnostics: { enabled: true },
}
Gebruik diagnostische flags voor gerichte debuguitvoer zonder logging.level te verhogen. Flags zijn hoofdletterongevoelig en ondersteunen jokertekens (bijv. telegram.* of *):
{
diagnostics: { flags: ["telegram.http"] },
}
Of als een eenmalige env-override:
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
Flaguitvoer gaat naar het standaardlogbestand (logging.file) en wordt nog steeds geredigeerd door logging.redactSensitive. Volledige handleiding: Diagnostische flags.
Uitschakelen
{
diagnostics: { otel: { enabled: false } },
}
Je kunt diagnostics-otel ook buiten plugins.allow laten, of openclaw plugins disable diagnostics-otel uitvoeren.
Gerelateerd
- Logging - bestandslogs, console-uitvoer, CLI-tailing en het tabblad Logs in de Control UI
- Interne Gateway-logging - WS-logstijlen, subsysteemprefixen en consolevastlegging
- Diagnostische flags - gerichte debuglogflags
- Diagnostische export - operator-tool voor ondersteuningsbundels (los van OTEL-export)
- Configuratiereferentie - volledige veldreferentie voor
diagnostics.*