OpenClaw exporte les diagnostics via le Plugin officiel diagnostics-otel
en utilisant OTLP/HTTP (protobuf). Les journaux peuvent aussi être écrits sous forme de JSONL stdout pour
les pipelines de journaux de conteneurs et de sandbox. Tout collecteur ou backend qui accepte
OTLP/HTTP fonctionne sans modification du code. Pour les journaux de fichiers locaux et la façon de les lire,
consultez Journalisation.
Fonctionnement global
- Les événements de diagnostic sont des enregistrements structurés, en processus, émis par le
Gateway et les plugins intégrés pour les exécutions de modèles, le flux de messages, les sessions, les files d’attente,
et l’exécution.
- Le Plugin
diagnostics-otel s’abonne à ces événements et les exporte sous forme de
métriques, traces et journaux OpenTelemetry via OTLP/HTTP. Il peut
aussi recopier les enregistrements de journaux de diagnostic vers du JSONL stdout.
- Les appels fournisseur reçoivent un en-tête W3C
traceparent depuis le contexte
de span d’appel de modèle approuvé d’OpenClaw lorsque le transport du fournisseur accepte les
en-têtes personnalisés. Le contexte de trace émis par les Plugins n’est pas propagé.
- Les exportateurs ne s’attachent que lorsque la surface de diagnostic et le Plugin sont tous deux
activés, de sorte que le coût en processus reste proche de zéro par défaut.
Démarrage rapide
Pour les installations empaquetées, installez d’abord le 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,
},
},
}
Vous pouvez aussi activer le Plugin depuis la CLI :
openclaw plugins enable diagnostics-otel
protocol ne prend actuellement en charge que http/protobuf. grpc est ignoré.
Signaux exportés
| Signal | Contenu |
|---|
| Métriques | Compteurs et histogrammes pour l’utilisation des jetons, les coûts, la durée des exécutions, le basculement, l’utilisation des Skills, le flux de messages, les événements Talk, les voies de file d’attente, l’état/la récupération des sessions, l’exécution d’outils, les charges utiles surdimensionnées, l’exécution et la pression mémoire. |
| Traces | Spans pour l’utilisation de modèles, les appels de modèles, le cycle de vie du harnais, l’utilisation des Skills, l’exécution d’outils, l’exécution, le traitement de webhooks/messages, l’assemblage du contexte et les boucles d’outils. |
| Journaux | Enregistrements logging.file structurés exportés via OTLP ou JSONL stdout lorsque diagnostics.otel.logs est activé ; les corps de journaux sont retenus sauf si la capture de contenu est explicitement activée. |
Activez ou désactivez traces, metrics et logs indépendamment. Les traces et les métriques
sont activées par défaut lorsque diagnostics.otel.enabled vaut true. Les journaux sont désactivés par défaut et
ne sont exportés que lorsque diagnostics.otel.logs vaut explicitement true. L’exportation des journaux
utilise OTLP par défaut ; définissez diagnostics.otel.logsExporter sur stdout pour du JSONL sur
stdout, ou sur both pour envoyer chaque enregistrement de journal de diagnostic à OTLP et à stdout.
Référence de configuration
{
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,
},
},
},
}
Variables d’environnement
| Variable | Objectif |
|---|
OTEL_EXPORTER_OTLP_ENDPOINT | Remplace diagnostics.otel.endpoint. Si la valeur contient déjà /v1/traces, /v1/metrics ou /v1/logs, elle est utilisée telle quelle. |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_METRICS_ENDPOINT / OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | Remplacements d’endpoints propres à chaque signal, utilisés lorsque la clé de configuration diagnostics.otel.*Endpoint correspondante n’est pas définie. La configuration propre au signal l’emporte sur l’env propre au signal, qui l’emporte sur l’endpoint partagé. |
OTEL_SERVICE_NAME | Remplace diagnostics.otel.serviceName. |
OTEL_EXPORTER_OTLP_PROTOCOL | Remplace le protocole filaire (seul http/protobuf est honoré aujourd’hui). |
OTEL_SEMCONV_STABILITY_OPT_IN | Définissez sur gen_ai_latest_experimental pour émettre la dernière forme expérimentale des spans d’inférence GenAI, notamment les noms de span {gen_ai.operation.name} {gen_ai.request.model}, le type de span CLIENT et gen_ai.provider.name au lieu de l’ancien gen_ai.system. Les métriques GenAI utilisent toujours des attributs sémantiques bornés et à faible cardinalité. |
OPENCLAW_OTEL_PRELOADED | Définissez sur 1 lorsqu’un autre préchargement ou processus hôte a déjà enregistré le SDK OpenTelemetry global. Le Plugin ignore alors son propre cycle de vie NodeSDK, mais câble toujours les écouteurs de diagnostic et respecte traces/metrics/logs. |
Confidentialité et capture de contenu
Le contenu brut des modèles/outils n’est pas exporté par défaut. Les spans transportent des
identifiants bornés (canal, fournisseur, modèle, catégorie d’erreur, identifiants de requête uniquement sous forme de hachage,
source de l’outil, propriétaire de l’outil et nom/source de Skill) et n’incluent jamais le texte du prompt,
le texte de réponse, les entrées d’outil, les sorties d’outil, les chemins de fichiers de Skills ni les clés de session.
Par défaut, les enregistrements de journaux OTLP conservent la sévérité, le logger, l’emplacement du code, le contexte de trace approuvé
et des attributs assainis, mais le corps brut du message de journal n’est exporté
que lorsque diagnostics.otel.captureContent est défini sur le booléen true. Les sous-clés granulaires
captureContent.* n’activent pas les corps de journaux. Les libellés qui ressemblent à des
clés de session d’agent avec portée sont remplacés par unknown.
Les métriques Talk n’exportent que des métadonnées d’événement bornées telles que le mode, le transport,
le fournisseur et le type d’événement. Elles n’incluent pas les transcriptions, les charges utiles audio,
les identifiants de session, de tour, d’appel ou de salon, ni les jetons de transfert.
Les requêtes de modèle sortantes peuvent inclure un en-tête W3C traceparent. Cet en-tête est
généré uniquement à partir du contexte de trace de diagnostic détenu par OpenClaw pour l’appel de modèle
actif. Les en-têtes traceparent existants fournis par l’appelant sont remplacés, de sorte que les Plugins ou
options de fournisseur personnalisées ne peuvent pas falsifier l’ascendance de trace interservices.
Définissez diagnostics.otel.captureContent.* sur true uniquement lorsque votre collecteur et
votre politique de rétention sont approuvés pour le texte de prompt, de réponse, d’outil ou de prompt système.
Chaque sous-clé est activée indépendamment :
inputMessages - contenu du prompt utilisateur.
outputMessages - contenu de la réponse du modèle.
toolInputs - charges utiles des arguments d’outil.
toolOutputs - charges utiles des résultats d’outil.
systemPrompt - prompt système/développeur assemblé.
toolDefinitions - noms, descriptions et schémas des outils de modèle.
Lorsqu’une sous-clé est activée, les spans de modèle et d’outil reçoivent des attributs
openclaw.content.* bornés et expurgés uniquement pour cette classe. Utilisez le booléen
captureContent: true seulement pour des captures de diagnostic larges où les corps des messages de journaux OTLP
sont également approuvés pour l’exportation.
Le contenu toolInputs/toolOutputs est capturé pour les exécutions d’outils du runtime d’agent
intégré (openclaw.content.tool_input sur les spans terminés/en erreur,
openclaw.content.tool_output sur les spans terminés). Les appels d’outils de harnais externes
(Codex, Claude CLI) émettent des spans tool.execution.* sans charges utiles de contenu.
Le contenu capturé transite sur un canal approuvé réservé aux écouteurs et n’est jamais placé
sur le bus public d’événements de diagnostic.
Échantillonnage et vidage
-
Traces :
diagnostics.otel.sampleRate (span racine uniquement, 0.0 supprime tout,
1.0 conserve tout).
-
openclaw.model.usage
openclaw.channel, openclaw.provider, openclaw.model
openclaw.tokens.* (input/output/cache_read/cache_write/total)
gen_ai.system par défaut, ou gen_ai.provider.name lorsque les dernières conventions sémantiques GenAI sont activées
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 par défaut, ou gen_ai.provider.name lorsque les dernières conventions sémantiques GenAI sont activées
gen_ai.request.model, gen_ai.operation.name, openclaw.provider, openclaw.model, openclaw.api, openclaw.transport
openclaw.errorCategory et openclaw.failureKind facultatif en cas d’erreur
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 (uniquement des tailles de composants sûres, aucun texte de prompt)
openclaw.model_call.usage.* et gen_ai.usage.* lorsque le résultat d’appel au modèle contient l’utilisation du fournisseur pour cet appel individuel
openclaw.provider.request_id_hash (hachage borné basé sur SHA de l’identifiant de requête du fournisseur amont ; les identifiants bruts ne sont pas exportés)
- Avec
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental, les spans d’appel au modèle utilisent le dernier nom de span d’inférence GenAI {gen_ai.operation.name} {gen_ai.request.model} et le type de span CLIENT au lieu de openclaw.model.call.
-
openclaw.harness.run
openclaw.harness.id, openclaw.harness.plugin, openclaw.outcome, openclaw.provider, openclaw.model, openclaw.channel
- À la fin :
openclaw.harness.result_classification, openclaw.harness.yield_detected, openclaw.harness.items.started, openclaw.harness.items.completed, openclaw.harness.items.active
- En cas d’erreur :
openclaw.harness.phase, openclaw.errorCategory, openclaw.harness.cleanup_failed facultatif
-
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 (aucun contenu de prompt, d’historique, de réponse ou de clé de session)
-
openclaw.tool.loop
openclaw.toolName, openclaw.outcome, openclaw.iterations, openclaw.errorCategory (aucun message de boucle, paramètre ou résultat d’outil)
-
openclaw.memory.pressure
openclaw.memory.level, openclaw.memory.heap_used_bytes, openclaw.memory.rss_bytes
Lorsque la capture de contenu est explicitement activée, les spans de modèle et d’outil peuvent aussi
inclure des attributs openclaw.content.* bornés et expurgés pour les classes de
contenu spécifiques que vous avez activées.
Catalogue des événements de diagnostic
Les événements ci-dessous alimentent les métriques et spans ci-dessus. Les plugins peuvent également s’y abonner
directement sans export OTLP.
Utilisation du modèle
model.usage - jetons, coût, durée, contexte, fournisseur/modèle/canal,
identifiants de session. usage correspond à la comptabilisation fournisseur/tour pour le coût et la télémétrie ;
context.used est l’instantané actuel du prompt/contexte et peut être inférieur à
usage.total du fournisseur lorsque des entrées mises en cache ou des appels de boucle d’outils sont impliqués.
Flux des messages
webhook.received / webhook.processed / webhook.error
message.queued / message.processed
message.delivery.started / message.delivery.completed / message.delivery.error
File d’attente et session
queue.lane.enqueue / queue.lane.dequeue
session.state / session.long_running / session.stalled / session.stuck
run.attempt / run.progress
diagnostic.heartbeat (compteurs agrégés : webhooks/file d’attente/session)
Cycle de vie du harnais
harness.run.started / harness.run.completed / harness.run.error -
cycle de vie par exécution pour le harnais d’agent. Inclut harnessId, pluginId
facultatif, fournisseur/modèle/canal et identifiant d’exécution. La fin ajoute
durationMs, outcome, resultClassification facultatif, yieldDetected
et les nombres itemLifecycle. Les erreurs ajoutent phase
(prepare/start/send/resolve/cleanup), errorCategory et
cleanupFailed facultatif.
Exec
exec.process.completed - résultat terminal, durée, cible, mode, code de
sortie et type d’échec. Le texte de la commande et les répertoires de travail ne sont pas
inclus.
exec.approval.followup_suppressed - suivi d’approbation obsolète abandonné après
un rebond de session. Inclut approvalId, reason (session_rebound),
phase (direct_delivery ou gateway_preflight) et l’horodatage du répartiteur.
Les clés de session, les routes et le texte de commande ne sont pas inclus.
Sans exportateur
Vous pouvez conserver les événements de diagnostic disponibles pour les plugins ou les récepteurs personnalisés sans
exécuter diagnostics-otel :
{
diagnostics: { enabled: true },
}
Pour une sortie de débogage ciblée sans augmenter logging.level, utilisez les indicateurs de diagnostic.
Les indicateurs ne sont pas sensibles à la casse et prennent en charge les jokers (par exemple telegram.* ou
*) :
{
diagnostics: { flags: ["telegram.http"] },
}
Ou comme remplacement d’environnement ponctuel :
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload openclaw gateway
La sortie des indicateurs va dans le fichier journal standard (logging.file) et reste
expurgée par logging.redactSensitive. Guide complet :
Indicateurs de diagnostic.
Désactiver
{
diagnostics: { otel: { enabled: false } },
}
Vous pouvez également exclure diagnostics-otel de plugins.allow, ou exécuter
openclaw plugins disable diagnostics-otel.
Associé