OpenClaw exportiert Diagnosedaten über das offizielle diagnostics-otel-Plugin
mit OTLP/HTTP (protobuf). Logs können außerdem als stdout-JSONL für
Container- und Sandbox-Log-Pipelines geschrieben werden. Jeder Collector oder jedes Backend, das
OTLP/HTTP akzeptiert, funktioniert ohne Codeänderungen. Informationen zu lokalen Datei-Logs und dazu, wie Sie sie lesen,
finden Sie unter Logging.
So funktioniert das Zusammenspiel
- Diagnoseereignisse sind strukturierte In-Process-Datensätze, die vom
Gateway und gebündelten Plugins für Modellläufe, Nachrichtenfluss, Sitzungen, Warteschlangen
und Exec ausgegeben werden.
- Das
diagnostics-otel-Plugin abonniert diese Ereignisse und exportiert sie als
OpenTelemetry-Metriken, Traces und Logs über OTLP/HTTP. Es kann
außerdem diagnostische Log-Datensätze nach stdout-JSONL spiegeln.
- Provider-Aufrufe erhalten einen W3C-
traceparent-Header aus OpenClaws
vertrauenswürdigem Span-Kontext des Modellaufrufs, wenn der Provider-Transport benutzerdefinierte
Header akzeptiert. Von Plugins ausgegebener Trace-Kontext wird nicht weitergegeben.
- Exporter werden nur angehängt, wenn sowohl die Diagnoseoberfläche als auch das Plugin
aktiviert sind. Daher bleiben die In-Process-Kosten standardmäßig nahe null.
Schnellstart
Installieren Sie bei Paketinstallationen zuerst das 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,
},
},
}
Sie können das Plugin auch über die CLI aktivieren:
openclaw plugins enable diagnostics-otel
protocol unterstützt derzeit nur http/protobuf. grpc wird ignoriert.
Exportierte Signale
| Signal | Inhalt |
|---|
| Metriken | Zähler und Histogramme für Token-Nutzung, Kosten, Laufdauer, Failover, Skill-Nutzung, Nachrichtenfluss, Talk-Ereignisse, Warteschlangen-Lanes, Sitzungszustand/-wiederherstellung, Tool-Ausführung, übergroße Payloads, Exec und Speicherdruck. |
| Traces | Spans für Modellnutzung, Modellaufrufe, Harness-Lebenszyklus, Skill-Nutzung, Tool-Ausführung, Exec, Webhook-/Nachrichtenverarbeitung, Kontextzusammenstellung und Tool-Loops. |
| Logs | Strukturierte logging.file-Datensätze, die über OTLP oder stdout-JSONL exportiert werden, wenn diagnostics.otel.logs aktiviert ist; Log-Bodys werden zurückgehalten, sofern die Inhaltserfassung nicht ausdrücklich aktiviert ist. |
Schalten Sie traces, metrics und logs unabhängig voneinander ein oder aus. Traces und Metriken
sind standardmäßig aktiviert, wenn diagnostics.otel.enabled true ist. Logs sind standardmäßig deaktiviert und
werden nur exportiert, wenn diagnostics.otel.logs ausdrücklich true ist. Der Log-Export
verwendet standardmäßig OTLP; setzen Sie diagnostics.otel.logsExporter auf stdout für JSONL auf
stdout oder auf both, um jeden diagnostischen Log-Datensatz an OTLP und stdout zu senden.
Konfigurationsreferenz
{
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,
logsExporter: "otlp", // otlp | stdout | both
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,
toolDefinitions: false,
},
},
},
}
Umgebungsvariablen
| Variable | Zweck |
|---|
OTEL_EXPORTER_OTLP_ENDPOINT | Überschreibt diagnostics.otel.endpoint. Wenn der Wert bereits /v1/traces, /v1/metrics oder /v1/logs enthält, wird er unverändert verwendet. |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_METRICS_ENDPOINT / OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | Signalspezifische Endpoint-Überschreibungen, die verwendet werden, wenn der passende Konfigurationsschlüssel diagnostics.otel.*Endpoint nicht gesetzt ist. Signalspezifische Konfiguration hat Vorrang vor signalspezifischer Umgebung, diese wiederum vor dem gemeinsamen Endpoint. |
OTEL_SERVICE_NAME | Überschreibt diagnostics.otel.serviceName. |
OTEL_EXPORTER_OTLP_PROTOCOL | Überschreibt das Wire-Protokoll (heute wird nur http/protobuf berücksichtigt). |
OTEL_SEMCONV_STABILITY_OPT_IN | Setzen Sie dies auf gen_ai_latest_experimental, um die neueste experimentelle GenAI-Inferenz-Span-Form auszugeben, einschließlich Span-Namen im Format {gen_ai.operation.name} {gen_ai.request.model}, Span-Kind CLIENT und gen_ai.provider.name statt des alten gen_ai.system. GenAI-Metriken verwenden unabhängig davon immer begrenzte semantische Attribute mit niedriger Kardinalität. |
OPENCLAW_OTEL_PRELOADED | Setzen Sie dies auf 1, wenn ein anderer Preload oder Host-Prozess bereits das globale OpenTelemetry-SDK registriert hat. Das Plugin überspringt dann seinen eigenen NodeSDK-Lebenszyklus, verdrahtet aber weiterhin Diagnose-Listener und berücksichtigt traces/metrics/logs. |
Datenschutz und Inhaltserfassung
Rohe Modell-/Tool-Inhalte werden standardmäßig nicht exportiert. Spans enthalten begrenzte
Bezeichner (Kanal, Provider, Modell, Fehlerkategorie, reine Hash-Anfrage-IDs,
Tool-Quelle, Tool-Eigentümer und Skill-Name/-Quelle) und enthalten niemals Prompt-Text,
Antworttext, Tool-Eingaben, Tool-Ausgaben, Skill-Dateipfade oder Sitzungsschlüssel.
OTLP-Log-Datensätze behalten standardmäßig Schweregrad, Logger, Codeposition, vertrauenswürdigen Trace-Kontext
und bereinigte Attribute bei, aber der rohe Log-Nachrichtenbody wird nur exportiert,
wenn diagnostics.otel.captureContent auf den booleschen Wert true gesetzt ist. Granulare
captureContent.*-Unterschlüssel aktivieren keine Log-Bodys. Labels, die wie
Scoped-Agent-Sitzungsschlüssel aussehen, werden durch unknown ersetzt.
Talk-Metriken exportieren nur begrenzte Ereignismetadaten wie Modus, Transport,
Provider und Ereignistyp. Sie enthalten keine Transkripte, Audio-Payloads,
Sitzungs-IDs, Turn-IDs, Call-IDs, Raum-IDs oder Handoff-Tokens.
Ausgehende Modellanfragen können einen W3C-traceparent-Header enthalten. Dieser Header wird
nur aus OpenClaw-eigenem Diagnose-Trace-Kontext für den aktiven Modellaufruf generiert.
Vorhandene vom Aufrufer bereitgestellte traceparent-Header werden ersetzt, sodass Plugins oder
benutzerdefinierte Provider-Optionen keine dienstübergreifende Trace-Abstammung vortäuschen können.
Setzen Sie diagnostics.otel.captureContent.* nur dann auf true, wenn Ihr Collector und
Ihre Aufbewahrungsrichtlinie für Prompt-, Antwort-, Tool- oder System-Prompt-
Text freigegeben sind. Jeder Unterschlüssel ist unabhängig opt-in:
inputMessages - Benutzer-Prompt-Inhalt.
outputMessages - Modellantwortinhalt.
toolInputs - Tool-Argument-Payloads.
toolOutputs - Tool-Ergebnis-Payloads.
systemPrompt - zusammengestellter System-/Developer-Prompt.
toolDefinitions - Modell-Tool-Namen, Beschreibungen und Schemas.
Wenn ein Unterschlüssel aktiviert ist, erhalten Modell- und Tool-Spans begrenzte, redigierte
openclaw.content.*-Attribute nur für diese Klasse. Verwenden Sie den booleschen Wert
captureContent: true nur für breite Diagnoseerfassungen, bei denen auch OTLP-Log-
Nachrichtenbodys für den Export freigegeben sind.
toolInputs-/toolOutputs-Inhalte werden für die Tool-Ausführungen der integrierten Agent-Runtime
erfasst (openclaw.content.tool_input auf abgeschlossenen/Fehler-Spans,
openclaw.content.tool_output auf abgeschlossenen Spans). Externe Harness-Tool-Aufrufe
(Codex, Claude CLI) geben tool.execution.*-Spans ohne Inhalts-Payloads aus.
Erfasste Inhalte laufen über einen vertrauenswürdigen, nur für Listener bestimmten Kanal und werden niemals
auf dem öffentlichen Diagnoseereignisbus platziert.
Sampling und Flushen
- Traces:
diagnostics.otel.sampleRate (nur Root-Span, 0.0 verwirft alle,
1.0 behält alle).
- Metriken:
diagnostics.otel.flushIntervalMs (Minimum 1000).
- Logs: OTLP-Logs berücksichtigen
logging.level (Datei-Log-Level). Sie verwenden den
Redaktionspfad für diagnostische Log-Records, nicht die Konsolenformatierung. Installationen mit hohem Volumen
sollten OTLP-Collector-Sampling/-Filterung lokalem Sampling vorziehen.
Setzen Sie diagnostics.otel.logsExporter: "stdout", wenn Ihre Plattform bereits
stdout/stderr an einen Log-Prozessor weiterleitet und Sie keinen OTLP-Logs-
Collector haben. Stdout-Records sind ein JSON-Objekt pro Zeile mit ts, signal,
service.name, Schweregrad, Body, redigierten Attributen und vertrauenswürdigen Trace-Feldern,
sofern verfügbar.
- Datei-Log-Korrelation: JSONL-Datei-Logs enthalten
traceId,
spanId, parentSpanId und traceFlags auf oberster Ebene, wenn der Log-Aufruf einen gültigen
diagnostischen Trace-Kontext enthält. Dadurch können Log-Prozessoren lokale Log-Zeilen mit
exportierten Spans verbinden.
- Request-Korrelation: Gateway-HTTP-Requests und WebSocket-Frames erstellen einen
internen Request-Trace-Scope. Logs und diagnostische Ereignisse innerhalb dieses Scopes
übernehmen standardmäßig den Request-Trace, während Agent-Run- und Model-Call-Spans als
untergeordnete Elemente erstellt werden, sodass Provider-
traceparent-Header auf demselben Trace bleiben.
- Model-Call-Korrelation:
openclaw.model.call-Spans enthalten standardmäßig sichere Größen von Prompt-
Komponenten und enthalten Token-Attribute pro Aufruf, wenn das
Provider-Ergebnis Nutzungsdaten bereitstellt. openclaw.model.usage bleibt der Accounting-Span auf Run-Ebene für aggregierte Kosten,
Kontext und Kanal-Dashboards; er bleibt auf demselben diagnostischen Trace, wenn die ausgebende Runtime einen vertrauenswürdigen Trace-
Kontext hat.
Exportierte Metriken
Modellnutzung
openclaw.tokens (Zähler, Attribute: openclaw.token, openclaw.channel, openclaw.provider, openclaw.model, openclaw.agent)
openclaw.cost.usd (Zähler, Attribute: openclaw.channel, openclaw.provider, openclaw.model)
openclaw.run.duration_ms (Histogramm, Attribute: openclaw.channel, openclaw.provider, openclaw.model)
openclaw.context.tokens (Histogramm, Attribute: openclaw.context, openclaw.channel, openclaw.provider, openclaw.model)
gen_ai.client.token.usage (Histogramm, Metrik der semantischen GenAI-Konventionen, Attribute: gen_ai.token.type = input/output, gen_ai.provider.name, gen_ai.operation.name, gen_ai.request.model)
gen_ai.client.operation.duration (Histogramm, Sekunden, Metrik der semantischen GenAI-Konventionen, Attribute: gen_ai.provider.name, gen_ai.operation.name, gen_ai.request.model, optional error.type)
openclaw.model_call.duration_ms (Histogramm, Attribute: openclaw.provider, openclaw.model, openclaw.api, openclaw.transport, plus openclaw.errorCategory und openclaw.failureKind bei klassifizierten Fehlern)
openclaw.model_call.request_bytes (Histogramm, UTF-8-Bytegröße der finalen Model-Request-Payload; kein Roh-Payload-Inhalt)
openclaw.model_call.response_bytes (Histogramm, UTF-8-Bytegröße von gestreamten Response-Chunk-Payloads; hochfrequente Text-, Denk- und Tool-Call-Deltas zählen nur inkrementelle delta-Bytes; kein Roh-Response-Inhalt)
openclaw.model_call.time_to_first_byte_ms (Histogramm, verstrichene Zeit vor dem ersten gestreamten Response-Ereignis)
openclaw.model.failover (Zähler, Attribute: openclaw.provider, openclaw.model, openclaw.failover.to_provider, openclaw.failover.to_model, openclaw.failover.reason, openclaw.failover.suspended, openclaw.lane)
openclaw.skill.used (Zähler, Attribute: openclaw.skill.name, openclaw.skill.source, openclaw.skill.activation, optional openclaw.agent, optional openclaw.toolName)
Nachrichtenfluss
openclaw.webhook.received (Zähler, Attribute: openclaw.channel, openclaw.webhook)
openclaw.webhook.error (Zähler, Attribute: openclaw.channel, openclaw.webhook)
openclaw.webhook.duration_ms (Histogramm, Attribute: openclaw.channel, openclaw.webhook)
openclaw.message.queued (Zähler, Attribute: openclaw.channel, openclaw.source)
openclaw.message.received (Zähler, Attribute: openclaw.channel, openclaw.source)
openclaw.message.dispatch.started (Zähler, Attribute: openclaw.channel, openclaw.source)
openclaw.message.dispatch.completed (Zähler, Attribute: openclaw.channel, openclaw.outcome, openclaw.reason, openclaw.source)
openclaw.message.dispatch.duration_ms (Histogramm, Attribute: openclaw.channel, openclaw.outcome, openclaw.reason, openclaw.source)
openclaw.message.processed (Zähler, Attribute: openclaw.channel, openclaw.outcome)
openclaw.message.duration_ms (Histogramm, Attribute: openclaw.channel, openclaw.outcome)
openclaw.message.delivery.started (Zähler, Attribute: openclaw.channel, openclaw.delivery.kind)
openclaw.message.delivery.duration_ms (Histogramm, Attribute: openclaw.channel, openclaw.delivery.kind, openclaw.outcome, openclaw.errorCategory)
Talk
openclaw.talk.event (Zähler, Attribute: openclaw.talk.event_type, openclaw.talk.mode, openclaw.talk.transport, openclaw.talk.brain, openclaw.talk.provider)
openclaw.talk.event.duration_ms (Histogramm, Attribute: wie openclaw.talk.event; wird ausgegeben, wenn ein Talk-Ereignis eine Dauer meldet)
openclaw.talk.audio.bytes (Histogramm, Attribute: wie openclaw.talk.event; wird für Talk-Audio-Frame-Ereignisse ausgegeben, die eine Bytelänge melden)
Warteschlangen und Sitzungen
openclaw.queue.lane.enqueue (Zähler, Attribute: openclaw.lane)
openclaw.queue.lane.dequeue (Zähler, Attribute: openclaw.lane)
openclaw.queue.depth (Histogramm, Attribute: openclaw.lane oder openclaw.channel=heartbeat)
openclaw.queue.wait_ms (Histogramm, Attribute: openclaw.lane)
openclaw.session.state (Zähler, Attribute: openclaw.state, openclaw.reason)
openclaw.session.stuck (Zähler, Attribute: openclaw.state; wird für wiederherstellbare veraltete Sitzungsbuchhaltung ausgegeben)
openclaw.session.stuck_age_ms (Histogramm, Attribute: openclaw.state; wird für wiederherstellbare veraltete Sitzungsbuchhaltung ausgegeben)
openclaw.session.turn.created (Zähler, Attribute: openclaw.agent, openclaw.channel, openclaw.trigger)
openclaw.session.recovery.requested (Zähler, Attribute: openclaw.state, openclaw.action, openclaw.active_work_kind, openclaw.reason)
openclaw.session.recovery.completed (Zähler, Attribute: openclaw.state, openclaw.action, openclaw.status, openclaw.active_work_kind, openclaw.reason)
openclaw.session.recovery.age_ms (Histogramm, Attribute: wie der passende Recovery-Zähler)
openclaw.run.attempt (Zähler, Attribute: openclaw.attempt)
Telemetrie zur Sitzungs-Liveness
diagnostics.stuckSessionWarnMs ist der Altersgrenzwert ohne Fortschritt für Sitzungs-
Liveness-Diagnosen. Eine processing-Sitzung altert nicht in Richtung dieses Grenzwerts,
solange OpenClaw Antwort-, Tool-, Status-, Block- oder ACP-Runtime-Fortschritt beobachtet.
Typing-Keepalives werden nicht als Fortschritt gezählt, sodass ein stilles Modell oder Harness
weiterhin erkannt werden kann.
OpenClaw klassifiziert Sitzungen nach der Arbeit, die noch beobachtet werden kann:
session.long_running: Aktive eingebettete Arbeit, Model-Calls oder Tool-Calls machen
weiterhin Fortschritt. Eigene Model-Calls, die länger als
diagnostics.stuckSessionWarnMs still bleiben, werden ebenfalls als long-running gemeldet, bevor
diagnostics.stuckSessionAbortMs erreicht ist, damit langsame oder nicht streamende Modell-Provider
nicht wie festgefahrene Gateway-Sitzungen aussehen, solange sie weiterhin abbrechbar beobachtet werden können.
session.stalled: Aktive Arbeit existiert, aber der aktive Run hat keinen
aktuellen Fortschritt gemeldet. Eigene Model-Calls wechseln von session.long_running zu
session.stalled bei oder nach diagnostics.stuckSessionAbortMs; veraltete
ownerlose Model-/Tool-Aktivität wird nicht als harmlose lang laufende Arbeit behandelt.
Festgefahrene eingebettete Runs bleiben zunächst observe-only und werden dann nach
diagnostics.stuckSessionAbortMs ohne Fortschritt per Abort-Drain behandelt, damit in der
Lane wartende Turns fortgesetzt werden können. Wenn nicht gesetzt, verwendet der Abbruchgrenzwert standardmäßig das sicherere
erweiterte Fenster von mindestens 5 Minuten und 3x
diagnostics.stuckSessionWarnMs.
session.stuck: Veraltete Sitzungsbuchhaltung ohne aktive Arbeit oder eine inaktive
wartende Sitzung mit veralteter ownerloser Model-/Tool-Aktivität. Dadurch wird die
betroffene Sitzungs-Lane sofort freigegeben, nachdem die Recovery-Gates bestanden wurden.
Recovery gibt strukturierte session.recovery.requested- und
session.recovery.completed-Ereignisse aus. Der diagnostische Sitzungszustand wird nur nach
einem mutierenden Recovery-Ergebnis (aborted oder released) als idle markiert und nur, wenn dieselbe
Processing-Generation noch aktuell ist.
Nur session.stuck gibt den Zähler openclaw.session.stuck, das
Histogramm openclaw.session.stuck_age_ms und den Span openclaw.session.stuck
aus. Wiederholte session.stuck-Diagnosen verwenden Backoff, solange die Sitzung unverändert bleibt,
daher sollten Dashboards auf anhaltende Anstiege statt auf jeden
Heartbeat-Tick alarmieren. Den Konfigurationsschalter und die Defaults finden Sie in der
Konfigurationsreferenz.
Liveness-Warnungen geben außerdem aus:
openclaw.liveness.warning (Zähler, Attribute: openclaw.liveness.reason)
openclaw.liveness.event_loop_delay_p99_ms (Histogramm, Attribute: openclaw.liveness.reason)
openclaw.liveness.event_loop_delay_max_ms (Histogramm, Attribute: openclaw.liveness.reason)
openclaw.liveness.event_loop_utilization (Histogramm, Attribute: openclaw.liveness.reason)
openclaw.liveness.cpu_core_ratio (Histogramm, Attribute: openclaw.liveness.reason)
Harness-Lebenszyklus
openclaw.harness.duration_ms (Histogramm, Attribute: openclaw.harness.id, openclaw.harness.plugin, openclaw.outcome, openclaw.harness.phase bei Fehlern)
openclaw.tool.execution.duration_ms (Histogramm, Attribute: gen_ai.tool.name, openclaw.toolName, openclaw.tool.source, openclaw.tool.owner, openclaw.tool.params.kind, plus openclaw.errorCategory bei Fehlern)
openclaw.tool.execution.blocked (Zähler, Attribute: gen_ai.tool.name, openclaw.toolName, openclaw.tool.source, openclaw.tool.owner, openclaw.tool.params.kind, openclaw.deniedReason)
Exec
openclaw.exec.duration_ms (Histogramm, Attribute: openclaw.exec.target, openclaw.exec.mode, openclaw.outcome, openclaw.failureKind)
openclaw.payload.large (Zähler, Attribute: openclaw.payload.surface, openclaw.payload.action, openclaw.channel, openclaw.plugin, openclaw.reason)
openclaw.payload.large_bytes (Histogramm, Attribute: wie openclaw.payload.large)
openclaw.memory.heap_used_bytes (Histogramm, Attribute: openclaw.memory.kind)
openclaw.memory.rss_bytes (Histogramm)
openclaw.memory.pressure (Zähler, Attribute: openclaw.memory.level)
openclaw.tool.loop.iterations (Zähler, Attribute: openclaw.toolName, openclaw.outcome)
openclaw.tool.loop.duration_ms (Histogramm, Attribute: openclaw.toolName, openclaw.outcome)
Exportierte Spans
openclaw.model.usage
openclaw.channel, openclaw.provider, openclaw.model
openclaw.tokens.* (input/output/cache_read/cache_write/total)
- standardmäßig
gen_ai.system oder gen_ai.provider.name, wenn die neuesten semantischen GenAI-Konventionen aktiviert sind
gen_ai.request.model, gen_ai.operation.name, gen_ai.usage.*
openclaw.run
openclaw.outcome, openclaw.channel, openclaw.provider, openclaw.model, openclaw.errorCategory
openclaw.model.call
- standardmäßig
gen_ai.system oder gen_ai.provider.name, wenn die neuesten semantischen GenAI-Konventionen aktiviert sind
gen_ai.request.model, gen_ai.operation.name, openclaw.provider, openclaw.model, openclaw.api, openclaw.transport
openclaw.errorCategory und optional openclaw.failureKind bei Fehlern
openclaw.model_call.request_bytes, openclaw.model_call.response_bytes, openclaw.model_call.time_to_first_byte_ms
openclaw.model_call.prompt.input_messages_count, openclaw.model_call.prompt.input_messages_chars, openclaw.model_call.prompt.system_prompt_chars, openclaw.model_call.prompt.tool_definitions_count, openclaw.model_call.prompt.tool_definitions_chars, openclaw.model_call.prompt.total_chars (nur sichere Komponentengrößen, kein Prompt-Text)
openclaw.model_call.usage.* und gen_ai.usage.*, wenn das Modellaufruf-Ergebnis Provider-Nutzungsdaten für diesen einzelnen Aufruf enthält
openclaw.provider.request_id_hash (begrenzter SHA-basierter Hash der Upstream-Provider-Anfrage-ID; Roh-IDs werden nicht exportiert)
- Mit
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental verwenden Modellaufruf-Spans den neuesten GenAI-Inferenz-Span-Namen {gen_ai.operation.name} {gen_ai.request.model} und die Span-Art CLIENT statt openclaw.model.call.
openclaw.harness.run
openclaw.harness.id, openclaw.harness.plugin, openclaw.outcome, openclaw.provider, openclaw.model, openclaw.channel
- Bei Abschluss:
openclaw.harness.result_classification, openclaw.harness.yield_detected, openclaw.harness.items.started, openclaw.harness.items.completed, openclaw.harness.items.active
- Bei Fehler:
openclaw.harness.phase, openclaw.errorCategory, optional openclaw.harness.cleanup_failed
openclaw.tool.execution
gen_ai.tool.name, openclaw.toolName, openclaw.errorCategory, openclaw.tool.params.*
openclaw.exec
openclaw.exec.target, openclaw.exec.mode, openclaw.outcome, openclaw.failureKind, openclaw.exec.command_length, openclaw.exec.exit_code, openclaw.exec.timed_out
openclaw.webhook.processed
openclaw.channel, openclaw.webhook
openclaw.webhook.error
openclaw.channel, openclaw.webhook, openclaw.error
openclaw.message.processed
openclaw.channel, openclaw.outcome, openclaw.reason
openclaw.message.delivery
openclaw.channel, openclaw.delivery.kind, openclaw.outcome, openclaw.errorCategory, openclaw.delivery.result_count
openclaw.session.stuck
openclaw.state, openclaw.ageMs, openclaw.queueDepth
openclaw.context.assembled
openclaw.prompt.size, openclaw.history.size, openclaw.context.tokens, openclaw.errorCategory (keine Prompt-, Verlaufs-, Antwort- oder Sitzungsschlüssel-Inhalte)
openclaw.tool.loop
openclaw.toolName, openclaw.outcome, openclaw.iterations, openclaw.errorCategory (keine Loop-Nachrichten, Parameter oder Tool-Ausgaben)
openclaw.memory.pressure
openclaw.memory.level, openclaw.memory.heap_used_bytes, openclaw.memory.rss_bytes
Wenn Inhaltserfassung ausdrücklich aktiviert ist, können Modell- und Tool-Spans außerdem
begrenzte, redigierte openclaw.content.*-Attribute für die spezifischen
Inhaltsklassen enthalten, die Sie aktiviert haben.
Katalog diagnostischer Ereignisse
Die folgenden Ereignisse stützen die oben genannten Metriken und Spans. Plugins können sie auch
direkt abonnieren, ohne OTLP-Export.
Modellnutzung
model.usage - Token, Kosten, Dauer, Kontext, Provider/Modell/Kanal,
Sitzungs-IDs. usage ist Provider-/Turn-Abrechnung für Kosten und Telemetrie;
context.used ist der aktuelle Prompt-/Kontext-Snapshot und kann niedriger sein als
Provider-usage.total, wenn gecachte Eingaben oder Tool-Loop-Aufrufe beteiligt sind.
Nachrichtenfluss
webhook.received / webhook.processed / webhook.error
message.queued / message.processed
message.delivery.started / message.delivery.completed / message.delivery.error
Warteschlange und Sitzung
queue.lane.enqueue / queue.lane.dequeue
session.state / session.long_running / session.stalled / session.stuck
run.attempt / run.progress
diagnostic.heartbeat (aggregierte Zähler: Webhooks/Warteschlange/Sitzung)
Harness-Lebenszyklus
harness.run.started / harness.run.completed / harness.run.error -
Lebenszyklus pro Lauf für das Agent-Harness. Enthält harnessId, optional
pluginId, Provider/Modell/Kanal und Lauf-ID. Abschluss ergänzt
durationMs, outcome, optional resultClassification, yieldDetected
und itemLifecycle-Zählwerte. Fehler ergänzen phase
(prepare/start/send/resolve/cleanup), errorCategory und
optional cleanupFailed.
Exec
exec.process.completed - terminales Ergebnis, Dauer, Ziel, Modus, Exit-Code
und Fehlerart. Befehlstext und Arbeitsverzeichnisse sind nicht enthalten.
exec.approval.followup_suppressed - veraltete Genehmigungs-Follow-up-Nachricht wurde nach
einer Sitzungsrückkehr verworfen. Enthält approvalId, reason (session_rebound),
phase (direct_delivery oder gateway_preflight) und den Dispatcher-
Zeitstempel. Sitzungsschlüssel, Routen und Befehlstext sind nicht enthalten.
Ohne Exporter
Sie können Diagnoseereignisse für Plugins oder benutzerdefinierte Senken verfügbar halten, ohne
diagnostics-otel auszuführen:
{
diagnostics: { enabled: true },
}
Für gezielte Debug-Ausgaben ohne Erhöhung von logging.level verwenden Sie Diagnose-
Flags. Flags unterscheiden nicht zwischen Groß- und Kleinschreibung und unterstützen Platzhalter (z. B. telegram.* oder
*):
{
diagnostics: { flags: ["telegram.http"] },
}
Oder als einmalige Env-Überschreibung:
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
Flag-Ausgaben gehen in die Standard-Logdatei (logging.file) und werden weiterhin
durch logging.redactSensitive redigiert. Vollständige Anleitung:
Diagnose-Flags.
Deaktivieren
{
diagnostics: { otel: { enabled: false } },
}
Sie können diagnostics-otel auch aus plugins.allow auslassen oder
openclaw plugins disable diagnostics-otel ausführen.
Verwandte Themen