Gateway
Esportazione OpenTelemetry
OmeniaClaw esporta diagnostica tramite il Plugin ufficiale diagnostics-otel
usando OTLP/HTTP (protobuf). Qualsiasi collector o backend che accetti OTLP/HTTP
funziona senza modifiche al codice. Per i log su file locali e come leggerli, consulta
Logging.
Come funziona l'insieme
- Gli eventi di diagnostica sono record strutturati in-process emessi dal Gateway e dai plugin inclusi per esecuzioni del modello, flusso dei messaggi, sessioni, code ed exec.
- Il Plugin
diagnostics-otelsottoscrive questi eventi e li esporta come metriche, tracce e log OpenTelemetry tramite OTLP/HTTP. - Le chiamate ai provider ricevono un'intestazione W3C
traceparentdal contesto dello span affidabile della chiamata al modello di OmeniaClaw quando il trasporto del provider accetta intestazioni personalizzate. Il contesto di traccia emesso dai plugin non viene propagato. - Gli exporter vengono collegati solo quando sia la superficie di diagnostica sia il Plugin sono abilitati, quindi il costo in-process resta quasi nullo per impostazione predefinita.
Avvio rapido
Per le installazioni pacchettizzate, installa prima il Plugin:
OmeniaClaw plugins install clawhub:@OmeniaClaw/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: "OmeniaClaw-gateway", traces: true, metrics: true, logs: true, sampleRate: 0.2, flushIntervalMs: 60000, }, },}Puoi abilitare il Plugin anche dalla CLI:
OmeniaClaw plugins enable diagnostics-otelSegnali esportati
| Segnale | Cosa contiene |
|---|---|
| Metriche | Counter e istogrammi per uso dei token, costo, durata delle esecuzioni, flusso dei messaggi, eventi Talk, corsie delle code, stato/ripristino delle sessioni, exec e pressione sulla memoria. |
| Tracce | Span per uso del modello, chiamate al modello, ciclo di vita dell'harness, esecuzione degli strumenti, exec, elaborazione di webhook/messaggi, assemblaggio del contesto e cicli degli strumenti. |
| Log | Record strutturati logging.file esportati tramite OTLP quando diagnostics.otel.logs è abilitato. |
Attiva o disattiva traces, metrics e logs in modo indipendente. Tutti e tre sono attivi per impostazione predefinita
quando diagnostics.otel.enabled è true.
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: "OmeniaClaw-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, }, }, },}Variabili d'ambiente
| Variabile | Scopo |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT |
Sostituisce 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 prevale sull'env specifico per segnale, che prevale sull'endpoint condiviso. |
OTEL_SERVICE_NAME |
Sostituisce diagnostics.otel.serviceName. |
OTEL_EXPORTER_OTLP_PROTOCOL |
Sostituisce il protocollo di trasmissione (oggi viene rispettato solo http/protobuf). |
OTEL_SEMCONV_STABILITY_OPT_IN |
Imposta a gen_ai_latest_experimental per emettere l'attributo span GenAI sperimentale più recente (gen_ai.provider.name) invece del legacy gen_ai.system. Le metriche GenAI usano sempre attributi semantici limitati e a bassa cardinalità. |
OmeniaClaw_OTEL_PRELOADED |
Imposta a 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 acquisizione dei contenuti
Il contenuto raw di modelli/strumenti non viene esportato per impostazione predefinita. Gli span contengono identificatori limitati (canale, provider, modello, categoria di errore, ID richiesta solo come hash) e non includono mai testo del prompt, testo della risposta, input degli strumenti, output degli strumenti o chiavi di sessione. 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 ai modelli possono includere un'intestazione W3C traceparent. Tale intestazione viene
generata solo dal contesto di traccia diagnostica di proprietà di OmeniaClaw per la chiamata al modello
attiva. Le intestazioni traceparent fornite dal chiamante esistenti vengono sostituite, quindi plugin o
opzioni provider personalizzate non possono falsificare l'ascendenza di traccia cross-service.
Imposta diagnostics.otel.captureContent.* su true solo quando il tuo collector e
la policy di retention 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 system/developer assemblato.
Quando una sottochiave è abilitata, gli span di modello e strumento ricevono attributi
OmeniaClaw.content.* limitati e redatti solo per quella classe.
Campionamento e flush
- Tracce:
diagnostics.otel.sampleRate(solo root-span,0.0scarta tutto,1.0conserva tutto). - Metriche:
diagnostics.otel.flushIntervalMs(minimo1000). - Log: i log OTLP rispettano
logging.level(livello dei log su file). Usano il percorso di redazione dei record di log diagnostici, non la formattazione console. Le installazioni ad alto volume dovrebbero preferire campionamento/filtro del collector OTLP rispetto al campionamento locale. - Correlazione dei log su file: i log file JSONL includono
traceId,spanId,parentSpanIdetraceFlagsal livello superiore quando la chiamata di log contiene un contesto di traccia diagnostica valido, permettendo ai processori di log di unire righe di log locali con span esportati. - Correlazione delle richieste: le richieste HTTP del Gateway e i frame WebSocket creano uno
scope di traccia richiesta interno. Log ed eventi diagnostici dentro tale scope
ereditano per impostazione predefinita la traccia richiesta, mentre gli span di esecuzione agente e chiamata al modello vengono
creati come figli, così le intestazioni
traceparentdel provider restano sulla stessa traccia.
Metriche esportate
Uso del modello
OmeniaClaw.tokens(counter, attrs:OmeniaClaw.token,OmeniaClaw.channel,OmeniaClaw.provider,OmeniaClaw.model,OmeniaClaw.agent)OmeniaClaw.cost.usd(counter, attrs:OmeniaClaw.channel,OmeniaClaw.provider,OmeniaClaw.model)OmeniaClaw.run.duration_ms(histogram, attrs:OmeniaClaw.channel,OmeniaClaw.provider,OmeniaClaw.model)OmeniaClaw.context.tokens(histogram, attrs:OmeniaClaw.context,OmeniaClaw.channel,OmeniaClaw.provider,OmeniaClaw.model)gen_ai.client.token.usage(histogram, metrica delle convenzioni semantiche GenAI, 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, secondi, metrica delle convenzioni semantiche GenAI, attrs:gen_ai.provider.name,gen_ai.operation.name,gen_ai.request.model,error.typeopzionale)OmeniaClaw.model_call.duration_ms(histogram, attrs:OmeniaClaw.provider,OmeniaClaw.model,OmeniaClaw.api,OmeniaClaw.transport, piùOmeniaClaw.errorCategoryeOmeniaClaw.failureKindsugli errori classificati)OmeniaClaw.model_call.request_bytes(histogram, dimensione in byte UTF-8 del payload finale della richiesta al modello; nessun contenuto raw del payload)OmeniaClaw.model_call.response_bytes(histogram, dimensione in byte UTF-8 degli eventi di risposta del modello in streaming; nessun contenuto raw della risposta)OmeniaClaw.model_call.time_to_first_byte_ms(histogram, tempo trascorso prima del primo evento di risposta in streaming)
Flusso dei messaggi
OmeniaClaw.webhook.received(counter, attrs:OmeniaClaw.channel,OmeniaClaw.webhook)OmeniaClaw.webhook.error(counter, attrs:OmeniaClaw.channel,OmeniaClaw.webhook)OmeniaClaw.webhook.duration_ms(histogram, attrs:OmeniaClaw.channel,OmeniaClaw.webhook)OmeniaClaw.message.queued(counter, attrs:OmeniaClaw.channel,OmeniaClaw.source)OmeniaClaw.message.processed(counter, attrs:OmeniaClaw.channel,OmeniaClaw.outcome)OmeniaClaw.message.duration_ms(histogram, attrs:OmeniaClaw.channel,OmeniaClaw.outcome)OmeniaClaw.message.delivery.started(counter, attrs:OmeniaClaw.channel,OmeniaClaw.delivery.kind)OmeniaClaw.message.delivery.duration_ms(histogram, attrs:OmeniaClaw.channel,OmeniaClaw.delivery.kind,OmeniaClaw.outcome,OmeniaClaw.errorCategory)
Talk
OmeniaClaw.talk.event(counter, attrs:OmeniaClaw.talk.event_type,OmeniaClaw.talk.mode,OmeniaClaw.talk.transport,OmeniaClaw.talk.brain,OmeniaClaw.talk.provider)OmeniaClaw.talk.event.duration_ms(histogram, attrs: uguali aOmeniaClaw.talk.event; emessa quando un evento Talk riporta una durata)OmeniaClaw.talk.audio.bytes(histogram, attrs: uguali aOmeniaClaw.talk.event; emessa per eventi frame audio Talk che riportano la lunghezza in byte)
Code e sessioni
OmeniaClaw.queue.lane.enqueue(contatore, attr:OmeniaClaw.lane)OmeniaClaw.queue.lane.dequeue(contatore, attr:OmeniaClaw.lane)OmeniaClaw.queue.depth(istogramma, attr:OmeniaClaw.laneoOmeniaClaw.channel=heartbeat)OmeniaClaw.queue.wait_ms(istogramma, attr:OmeniaClaw.lane)OmeniaClaw.session.state(contatore, attr:OmeniaClaw.state,OmeniaClaw.reason)OmeniaClaw.session.stuck(contatore, attr:OmeniaClaw.state; emesso solo per la contabilità di sessioni obsolete senza lavoro attivo)OmeniaClaw.session.stuck_age_ms(istogramma, attr:OmeniaClaw.state; emesso solo per la contabilità di sessioni obsolete senza lavoro attivo)OmeniaClaw.session.recovery.requested(contatore, attr:OmeniaClaw.state,OmeniaClaw.action,OmeniaClaw.active_work_kind,OmeniaClaw.reason)OmeniaClaw.session.recovery.completed(contatore, attr:OmeniaClaw.state,OmeniaClaw.action,OmeniaClaw.status,OmeniaClaw.active_work_kind,OmeniaClaw.reason)OmeniaClaw.session.recovery.age_ms(istogramma, attr: gli stessi del contatore di ripristino corrispondente)OmeniaClaw.run.attempt(contatore, attr:OmeniaClaw.attempt)
Telemetria di vitalità della sessione
diagnostics.stuckSessionWarnMs è la soglia di età senza avanzamento per la diagnostica di vitalità della sessione. Una sessione processing non invecchia verso questa soglia mentre OmeniaClaw osserva avanzamento a runtime di risposta, strumento, stato, blocco o ACP. I keepalive di digitazione non sono conteggiati come avanzamento, quindi un modello o un harness silenzioso può comunque essere rilevato.
OmeniaClaw classifica le sessioni in base al lavoro che può ancora osservare:
session.long_running: lavoro incorporato attivo, chiamate al modello o chiamate agli strumenti stanno ancora avanzando.session.stalled: esiste lavoro attivo, ma l'esecuzione attiva non ha segnalato avanzamenti recenti. Le esecuzioni incorporate bloccate restano inizialmente in sola osservazione, poi passano ad abort-drain dopodiagnostics.stuckSessionAbortMssenza avanzamento, così i turni in coda dietro la lane possono riprendere. Se non impostata, la soglia di interruzione usa come valore predefinito la finestra estesa più sicura di almeno 10 minuti e 5 voltediagnostics.stuckSessionWarnMs.session.stuck: contabilità di sessione obsoleta senza lavoro attivo. Questo rilascia immediatamente la lane della sessione interessata.
Il ripristino emette eventi strutturati session.recovery.requested e session.recovery.completed. Lo stato diagnostico della sessione viene marcato come inattivo solo dopo un esito di ripristino mutante (aborted o released) e solo se la stessa generazione di elaborazione è ancora corrente.
Solo session.stuck emette il contatore OmeniaClaw.session.stuck, l'istogramma OmeniaClaw.session.stuck_age_ms e lo span OmeniaClaw.session.stuck. Le diagnostiche session.stuck ripetute applicano un backoff mentre la sessione resta invariata, quindi le dashboard dovrebbero avvisare su aumenti sostenuti anziché su ogni tick di Heartbeat. Per la manopola di configurazione e i valori predefiniti, vedere il Riferimento di configurazione.
Ciclo di vita dell'harness
OmeniaClaw.harness.duration_ms(istogramma, attr:OmeniaClaw.harness.id,OmeniaClaw.harness.plugin,OmeniaClaw.outcome,OmeniaClaw.harness.phasesugli errori)
Exec
OmeniaClaw.exec.duration_ms(istogramma, attr:OmeniaClaw.exec.target,OmeniaClaw.exec.mode,OmeniaClaw.outcome,OmeniaClaw.failureKind)
Interni di diagnostica (memoria e loop degli strumenti)
OmeniaClaw.memory.heap_used_bytes(istogramma, attr:OmeniaClaw.memory.kind)OmeniaClaw.memory.rss_bytes(istogramma)OmeniaClaw.memory.pressure(contatore, attr:OmeniaClaw.memory.level)OmeniaClaw.tool.loop.iterations(contatore, attr:OmeniaClaw.toolName,OmeniaClaw.outcome)OmeniaClaw.tool.loop.duration_ms(istogramma, attr:OmeniaClaw.toolName,OmeniaClaw.outcome)
Span esportati
OmeniaClaw.model.usageOmeniaClaw.channel,OmeniaClaw.provider,OmeniaClaw.modelOmeniaClaw.tokens.*(input/output/cache_read/cache_write/total)gen_ai.systemper impostazione predefinita, oppuregen_ai.provider.namequando vengono abilitate le convenzioni semantiche GenAI più recentigen_ai.request.model,gen_ai.operation.name,gen_ai.usage.*
OmeniaClaw.runOmeniaClaw.outcome,OmeniaClaw.channel,OmeniaClaw.provider,OmeniaClaw.model,OmeniaClaw.errorCategory
OmeniaClaw.model.callgen_ai.systemper impostazione predefinita, oppuregen_ai.provider.namequando vengono abilitate le convenzioni semantiche GenAI più recentigen_ai.request.model,gen_ai.operation.name,OmeniaClaw.provider,OmeniaClaw.model,OmeniaClaw.api,OmeniaClaw.transportOmeniaClaw.errorCategoryeOmeniaClaw.failureKindopzionale sugli erroriOmeniaClaw.model_call.request_bytes,OmeniaClaw.model_call.response_bytes,OmeniaClaw.model_call.time_to_first_byte_msOmeniaClaw.provider.request_id_hash(hash limitato basato su SHA dell'id richiesta del provider upstream; gli id grezzi non vengono esportati)
OmeniaClaw.harness.runOmeniaClaw.harness.id,OmeniaClaw.harness.plugin,OmeniaClaw.outcome,OmeniaClaw.provider,OmeniaClaw.model,OmeniaClaw.channel- Al completamento:
OmeniaClaw.harness.result_classification,OmeniaClaw.harness.yield_detected,OmeniaClaw.harness.items.started,OmeniaClaw.harness.items.completed,OmeniaClaw.harness.items.active - In caso di errore:
OmeniaClaw.harness.phase,OmeniaClaw.errorCategory,OmeniaClaw.harness.cleanup_failedopzionale
OmeniaClaw.tool.executiongen_ai.tool.name,OmeniaClaw.toolName,OmeniaClaw.errorCategory,OmeniaClaw.tool.params.*
OmeniaClaw.execOmeniaClaw.exec.target,OmeniaClaw.exec.mode,OmeniaClaw.outcome,OmeniaClaw.failureKind,OmeniaClaw.exec.command_length,OmeniaClaw.exec.exit_code,OmeniaClaw.exec.timed_out
OmeniaClaw.webhook.processedOmeniaClaw.channel,OmeniaClaw.webhook
OmeniaClaw.webhook.errorOmeniaClaw.channel,OmeniaClaw.webhook,OmeniaClaw.error
OmeniaClaw.message.processedOmeniaClaw.channel,OmeniaClaw.outcome,OmeniaClaw.reason
OmeniaClaw.message.deliveryOmeniaClaw.channel,OmeniaClaw.delivery.kind,OmeniaClaw.outcome,OmeniaClaw.errorCategory,OmeniaClaw.delivery.result_count
OmeniaClaw.session.stuckOmeniaClaw.state,OmeniaClaw.ageMs,OmeniaClaw.queueDepth
OmeniaClaw.context.assembledOmeniaClaw.prompt.size,OmeniaClaw.history.size,OmeniaClaw.context.tokens,OmeniaClaw.errorCategory(nessun contenuto di prompt, cronologia, risposta o chiave di sessione)
OmeniaClaw.tool.loopOmeniaClaw.toolName,OmeniaClaw.outcome,OmeniaClaw.iterations,OmeniaClaw.errorCategory(nessun messaggio di loop, parametro o output dello strumento)
OmeniaClaw.memory.pressureOmeniaClaw.memory.level,OmeniaClaw.memory.heap_used_bytes,OmeniaClaw.memory.rss_bytes
Quando la cattura dei contenuti è esplicitamente abilitata, gli span di modello e strumenti possono includere anche attributi OmeniaClaw.content.* limitati e redatti per le specifiche classi di contenuto a cui hai aderito.
Catalogo degli eventi diagnostici
Gli eventi seguenti alimentano le metriche e gli span sopra. I Plugin possono anche sottoscriverli direttamente senza esportazione OTLP.
Utilizzo del modello
model.usage- token, costo, durata, contesto, provider/modello/canale, id di sessione.usageè la contabilità provider/turno per costo e telemetria;context.usedè lo snapshot corrente di prompt/contesto e può essere inferiore ausage.totaldel provider quando sono coinvolti input memorizzati nella cache o chiamate del loop degli strumenti.
Flusso dei messaggi
webhook.received/webhook.processed/webhook.errormessage.queued/message.processedmessage.delivery.started/message.delivery.completed/message.delivery.error
Coda e sessione
queue.lane.enqueue/queue.lane.dequeuesession.state/session.long_running/session.stalled/session.stuckrun.attempt/run.progressdiagnostic.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. IncludeharnessId,pluginIdopzionale, provider/modello/canale e id esecuzione. Il completamento aggiungedurationMs,outcome,resultClassificationopzionale,yieldDetectede conteggiitemLifecycle. Gli errori aggiungonophase(prepare/start/send/resolve/cleanup),errorCategoryecleanupFailedopzionale.
Exec
exec.process.completed- esito del terminale, durata, target, modalità, codice di uscita 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 di diagnostica. I flag non distinguono tra maiuscole e minuscole e supportano i caratteri jolly (ad esempio telegram.* o *):
{ diagnostics: { flags: ["telegram.http"] },}Oppure come override env una tantum:
OmeniaClaw_DIAGNOSTICS=telegram.http,telegram.payload OmeniaClaw gatewayL'output dei flag va al file di log standard (logging.file) ed è comunque redatto da logging.redactSensitive. Guida completa:
Flag di diagnostica.
Disabilitare
{ diagnostics: { otel: { enabled: false } },}Puoi anche lasciare diagnostics-otel fuori da plugins.allow, oppure eseguire OmeniaClaw plugins disable diagnostics-otel.
Correlati
- Logging - log su file, output console, tailing della CLI e scheda Log della Control UI
- Interni di logging del Gateway - stili dei log WS, prefissi dei sottosistemi e cattura della console
- Flag di diagnostica - flag mirati per log di debug
- Esportazione diagnostica - strumento per bundle di supporto operatore (separato dall'esportazione OTEL)
- Riferimento di configurazione - riferimento completo dei campi
diagnostics.*