OpenClaw esporta la diagnostica tramite il Plugin ufficiale diagnostics-otel
usando OTLP/HTTP (protobuf). I log possono anche essere scritti come JSONL su stdout per
le pipeline di log di container e sandbox. Qualsiasi collector o backend che accetta
OTLP/HTTP funziona senza modifiche al codice. Per i log su file locali e come leggerli,
vedi Logging.
Come funziona l’insieme
- Gli eventi diagnostici sono record strutturati, in-process, emessi dal
Gateway e dai plugin inclusi per esecuzioni dei modelli, flusso dei messaggi, sessioni, code
ed exec.
- Il Plugin
diagnostics-otel sottoscrive questi eventi e li esporta come
metriche, tracce e log OpenTelemetry tramite OTLP/HTTP. Può
anche duplicare i record di log diagnostici in JSONL su stdout.
- Le chiamate ai provider ricevono un header W3C
traceparent dal contesto
span attendibile della chiamata al modello di OpenClaw quando il trasporto del provider accetta header
personalizzati. Il contesto di traccia emesso dai Plugin non viene propagato.
- Gli exporter vengono collegati solo quando sia la superficie diagnostica sia il Plugin sono
abilitati, quindi il costo in-process resta vicino a zero per impostazione predefinita.
Avvio rapido
Per le installazioni pacchettizzate, installa prima il 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,
},
},
}
Puoi anche abilitare il Plugin dalla CLI:
openclaw plugins enable diagnostics-otel
protocol attualmente supporta solo http/protobuf. grpc viene ignorato.
Segnali esportati
| Segnale | Cosa contiene |
|---|
| Metriche | Contatori e istogrammi per uso dei token, costo, durata delle esecuzioni, failover, uso delle skill, flusso dei messaggi, eventi Talk, corsie di coda, stato/ripristino della sessione, esecuzione degli strumenti, payload sovradimensionati, exec e pressione sulla memoria. |
| Tracce | Span per uso dei modelli, chiamate ai modelli, ciclo di vita dell’harness, uso delle skill, esecuzione degli strumenti, exec, elaborazione webhook/messaggi, assemblaggio del contesto e loop degli strumenti. |
| Log | Record logging.file strutturati esportati tramite OTLP o JSONL su stdout quando diagnostics.otel.logs è abilitato; i corpi dei log vengono trattenuti salvo che la cattura del contenuto sia esplicitamente abilitata. |
Attiva o disattiva traces, metrics e logs in modo indipendente. Tracce e metriche
sono attive per impostazione predefinita quando diagnostics.otel.enabled è true. I log sono disattivati per impostazione predefinita e
vengono esportati solo quando diagnostics.otel.logs è esplicitamente true. L’esportazione dei log
usa OTLP per impostazione predefinita; imposta diagnostics.otel.logsExporter su stdout per JSONL su
stdout, oppure su both per inviare ogni record di log diagnostico a OTLP e stdout.
Riferimento di configurazione
{
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,
},
},
},
}
Variabili d’ambiente
| Variabile | Scopo |
|---|
OTEL_EXPORTER_OTLP_ENDPOINT | Sovrascrive diagnostics.otel.endpoint. Se il valore contiene già /v1/traces, /v1/metrics o /v1/logs, viene usato così com’è. |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_METRICS_ENDPOINT / OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | Override degli endpoint specifici per segnale usati quando la chiave di configurazione diagnostics.otel.*Endpoint corrispondente non è impostata. La configurazione specifica per segnale ha precedenza sull’env specifico per segnale, che ha precedenza sull’endpoint condiviso. |
OTEL_SERVICE_NAME | Sovrascrive diagnostics.otel.serviceName. |
OTEL_EXPORTER_OTLP_PROTOCOL | Sovrascrive il protocollo di trasmissione (oggi viene rispettato solo http/protobuf). |
OTEL_SEMCONV_STABILITY_OPT_IN | Imposta su gen_ai_latest_experimental per emettere la forma span sperimentale più recente dell’inferenza GenAI, inclusi i nomi span {gen_ai.operation.name} {gen_ai.request.model}, il tipo di span CLIENT e gen_ai.provider.name invece del legacy gen_ai.system. Le metriche GenAI usano sempre attributi semantici limitati e a bassa cardinalità. |
OPENCLAW_OTEL_PRELOADED | Imposta su 1 quando un altro preload o processo host ha già registrato l’SDK OpenTelemetry globale. Il Plugin quindi salta il proprio ciclo di vita NodeSDK, ma collega comunque i listener diagnostici e rispetta traces/metrics/logs. |
Privacy e cattura del contenuto
Il contenuto grezzo di modello/strumento non viene esportato per impostazione predefinita. Gli span trasportano
identificatori limitati (canale, provider, modello, categoria di errore, id richiesta solo hash,
origine dello strumento, proprietario dello strumento e nome/origine della skill) e non includono mai testo del prompt,
testo della risposta, input degli strumenti, output degli strumenti, percorsi dei file delle skill o chiavi di sessione.
I record di log OTLP mantengono severità, logger, posizione del codice, contesto di traccia attendibile
e attributi sanificati per impostazione predefinita, ma il corpo grezzo del messaggio di log viene esportato
solo quando diagnostics.otel.captureContent è impostato al booleano true. Le sottochiavi granulari
captureContent.* non abilitano i corpi dei log. Le etichette che assomigliano a
chiavi di sessione agente con ambito vengono sostituite con unknown.
Le metriche Talk esportano solo metadati evento limitati come modalità, trasporto,
provider e tipo di evento. Non includono trascrizioni, payload audio,
id sessione, id turno, id chiamata, id stanza o token di handoff.
Le richieste in uscita verso i modelli possono includere un header W3C traceparent. Quell’header viene
generato solo dal contesto di traccia diagnostico di proprietà di OpenClaw per la chiamata al modello
attiva. Gli header traceparent esistenti forniti dal chiamante vengono sostituiti, quindi Plugin o
opzioni provider personalizzate non possono falsificare l’ascendenza di traccia tra servizi.
Imposta diagnostics.otel.captureContent.* su true solo quando il tuo collector e
la policy di conservazione sono approvati per testo di prompt, risposta, strumento o system prompt.
Ogni sottochiave è opt-in in modo indipendente:
inputMessages - contenuto del prompt utente.
outputMessages - contenuto della risposta del modello.
toolInputs - payload degli argomenti degli strumenti.
toolOutputs - payload dei risultati degli strumenti.
systemPrompt - prompt di sistema/sviluppatore assemblato.
toolDefinitions - nomi, descrizioni e schemi degli strumenti del modello.
Quando una sottochiave è abilitata, gli span di modello e strumento ricevono attributi
openclaw.content.* limitati e redatti solo per quella classe. Usa il booleano
captureContent: true solo per catture diagnostiche ampie in cui anche i corpi dei messaggi di log OTLP
sono approvati per l’esportazione.
Il contenuto toolInputs/toolOutputs viene catturato per le esecuzioni degli strumenti del runtime agente
integrato (openclaw.content.tool_input su span completati/con errore,
openclaw.content.tool_output su span completati). Le chiamate agli strumenti degli harness esterni
(Codex, Claude CLI) emettono span tool.execution.* senza payload di contenuto.
Il contenuto catturato viaggia su un canale attendibile, solo per listener, e non viene mai inserito
nel bus pubblico degli eventi diagnostici.
Campionamento e flush
-
Tracce:
diagnostics.otel.sampleRate (solo span radice, 0.0 scarta tutto,
1.0 mantiene tutto).
-
openclaw.model.usage
openclaw.channel, openclaw.provider, openclaw.model
openclaw.tokens.* (input/output/cache_read/cache_write/total)
gen_ai.system per impostazione predefinita, oppure gen_ai.provider.name quando si aderisce alle convenzioni semantiche GenAI più recenti
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
gen_ai.system per impostazione predefinita, oppure gen_ai.provider.name quando si aderisce alle convenzioni semantiche GenAI più recenti
gen_ai.request.model, gen_ai.operation.name, openclaw.provider, openclaw.model, openclaw.api, openclaw.transport
openclaw.errorCategory e openclaw.failureKind facoltativo sugli errori
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 (solo dimensioni sicure dei componenti, nessun testo del prompt)
openclaw.model_call.usage.* e gen_ai.usage.* quando il risultato della chiamata al modello contiene l’utilizzo del provider per quella singola chiamata
openclaw.provider.request_id_hash (hash limitato basato su SHA dell’id richiesta del provider upstream; gli id grezzi non vengono esportati)
- Con
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental, gli span delle chiamate al modello usano il nome span di inferenza GenAI più recente {gen_ai.operation.name} {gen_ai.request.model} e il tipo span CLIENT invece di openclaw.model.call.
-
openclaw.harness.run
openclaw.harness.id, openclaw.harness.plugin, openclaw.outcome, openclaw.provider, openclaw.model, openclaw.channel
- Al completamento:
openclaw.harness.result_classification, openclaw.harness.yield_detected, openclaw.harness.items.started, openclaw.harness.items.completed, openclaw.harness.items.active
- In caso di errore:
openclaw.harness.phase, openclaw.errorCategory, openclaw.harness.cleanup_failed facoltativo
-
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 (nessun contenuto di prompt, cronologia, risposta o chiave di sessione)
-
openclaw.tool.loop
openclaw.toolName, openclaw.outcome, openclaw.iterations, openclaw.errorCategory (nessun messaggio di loop, parametro o output dello strumento)
-
openclaw.memory.pressure
openclaw.memory.level, openclaw.memory.heap_used_bytes, openclaw.memory.rss_bytes
Quando l’acquisizione del contenuto è abilitata esplicitamente, gli span di modello e strumento possono anche
includere attributi openclaw.content.* limitati e redatti per le classi di
contenuto specifiche a cui hai aderito.
Catalogo degli eventi diagnostici
Gli eventi seguenti supportano le metriche e gli span indicati sopra. I Plugin possono anche iscriversi
direttamente a essi senza esportazione OTLP.
Utilizzo del modello
model.usage - token, costo, durata, contesto, provider/modello/canale,
id sessione. usage è la contabilità provider/turno per costo e telemetria;
context.used è lo snapshot corrente di prompt/contesto e può essere inferiore a
usage.total del provider quando sono coinvolti input memorizzati in cache o chiamate tool-loop.
Flusso dei messaggi
webhook.received / webhook.processed / webhook.error
message.queued / message.processed
message.delivery.started / message.delivery.completed / message.delivery.error
Coda e sessione
queue.lane.enqueue / queue.lane.dequeue
session.state / session.long_running / session.stalled / session.stuck
run.attempt / run.progress
diagnostic.heartbeat (contatori aggregati: webhook/coda/sessione)
Ciclo di vita dell’harness
harness.run.started / harness.run.completed / harness.run.error -
ciclo di vita per esecuzione dell’harness dell’agente. Include harnessId, pluginId
facoltativo, provider/modello/canale e id esecuzione. Il completamento aggiunge
durationMs, outcome, resultClassification facoltativo, yieldDetected
e conteggi itemLifecycle. Gli errori aggiungono phase
(prepare/start/send/resolve/cleanup), errorCategory e
cleanupFailed facoltativo.
Exec
exec.process.completed - esito terminale, durata, target, modalità, codice di uscita
e tipo di errore. Il testo del comando e le directory di lavoro non sono
inclusi.
exec.approval.followup_suppressed - follow-up di approvazione obsoleto eliminato dopo
un rebound della sessione. Include approvalId, reason (session_rebound),
phase (direct_delivery o gateway_preflight) e il timestamp del dispatcher.
Chiavi di sessione, route e testo del comando non sono inclusi.
Senza un esportatore
Puoi mantenere gli eventi diagnostici disponibili per Plugin o sink personalizzati senza
eseguire diagnostics-otel:
{
diagnostics: { enabled: true },
}
Per output di debug mirato senza aumentare logging.level, usa i flag diagnostici.
I flag non distinguono tra maiuscole e minuscole e supportano caratteri jolly (ad es. telegram.* o
*):
{
diagnostics: { flags: ["telegram.http"] },
}
Oppure come override env una tantum:
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
L’output dei flag va al file di log standard (logging.file) ed è comunque
redatto da logging.redactSensitive. Guida completa:
Flag diagnostici.
Disabilitare
{
diagnostics: { otel: { enabled: false } },
}
Puoi anche lasciare diagnostics-otel fuori da plugins.allow, oppure eseguire
openclaw plugins disable diagnostics-otel.
Correlati