Vai al contenuto principale
OpenClaw esporta la diagnostica tramite il Plugin diagnostics-otel incluso nel bundle usando OTLP/HTTP (protobuf). Qualsiasi collector o backend che accetta OTLP/HTTP funziona senza modifiche al codice. Per i log locali su file e come leggerli, vedi Logging.

Come si integra

  • Gli eventi diagnostici sono record strutturati in-process emessi dal Gateway e dai Plugin inclusi nel bundle per esecuzioni di modelli, flusso dei messaggi, sessioni, code ed exec.
  • Il Plugin diagnostics-otel si sottoscrive a questi eventi e li esporta come OpenTelemetry metriche, trace e log tramite OTLP/HTTP.
  • 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 trace 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 quasi nullo per impostazione predefinita.

Avvio rapido

{
  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

SegnaleCosa contiene
MetricsCounter e histogram per uso dei token, costo, durata delle esecuzioni, flusso dei messaggi, lane delle code, stato delle sessioni, exec e pressione di memoria.
TracesSpan per uso dei modelli, chiamate ai modelli, ciclo di vita dell’harness, esecuzione degli strumenti, exec, elaborazione di Webhook/messaggi, assemblaggio del contesto e loop degli strumenti.
LogsRecord strutturati logging.file esportati tramite OTLP quando diagnostics.otel.logs è abilitato.
Puoi attivare o disattivare traces, metrics e logs in modo indipendente. Tutti e tre sono attivi per impostazione predefinita quando diagnostics.otel.enabled è true.

Riferimento della 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 viene ignorato
      serviceName: "openclaw-gateway",
      headers: { "x-collector-token": "..." },
      traces: true,
      metrics: true,
      logs: true,
      sampleRate: 0.2, // sampler dello span root, 0.0..1.0
      flushIntervalMs: 60000, // intervallo di esportazione delle metriche (min 1000ms)
      captureContent: {
        enabled: false,
        inputMessages: false,
        outputMessages: false,
        toolInputs: false,
        toolOutputs: false,
        systemPrompt: false,
      },
    },
  },
}

Variabili d’ambiente

VariabileScopo
OTEL_EXPORTER_OTLP_ENDPOINTSovrascrive 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_ENDPOINTOverride degli endpoint specifici per segnale usati quando la chiave di configurazione corrispondente diagnostics.otel.*Endpoint non è impostata. La configurazione specifica per segnale ha la precedenza sull’env specifico per segnale, che a sua volta ha la precedenza sull’endpoint condiviso.
OTEL_SERVICE_NAMESovrascrive diagnostics.otel.serviceName.
OTEL_EXPORTER_OTLP_PROTOCOLSovrascrive il protocollo wire (oggi viene rispettato solo http/protobuf).
OTEL_SEMCONV_STABILITY_OPT_INImpostalo su gen_ai_latest_experimental per emettere il più recente attributo span sperimentale GenAI (gen_ai.provider.name) invece del legacy gen_ai.system. Le metriche GenAI usano sempre attributi semantici limitati e a bassa cardinalità.
OPENCLAW_OTEL_PRELOADEDImpostalo su 1 quando un altro preload o processo host ha già registrato l’SDK OpenTelemetry globale. Il Plugin allora salta il proprio ciclo di vita NodeSDK ma collega comunque i listener diagnostici e rispetta traces/metrics/logs.

Privacy e acquisizione del contenuto

Il contenuto grezzo di modello/strumenti non viene esportato per impostazione predefinita. Gli span trasportano identificatori limitati (canale, provider, modello, categoria di errore, request id con solo hash) e non includono mai testo del prompt, testo della risposta, input degli strumenti, output degli strumenti o chiavi di sessione. Le richieste modello in uscita possono includere un header W3C traceparent. Questo header viene generato solo dal contesto trace diagnostico posseduto da OpenClaw per la chiamata al modello attiva. Gli header traceparent forniti dal chiamante vengono sostituiti, quindi Plugin o opzioni personalizzate del provider non possono falsificare l’ascendenza trace cross-service. Imposta diagnostics.otel.captureContent.* su true solo quando il tuo collector e la policy di retention sono approvati per prompt, risposte, strumenti o testo del prompt di sistema. Ogni sottochiave è opt-in 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 system/developer assemblato.
Quando una qualsiasi sottochiave è abilitata, gli span di modello e strumenti ricevono attributi limitati e redatti openclaw.content.* solo per quella classe.

Sampling e flush

  • Traces: diagnostics.otel.sampleRate (solo span root, 0.0 elimina tutto, 1.0 conserva tutto).
  • Metrics: diagnostics.otel.flushIntervalMs (minimo 1000).
  • Logs: i log OTLP rispettano logging.level (livello di log su file). La redazione della console non si applica ai log OTLP. Le installazioni ad alto volume dovrebbero preferire sampling/filtering del collector OTLP invece del sampling locale.

Metriche esportate

Uso del modello

  • openclaw.tokens (counter, attr: openclaw.token, openclaw.channel, openclaw.provider, openclaw.model, openclaw.agent)
  • openclaw.cost.usd (counter, attr: openclaw.channel, openclaw.provider, openclaw.model)
  • openclaw.run.duration_ms (histogram, attr: openclaw.channel, openclaw.provider, openclaw.model)
  • openclaw.context.tokens (histogram, attr: openclaw.context, openclaw.channel, openclaw.provider, openclaw.model)
  • gen_ai.client.token.usage (histogram, metrica semantic-conventions GenAI, attr: gen_ai.token.type = input/output, gen_ai.provider.name, gen_ai.operation.name, gen_ai.request.model)
  • gen_ai.client.operation.duration (histogram, secondi, metrica semantic-conventions GenAI, attr: gen_ai.provider.name, gen_ai.operation.name, gen_ai.request.model, error.type facoltativo)

Flusso dei messaggi

  • openclaw.webhook.received (counter, attr: openclaw.channel, openclaw.webhook)
  • openclaw.webhook.error (counter, attr: openclaw.channel, openclaw.webhook)
  • openclaw.webhook.duration_ms (histogram, attr: openclaw.channel, openclaw.webhook)
  • openclaw.message.queued (counter, attr: openclaw.channel, openclaw.source)
  • openclaw.message.processed (counter, attr: openclaw.channel, openclaw.outcome)
  • openclaw.message.duration_ms (histogram, attr: openclaw.channel, openclaw.outcome)
  • openclaw.message.delivery.started (counter, attr: openclaw.channel, openclaw.delivery.kind)
  • openclaw.message.delivery.duration_ms (histogram, attr: openclaw.channel, openclaw.delivery.kind, openclaw.outcome, openclaw.errorCategory)

Code e sessioni

  • openclaw.queue.lane.enqueue (counter, attr: openclaw.lane)
  • openclaw.queue.lane.dequeue (counter, attr: openclaw.lane)
  • openclaw.queue.depth (histogram, attr: openclaw.lane o openclaw.channel=heartbeat)
  • openclaw.queue.wait_ms (histogram, attr: openclaw.lane)
  • openclaw.session.state (counter, attr: openclaw.state, openclaw.reason)
  • openclaw.session.stuck (counter, attr: openclaw.state)
  • openclaw.session.stuck_age_ms (histogram, attr: openclaw.state)
  • openclaw.run.attempt (counter, attr: openclaw.attempt)

Ciclo di vita dell’harness

  • openclaw.harness.duration_ms (histogram, attr: openclaw.harness.id, openclaw.harness.plugin, openclaw.outcome, openclaw.harness.phase sugli errori)

Exec

  • openclaw.exec.duration_ms (histogram, attr: openclaw.exec.target, openclaw.exec.mode, openclaw.outcome, openclaw.failureKind)

Interni della diagnostica (memoria e loop strumenti)

  • openclaw.memory.heap_used_bytes (histogram, attr: openclaw.memory.kind)
  • openclaw.memory.rss_bytes (histogram)
  • openclaw.memory.pressure (counter, attr: openclaw.memory.level)
  • openclaw.tool.loop.iterations (counter, attr: openclaw.toolName, openclaw.outcome)
  • openclaw.tool.loop.duration_ms (histogram, attr: openclaw.toolName, openclaw.outcome)

Span esportati

  • 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 attivano le semantic conventions 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 attivano le semantic conventions GenAI più recenti
    • gen_ai.request.model, gen_ai.operation.name, openclaw.provider, openclaw.model, openclaw.api, openclaw.transport
    • openclaw.provider.request_id_hash (hash limitato basato su SHA dell’ID richiesta del provider upstream; gli ID grezzi non vengono esportati)
  • 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, facoltativamente 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.chatId
  • openclaw.webhook.error
    • openclaw.channel, openclaw.webhook, openclaw.chatId, openclaw.error
  • openclaw.message.processed
    • openclaw.channel, openclaw.outcome, openclaw.chatId, openclaw.messageId, 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 del 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 è esplicitamente abilitata, gli span di modello e strumenti possono anche includere attributi openclaw.content.* limitati e redatti per le specifiche classi di contenuto che hai scelto.

Catalogo degli eventi diagnostici

Gli eventi seguenti alimentano le metriche e gli span sopra. I Plugin possono anche sottoscriversi direttamente a questi eventi senza esportazione OTLP. Uso 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 del prompt/contesto e può essere inferiore a usage.total del provider quando sono coinvolti input in cache o chiamate del loop degli strumenti.
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.stuck
  • run.attempt
  • 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 agente. Include harnessId, facoltativamente pluginId, provider/modello/canale e ID esecuzione. Il completamento aggiunge durationMs, outcome, facoltativamente resultClassification, yieldDetected e conteggi itemLifecycle. Gli errori aggiungono phase (prepare/start/send/resolve/cleanup), errorCategory e facoltativamente cleanupFailed.
Exec
  • exec.process.completed — esito terminale, durata, target, modalità, exit code e tipo di errore. Il testo del comando e le directory di lavoro non sono inclusi.

Senza un exporter

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 maiuscole/minuscole e supportano wildcard (ad esempio 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 nel 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