Démarrage rapide
Configurez OpenTelemetry à l’aide de variables d’environnement :Les intervalles d’export par défaut sont de 60 secondes pour les métriques et de 5 secondes pour les journaux. Lors de la configuration, vous pouvez utiliser des intervalles plus courts à des fins de débogage. N’oubliez pas de les réinitialiser pour une utilisation en production.
Configuration de l’administrateur
Les administrateurs peuvent configurer les paramètres OpenTelemetry pour tous les utilisateurs via le fichier de paramètres gérés. Cela permet un contrôle centralisé des paramètres de télémétrie dans toute une organisation. Consultez la précédence des paramètres pour plus d’informations sur la façon dont les paramètres sont appliqués. Exemple de configuration des paramètres gérés :Les paramètres gérés peuvent être distribués via MDM (Mobile Device Management) ou d’autres solutions de gestion d’appareils. Les variables d’environnement définies dans le fichier de paramètres gérés ont une haute priorité et ne peuvent pas être remplacées par les utilisateurs.
OTEL_* aux sous-processus qu’il génère, y compris l’outil Bash, les hooks, les serveurs MCP et les serveurs de langage. Une application instrumentée par OpenTelemetry que vous exécutez via l’outil Bash n’hérite pas du point de terminaison de l’exportateur ou des en-têtes de Claude Code, donc définissez ces variables directement dans la commande si cette application doit exporter sa propre télémétrie.
Détails de la configuration
Variables de configuration courantes
Authentification mTLS
La façon dont vous configurez les certificats clients pour l’exportateur OTLP dépend du protocole OTLP utilisé pour ce signal, défini viaOTEL_EXPORTER_OTLP_PROTOCOL ou le remplacement par signal. La même configuration s’applique aux métriques, journaux et traces.
Pour
grpc, le SDK OpenTelemetry lit les variables OTLP standard directement, donc les configurations existantes qui définissent les variables de métriques par signal continuent de fonctionner.
Contrôle de la cardinalité des métriques
Les variables d’environnement suivantes contrôlent les attributs inclus dans les métriques pour gérer la cardinalité :
Ces variables aident à contrôler la cardinalité des métriques, ce qui affecte les exigences de stockage et les performances des requêtes dans votre backend de métriques. Une cardinalité plus faible signifie généralement de meilleures performances et des coûts de stockage plus bas, mais des données moins granulaires pour l’analyse.
Traces (bêta)
Le traçage distribué exporte des intervalles qui lient chaque invite utilisateur aux demandes d’API et aux exécutions d’outils qu’elle déclenche, afin que vous puissiez afficher une demande complète sous forme de trace unique dans votre backend de traçage. Le traçage est désactivé par défaut. Pour l’activer, définissez à la foisCLAUDE_CODE_ENABLE_TELEMETRY=1 et CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1, puis définissez OTEL_TRACES_EXPORTER pour choisir où les intervalles sont envoyés. Les traces réutilisent la configuration OTLP courante pour le point de terminaison, le protocole, les en-têtes et mTLS.
Les intervalles masquent le texte de l’invite utilisateur, les détails d’entrée d’outil et le contenu d’outil par défaut. Définissez
OTEL_LOG_USER_PROMPTS=1, OTEL_LOG_TOOL_DETAILS=1 et OTEL_LOG_TOOL_CONTENT=1 pour les inclure.
Lorsque le traçage est actif, les sous-processus Bash et PowerShell héritent automatiquement d’une variable d’environnement TRACEPARENT contenant le contexte de trace W3C de l’intervalle d’exécution d’outil actif. Cela permet à tout sous-processus qui lit TRACEPARENT de placer ses propres intervalles sous la même trace, permettant le traçage distribué de bout en bout via les scripts et les commandes que Claude exécute.
Lorsque le traçage est actif et que Claude Code est connecté directement à l’API Anthropic, chaque demande de modèle porte un en-tête W3C traceparent défini au contexte de l’intervalle claude_code.llm_request, et l’en-tête traceresponse de l’API est enregistré comme un lien d’intervalle. Ensemble, ceux-ci connectent les intervalles côté client de Claude Code à la trace côté serveur via tout intermédiaire conforme. Les demandes HTTP MCP sortantes portent traceparent de la même manière. L’en-tête n’est pas envoyé aux fournisseurs tiers.
Par défaut, l’en-tête traceparent sur les demandes de modèle et MCP HTTP est envoyé uniquement lorsque ANTHROPIC_BASE_URL n’est pas défini ou pointe vers l’API Anthropic, car certains proxies rejettent les en-têtes non reconnus. La variable TRACEPARENT du sous-processus est contrôlée par le même commutateur pour la cohérence. Si vous exécutez Claude Code via un proxy ANTHROPIC_BASE_URL personnalisé et souhaitez que le contexte de trace soit propagé, définissez CLAUDE_CODE_PROPAGATE_TRACEPARENT=1.
Dans le SDK Agent et les sessions non interactives démarrées avec -p, Claude Code lit également TRACEPARENT et TRACESTATE de son propre environnement au démarrage de chaque intervalle d’interaction. Cela permet à un processus d’intégration de transmettre son contexte de trace W3C actif au sous-processus afin que les intervalles de Claude Code apparaissent comme des enfants de la trace distribuée de l’appelant. Les sessions interactives ignorent TRACEPARENT entrant pour éviter d’hériter accidentellement des valeurs ambiantes des environnements CI ou conteneur.
Hiérarchie des intervalles
Chaque invite utilisateur démarre un intervalle racineclaude_code.interaction. Les appels d’API, les appels d’outils et les exécutions de hooks sont enregistrés comme ses enfants. Les intervalles d’outils ont deux intervalles enfants : un pour le temps passé à attendre une décision de permission et un pour l’exécution elle-même. Lorsque l’outil Agent ou l’outil Task hérité génère un sous-agent, les intervalles d’API et d’outils du sous-agent se placent sous l’intervalle claude_code.tool du parent.
claude -p, claude_code.interaction lui-même devient un enfant de l’intervalle de l’appelant lorsque TRACEPARENT est défini dans l’environnement.
Attributs des intervalles
Chaque intervalle porte les attributs standard plus un attributspan.type correspondant à son nom. Les tableaux ci-dessous listent les attributs supplémentaires définis sur chaque intervalle. Les intervalles llm_request, tool.execution et hook définissent le statut OpenTelemetry ERROR lorsqu’ils enregistrent un échec ; les autres intervalles se terminent toujours avec le statut UNSET.
claude_code.interaction
claude_code.llm_request
Chaque tentative de nouvelle tentative est également enregistrée comme un événement d’intervalle
gen_ai.request.attempt avec les attributs attempt et client_request_id.
claude_code.tool
Lorsque
OTEL_LOG_TOOL_CONTENT=1, cet intervalle enregistre également un événement d’intervalle tool.output dont les attributs contiennent les corps d’entrée et de sortie de l’outil, tronqués à 60 Ko par attribut.
claude_code.tool.blocked_on_user
claude_code.tool.execution
claude_code.hook
Cet intervalle est émis uniquement lorsque le traçage bêta détaillé est actif, ce qui nécessite ENABLE_BETA_TRACING_DETAILED=1 et BETA_TRACING_ENDPOINT en plus de la configuration de l’exportateur de trace ci-dessus. Dans les sessions CLI interactives, cela nécessite également que votre organisation soit sur liste blanche pour la fonctionnalité. Les sessions du SDK Agent et non interactives -p ne sont pas contrôlées. Il n’est pas émis lorsque seul CLAUDE_CODE_ENHANCED_TELEMETRY_BETA est défini.
Les attributs supplémentaires porteurs de contenu tels que
new_context, system_prompt_preview, user_system_prompt, tool_input et response.model_output sont émis uniquement lorsque le traçage bêta détaillé est actif. Ils ne font pas partie du schéma d’intervalle stable. user_system_prompt nécessite également OTEL_LOG_USER_PROMPTS=1. Il porte uniquement le texte du prompt système que vous fournissez via l’option SDK systemPrompt ou les drapeaux --system-prompt et --append-system-prompt, tronqué à 60 Ko, et est émis une fois par session plutôt que par demande.En-têtes dynamiques
Pour les environnements d’entreprise qui nécessitent une authentification dynamique, vous pouvez configurer un script pour générer des en-têtes dynamiquement. Les en-têtes dynamiques s’appliquent uniquement aux protocoleshttp/protobuf et http/json. L’exportateur grpc utilise uniquement la valeur statique OTEL_EXPORTER_OTLP_HEADERS.
Configuration des paramètres
Ajoutez à votre.claude/settings.json :
Exigences du script
Le script doit générer du JSON valide avec des paires clé-valeur de chaînes représentant les en-têtes HTTP :- La sortie
/status - Le journal de débogage, lors de l’exécution avec
--debugou après l’exécution de/debugdans la session - stderr, dans les sessions non interactives démarrées avec
-p
Comportement d’actualisation
Le script d’aide des en-têtes s’exécute au démarrage et périodiquement par la suite pour prendre en charge l’actualisation des jetons. Par défaut, le script s’exécute toutes les 29 minutes. Personnalisez l’intervalle avec la variable d’environnementCLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS.
Support des organisations multi-équipes
Les organisations avec plusieurs équipes ou départements peuvent ajouter des attributs personnalisés pour distinguer les différents groupes à l’aide de la variable d’environnementOTEL_RESOURCE_ATTRIBUTES :
- Filtrer les métriques par équipe ou département
- Suivre les coûts par centre de coûts
- Créer des tableaux de bord spécifiques à l’équipe
- Configurer des alertes pour des équipes spécifiques
user.id ou session.id : lorsqu’une clé entre en collision, Claude Code conserve la valeur intégrée.
Chaque clé personnalisée devient une étiquette sur chaque série de métriques, donc les valeurs de haute cardinalité augmentent le coût de stockage dans votre backend de métriques. Pour envoyer des attributs personnalisés dans le bloc de ressources uniquement et les omettre des étiquettes de point de données, définissez OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES=false. Voir Contrôle de la cardinalité des métriques.
Exemples de configurations
Définissez ces variables d’environnement avant d’exécuterclaude. Chaque bloc montre une configuration complète pour un exportateur ou un scénario de déploiement différent :
Métriques et événements disponibles
Attributs standard
Toutes les métriques et tous les événements partagent ces attributs standard :
Lorsque Claude Code est connecté à une passerelle d’applications Claude, la CLI marque les exportations avec l’identité authentifiée de la session de la passerelle :
user.id est le sujet IdP plutôt qu’un identifiant d’installation anonyme, user.email est l’e-mail connecté, et user.groups porte l’appartenance au groupe IdP sous forme de chaîne séparée par des virgules. Chaque exportation porte également identity.source: gateway-oidc. L’identité de la passerelle est appliquée en dernier, donc les clés user.* et identity.* définies via OTEL_RESOURCE_ATTRIBUTES sont ignorées sur les sessions de passerelle.
Les événements incluent en outre les attributs suivants. Ceux-ci ne sont jamais attachés aux métriques car ils causeraient une cardinalité non bornée :
prompt.id: UUID corrélant une invite utilisateur avec tous les événements suivants jusqu’à l’invite suivante. Voir Attributs de corrélation d’événements.workspace.host_paths: répertoires d’espace de travail hôte sélectionnés dans l’application de bureau, sous forme de tableau de chaînesworkflow.run_id: identifiant d’exécution, préfixéwf_, sur les événements d’API et d’outil émis par les agents qui appartiennent à une exécution d’outil Workflow. Le filtrage des événements par unworkflow.run_idreconstruit les demandes d’API et les résultats d’outil de cette exécution. L’identifiant couvre les agents que le script de flux de travail génère et tous les agents que ceux-ci génèrent à leur tour, tels que les invocations de compétences. Il correspond à l’identifiant d’exécution signalé dans le résultat de l’outil Workflow. Absent sur tous les autres événements. Nécessite Claude Code v2.1.202 ou ultérieurworkflow.name: nom du flux de travail, lemeta.namede son script, émis aux côtés deworkflow.run_id. Les noms de flux de travail intégrés apparaissent textuellement lorsque l’exécution exécute le script intégré non modifié. Les noms créés par l’utilisateur, y compris les copies modifiées de scripts intégrés, sont remplacés parcustomsauf siOTEL_LOG_TOOL_DETAILS=1est défini. Nécessite Claude Code v2.1.202 ou ultérieur
Métriques
Claude Code exporte les métriques suivantes :Détails des métriques
Chaque métrique inclut les attributs standard listés ci-dessus. Les métriques avec des attributs supplémentaires spécifiques au contexte sont notées ci-dessous.Compteur de sessions
Incrémenté au début de chaque session. Attributs :- Tous les attributs standard
start_type: Comment la session a été démarrée. L’un de"fresh","resume","continue", ou"agents_view". La valeur"agents_view"identifie le processus du tableau de bordclaude agents, une interface utilisateur locale lancée par l’utilisateur plutôt qu’une session conversationnelle. Filtrez sur cette valeur pour séparer les lancements de processus d’interface utilisateur des sessions conversationnelles dans vos tableaux de bord.
Compteur de lignes de code
Incrémenté lorsque du code est ajouté ou supprimé. Attributs :- Tous les attributs standard
type: ("added","removed")model: Identifiant du modèle pour le modèle qui a effectué la modification (par exemple, « claude-sonnet-5 »)
Compteur de demandes de tirage
Incrémenté lors de la création de demandes de tirage ou de demandes de fusion via une commande shell ou un outil MCP. Attributs :- Tous les attributs standard
Compteur de commits
Incrémenté lors de la création de commits git via Claude Code. Attributs :- Tous les attributs standard
Compteur de coûts
Incrémenté après chaque demande d’API. Attributs :- Tous les attributs standard
model: Identifiant du modèle (par exemple, « claude-sonnet-5 »)query_source: Catégorie du sous-système qui a émis la demande. L’un de"main","subagent", ou"auxiliary"speed:"fast"lorsque la demande a utilisé le mode rapide. Absent sinoneffort: Niveau d’effort appliqué à la demande :"low","medium","high","xhigh", ou"max". Absent lorsque le modèle ne supporte pas l’effort.agent.name: Type de sous-agent qui a émis la demande. Les noms d’agents intégrés et les agents des plugins de la place de marché officielle apparaissent textuellement. Les autres noms d’agents définis par l’utilisateur sont remplacés par"custom". Absent lorsque la demande n’a pas été émise par un type de sous-agent nommé.skill.name: Compétence active pour la demande, définie par l’outil Skill, une commande/, ou héritée par un sous-agent généré. Les noms de compétences intégrées, groupées, définies par l’utilisateur et de plugin de place de marché officielle apparaissent textuellement. Les noms de compétences de plugin tiers sont remplacés par"third-party". Absent lorsqu’aucune compétence n’est active.plugin.name: Plugin propriétaire lorsque la compétence active ou le sous-agent est fourni par un plugin. Les noms de plugins de place de marché officielle apparaissent textuellement. Les noms de plugins tiers sont remplacés par"third-party". Absent lorsque ni la compétence ni le sous-agent n’a de plugin propriétaire.marketplace.name: Place de marché à partir de laquelle le plugin propriétaire a été installé. Émis uniquement pour les plugins de place de marché officielle. Absent sinon.mcp_server.name: Serveur MCP dont l’outil a été exécuté dans le tour qui a produit cette demande. Les noms de serveurs intégrés, proxifiés par claude.ai et de registre officiel apparaissent textuellement. Les noms de serveurs configurés par l’utilisateur sont remplacés par"custom". Absent lorsqu’aucun outil MCP n’a été exécuté.mcp_tool.name: Outil MCP qui a été exécuté dans le tour qui a produit cette demande, avec la même rédaction quemcp_server.name. Absent lorsqu’aucun outil MCP n’a été exécuté.
Compteur de jetons
Incrémenté après chaque demande d’API. Attributs :- Tous les attributs standard
type: ("input","output","cacheRead","cacheCreation")model: Identifiant du modèle (par exemple, « claude-sonnet-5 »)query_source: Catégorie du sous-système qui a émis la demande. L’un de"main","subagent", ou"auxiliary"speed:"fast"lorsque la demande a utilisé le mode rapide. Absent sinoneffort: Niveau d’effort appliqué à la demande. Voir Compteur de coûts pour les détails.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Attribution de compétence, plugin, agent et MCP pour la demande. Voir Compteur de coûts pour les définitions et le comportement de masquage.
Compteur de décisions de l’outil d’édition de code
Incrémenté lorsque l’utilisateur accepte ou rejette l’utilisation de l’outil Edit, Write ou NotebookEdit. Attributs :- Tous les attributs standard
tool_name: Nom de l’outil ("Edit","Write","NotebookEdit")decision: Décision de l’utilisateur ("accept","reject")source: Source de la décision. L’un de"config","hook","user_permanent","user_temporary","user_abort", ou"user_reject". Voir l’Événement de décision d’outil pour savoir ce que chaque valeur signifie.language: Langage de programmation du fichier édité, tel que"TypeScript","Python","JavaScript", ou"Markdown". Retourne"unknown"pour les extensions de fichier non reconnues.
Compteur de temps actif
Suit le temps réel passé à utiliser activement Claude Code, excluant le temps d’inactivité. Cette métrique est incrémentée lors des interactions utilisateur (saisie, lecture des réponses) et lors du traitement CLI (exécution d’outils, génération de réponses IA). Attributs :- Tous les attributs standard
type:"user"pour les interactions au clavier,"cli"pour l’exécution d’outils et les réponses IA
Événements
Claude Code exporte les événements suivants via les journaux/événements OpenTelemetry (lorsqueOTEL_LOGS_EXPORTER est configuré) :
Attributs de corrélation d’événements
Lorsqu’un utilisateur soumet une invite, Claude Code peut effectuer plusieurs appels d’API et exécuter plusieurs outils. L’attributprompt.id vous permet de lier tous ces événements à l’invite unique qui les a déclenchés.
Pour tracer toute l’activité déclenchée par une invite unique, filtrez vos événements par une valeur
prompt.id spécifique. Cela retourne l’événement user_prompt, tous les événements api_request, et tous les événements tool_result qui se sont produits lors du traitement de cette invite.
prompt.id est intentionnellement exclu des métriques car chaque invite génère un ID unique, ce qui créerait un nombre toujours croissant de séries chronologiques. Utilisez-le uniquement pour l’analyse au niveau des événements et les pistes d’audit.Événement d’invite utilisateur
Enregistré lorsqu’un utilisateur soumet une invite. Nom de l’événement :claude_code.user_prompt
Attributs :
- Tous les attributs standard
event.name:"user_prompt"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionprompt_length: Longueur de l’inviteprompt: Contenu de l’invite. Masqué par défaut. DéfinissezOTEL_LOG_USER_PROMPTS=1pour l’inclurecommand_name: Nom de la commande lorsque l’invite en invoque une. Les noms de commandes intégrées et groupées tels quecompactoudebugsont émis tels quels ; les alias tels queresetémettent tels que tapés plutôt que le nom canonique. Les noms de commandes personnalisées, de plugin et MCP s’effondrent encustomoumcpsauf siOTEL_LOG_TOOL_DETAILS=1est définicommand_source: Origine de la commande lorsqu’elle est présente :builtin,custom, oumcp. Les commandes fournies par les plugins signalent commecustom
Événement de réponse d’assistant
Enregistré après chaque demande d’API qui retourne du contenu textuel du modèle. Seuls les blocs de texte de la réponse sont inclus ; les blocs de réflexion et les blocs d’utilisation d’outil sont exclus. Nécessite Claude Code v2.1.193 ou ultérieur. Nom de l’événement :claude_code.assistant_response
Attributs :
- Tous les attributs standard
event.name:"assistant_response"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionresponse_length: Longueur du texte de réponse en caractèresresponse: Texte de réponse, tronqué à 60 Ko. Masqué à<REDACTED>par défaut. DéfinissezOTEL_LOG_ASSISTANT_RESPONSES=1pour l’inclure. LorsqueOTEL_LOG_ASSISTANT_RESPONSESn’est pas défini,OTEL_LOG_USER_PROMPTSle contrôle à la place, donc définissezOTEL_LOG_ASSISTANT_RESPONSES=0pour garder les réponses masquées tandis que la journalisation des invites est activéemodel: Identifiant du modèle (par exemple, « claude-sonnet-5 »)request_id: ID de demande d’API Anthropic de l’en-têterequest-idde la réponse. Présent uniquement lorsque l’API en retourne unquery_source: Sous-système qui a émis la demande, tel que"repl_main_thread","compact", ou un nom de sous-agent
Événement de résultat d’outil
Enregistré lorsqu’un outil termine son exécution. Non émis si l’appel d’outil a été rejeté ; voir l’Événement de décision d’outil pour les rejets. Nom de l’événement :claude_code.tool_result
Attributs :
- Tous les attributs standard
event.name:"tool_result"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessiontool_name: Nom de l’outiltool_use_id: Identifiant unique pour cette invocation d’outil. Correspond autool_use_idpassé aux hooks, permettant la corrélation entre les événements OTel et les données capturées par les hooks.success:"true"ou"false"duration_ms: Temps d’exécution en millisecondeserror_type: Chaîne de catégorie d’erreur lorsque l’outil a échoué, telle que"Error:ENOENT"ou"ShellError"error(lorsqueOTEL_LOG_TOOL_DETAILS=1) : Message d’erreur complet lorsque l’outil a échouédecision_type: Toujours"accept", puisque cet événement n’est émis qu’après l’exécution de l’outil. Les appels rejetés ne produisent pas de résultat d’outildecision_source: Source de la décision de permission. L’un de"config","hook","user_permanent", ou"user_temporary". Voir l’Événement de décision d’outil pour savoir ce que chaque valeur signifie. Les sources de rejet uniquement"user_abort"et"user_reject"n’apparaissent jamais sur cet événement.tool_input_size_bytes: Taille de l’entrée d’outil sérialisée en JSON en octetstool_result_size_bytes: Taille du résultat de l’outil en octetsmcp_server_scope: Identifiant de portée du serveur MCP (pour les outils MCP)tool_parameters(lorsqueOTEL_LOG_TOOL_DETAILS=1) : Chaîne JSON contenant les paramètres spécifiques à l’outil :- Pour l’outil Bash : inclut
bash_command,full_command,timeout,description,dangerouslyDisableSandbox, etgit_commit_id(le SHA du commit, lorsqu’une commandegit commitréussit) - Pour l’outil WorkspaceBash : inclut
bash_command,full_command,timeout - Pour les outils MCP : inclut
mcp_server_name,mcp_tool_name - Pour l’outil Skill : inclut
skill_name - Pour l’outil Agent ou l’outil Task hérité : inclut
subagent_type
- Pour l’outil Bash : inclut
tool_input(lorsqueOTEL_LOG_TOOL_DETAILS=1) : Arguments d’outil sérialisés en JSON. Les valeurs individuelles dépassant 512 caractères sont tronquées, et la charge utile complète est limitée à environ 4 K caractères. S’applique à tous les outils, y compris les outils MCP.
Événement de demande d’API
Enregistré pour chaque demande d’API à Claude. Nom de l’événement :claude_code.api_request
Attributs :
- Tous les attributs standard
event.name:"api_request"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionmodel: Modèle utilisé (par exemple, « claude-sonnet-5 »)cost_usd: Coût estimé en USDduration_ms: Durée de la demande en millisecondesinput_tokens: Nombre de jetons d’entréeoutput_tokens: Nombre de jetons de sortiecache_read_tokens: Nombre de jetons lus à partir du cachecache_creation_tokens: Nombre de jetons utilisés pour la création du cacherequest_id: ID de demande d’API Anthropic de l’en-têterequest-idde la réponse, tel que"req_011...". Présent uniquement lorsque l’API en retourne un.speed:"fast"ou"normal", indiquant si le mode rapide était actifquery_source: Sous-système qui a émis la demande, tel que"repl_main_thread","compact", ou un nom de sous-agenteffort: Niveau d’effort appliqué à la demande :"low","medium","high","xhigh", ou"max". Absent lorsque le modèle ne supporte pas l’effort.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Attribution de compétence, plugin, agent et MCP pour la demande. Voir Compteur de coûts pour les définitions et le comportement de masquage.
Événement d’erreur d’API
Enregistré lorsqu’une demande d’API à Claude échoue. Nom de l’événement :claude_code.api_error
Attributs :
- Tous les attributs standard
event.name:"api_error"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionmodel: Modèle utilisé (par exemple, « claude-sonnet-5 »)error: Message d’erreurstatus_code: Code de statut HTTP sous forme de nombre. Absent pour les erreurs non-HTTP telles que les défaillances de connexion.duration_ms: Durée de la demande en millisecondesattempt: Nombre total de tentatives effectuées, y compris la demande initiale (1signifie qu’aucune nouvelle tentative ne s’est produite)request_id: ID de demande d’API Anthropic de l’en-têterequest-idde la réponse, tel que"req_011...". Présent uniquement lorsque l’API en retourne un.speed:"fast"ou"normal", indiquant si le mode rapide était actifquery_source: Sous-système qui a émis la demande, tel que"repl_main_thread","compact", ou un nom de sous-agenteffort: Niveau d’effort appliqué à la demande. Absent lorsque le modèle ne supporte pas l’effort.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Attribution de compétence, plugin, agent et MCP pour la demande. Voir Compteur de coûts pour les définitions et le comportement de masquage.
Événement de refus d’API
Enregistré lorsqu’une demande d’API retournestop_reason: "refusal". Les refus arrivent sur un flux de réponse réussi plutôt que comme une erreur HTTP, donc l’événement api_error ne se déclenche pas pour eux. Cet événement vous permet de suivre la fréquence des refus et de regrouper les refus par les mêmes attributs que api_request et api_error.
Nom de l’événement : claude_code.api_refusal
Attributs :
- Tous les attributs standard
event.name:"api_refusal"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionmodel: Identifiant du modèle de la demanderequest_id: ID de demande d’API Anthropic de l’en-têterequest-idde la réponse, tel que"req_011...". Présent uniquement lorsque l’API en retourne un.query_source: Sous-système qui a émis la demande, tel que"repl_main_thread","compact", ou un nom de sous-agent. Voirapi_requestpour les définitions.speed: Soit"fast"lorsque le Mode rapide est actif, soit"normal"attempt: Numéro de tentative de nouvelle tentative. La première tentative est1.effort: Niveau d’effort appliqué à la demande. Absent lorsque le modèle ne supporte pas l’effort.server_fallback_hop:truelorsque le basculement de modèle côté serveur de l’API a déjà réessayé ce refus sur un modèle différent, donc l’utilisateur n’a pas vu ce refus particulier.falselorsque la demande s’est terminée par un refus. Un seul tour peut émettre à la fois un événementtruehop et un événement finalfalseultérieur lorsque le modèle de secours refuse également.has_category:truelorsque la réponse de l’API contenait unestop_details.categoryde"cyber","bio","frontier_llm", ou"reasoning_extraction".falselorsque la réponse ne contenait aucune catégorie ou une valeur en dehors de cet ensemble. Absent lorsqueserver_fallback_hopesttrue, car les blocs hop ne portent passtop_details.has_explanation:truelorsque la réponse de l’API contenait unestop_details.explanation, sinonfalse. Absent lorsqueserver_fallback_hopesttrue.category: La valeurstop_details.categoryde la réponse de l’API. L’un de"cyber","bio","frontier_llm", ou"reasoning_extraction". Présent uniquement lorsqueOTEL_LOG_TOOL_DETAILS=1est défini ethas_categoryesttrue.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Attribution de compétence, plugin, agent et MCP pour la demande. Voir Compteur de coûts pour les définitions et le comportement de masquage.
Événement de corps de demande d’API
Enregistré pour chaque tentative de demande d’API lorsqueOTEL_LOG_RAW_API_BODIES est défini. Un événement est émis par tentative, donc les nouvelles tentatives avec des paramètres ajustés produisent chacune leur propre événement.
Nom de l’événement : claude_code.api_request_body
Attributs :
- Tous les attributs standard
event.name:"api_request_body"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionbody: Paramètres de demande de l’API Messages sérialisés en JSON (invite système, messages, outils, etc.), tronqués à 60 Ko. Le contenu de la réflexion étendue dans les tours d’assistant antérieurs est masqué. Émis uniquement en mode en ligne (OTEL_LOG_RAW_API_BODIES=1).body_ref: Chemin absolu vers un fichier<dir>/<uuid>.request.jsoncontenant le corps non tronqué. Émis uniquement en mode fichier (OTEL_LOG_RAW_API_BODIES=file:<dir>).body_length: Longueur du corps non tronqué. Octets UTF-8 lorsqueOTEL_LOG_RAW_API_BODIES=file:<dir>, ou unités de code UTF-16 lorsque=1body_truncated:"true"lorsque la troncature en ligne s’est produite. Absent en mode fichier et lorsqu’aucune troncature ne s’est produite.model: Identifiant du modèle à partir des paramètres de demandequery_source: Sous-système qui a émis la demande (par exemple,"compact")
Événement de corps de réponse d’API
Enregistré pour chaque réponse d’API réussie lorsqueOTEL_LOG_RAW_API_BODIES est défini.
Nom de l’événement : claude_code.api_response_body
Attributs :
- Tous les attributs standard
event.name:"api_response_body"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionbody: Réponse de l’API Messages sérialisée en JSON (id, blocs de contenu, utilisation, raison d’arrêt), tronquée à 60 Ko. Le contenu de la réflexion étendue est masqué. Émis uniquement en mode en ligne (OTEL_LOG_RAW_API_BODIES=1).body_ref: Chemin absolu vers un fichier<dir>/<request_id>.response.jsoncontenant le corps non tronqué. Émis uniquement en mode fichier (OTEL_LOG_RAW_API_BODIES=file:<dir>).body_length: Longueur du corps non tronqué. Octets UTF-8 lorsqueOTEL_LOG_RAW_API_BODIES=file:<dir>, ou unités de code UTF-16 lorsque=1body_truncated:"true"lorsque la troncature en ligne s’est produite. Absent en mode fichier et lorsqu’aucune troncature ne s’est produite.model: Identifiant du modèlequery_source: Sous-système qui a émis la demanderequest_id: ID de demande d’API Anthropic de l’en-têterequest-idde la réponse, tel que"req_011...". Présent uniquement lorsque l’API en retourne un.
Événement de décision d’outil
Enregistré lorsqu’une décision de permission d’outil est prise (accepter/rejeter). Nom de l’événement :claude_code.tool_decision
Attributs :
- Tous les attributs standard
event.name:"tool_decision"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessiontool_name: Nom de l’outil (par exemple, « Read », « Edit », « Write », « NotebookEdit »)tool_use_id: Identifiant unique pour cette invocation d’outil. Correspond autool_use_idpassé aux hooks, permettant la corrélation entre les événements OTel et les données capturées par les hooks.decision: Soit"accept"soit"reject"source: Source de la décision :"config": Décidé automatiquement sans invite, basé sur les paramètres du projet, les règles d’autorisation dans les paramètres personnels de l’utilisateur, la politique gérée par l’entreprise, les drapeaux--allowedToolsou--disallowedTools, le mode de permission actif, une autorisation limitée à la session d’une invite antérieure dans la même session CLI interactive, ou parce que l’outil est intrinsèquement sûr. L’événement n’indique pas laquelle de ces sources a correspondu."hook": Un hookPreToolUseouPermissionRequesta retourné la décision."user_permanent": Émis lorsque l’utilisateur a choisi « Oui, et ne me demande plus pour … » à une invite de permission, ce qui enregistre une règle d’autorisation dans ses paramètres personnels. Dans la CLI interactive, ceci est émis uniquement pour ce choix lui-même ; les appels ultérieurs qui correspondent à la règle enregistrée émettent"config"à la place. Dans le SDK Agent ou les sessions-pnon-interactives, à la fois le choix initial et les correspondances de règles ultérieures émettent"user_permanent". Traité comme une acceptation."user_temporary": Émis lorsque l’utilisateur a choisi « Oui » à une invite de permission pour une approbation unique, ou a choisi l’une des options « … pendant cette session » sur une invite d’édition ou de lecture de fichier. Dans la CLI interactive, ceci est émis uniquement pour le choix lui-même ; les appels ultérieurs autorisés par cette autorisation limitée à la session émettent"config"à la place. Dans le SDK Agent ou les sessions-pnon-interactives, à la fois le choix et les correspondances ultérieures émettent"user_temporary". Traité comme une acceptation."user_abort": Émis lorsque l’utilisateur a fermé l’invite de permission sans répondre. Traité comme un rejet."user_reject": Émis lorsque l’utilisateur a choisi « Non » lorsqu’il a été invité. Dans la CLI interactive, ceci est émis uniquement pour ce choix lui-même ; les appels qui correspondent à une règle de refus dans les paramètres personnels de l’utilisateur émettent"config"à la place. Dans le SDK Agent ou les sessions-pnon-interactives, les appels qui correspondent à une règle de refus dans les paramètres personnels émettent"user_reject". Traité comme un rejet.
tool_parameters(lorsqueOTEL_LOG_TOOL_DETAILS=1) : Chaîne JSON contenant les paramètres spécifiques à l’outil. Même forme que l’Événement de résultat d’outil, moins les champs post-exécution tels quegit_commit_id. Les valeurs peuvent différer detool_resultpour un appel accepté si la décision de permission réécrit l’entrée d’outil viaupdatedInput. Utilisez cet attribut pour voir quelle commande a été rejetée lorsquedecisionest"reject".- Pour l’outil Bash : inclut
bash_command,full_command,timeout,description,dangerouslyDisableSandbox - Pour l’outil WorkspaceBash : inclut
bash_command,full_command,timeout - Pour les outils MCP : inclut
mcp_server_name,mcp_tool_name - Pour l’outil Skill : inclut
skill_name - Pour l’outil Agent ou l’outil Task hérité : inclut
subagent_type
- Pour l’outil Bash : inclut
Événement de changement de mode de permission
Enregistré lorsque le mode de permission change, par exemple à partir du cycle Shift+Tab, de la sortie du mode plan ou d’une vérification de porte en mode automatique. Nom de l’événement :claude_code.permission_mode_changed
Attributs :
- Tous les attributs standard
event.name:"permission_mode_changed"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionfrom_mode: Le mode de permission précédent, par exemple"default","plan","acceptEdits","auto", ou"bypassPermissions"to_mode: Le nouveau mode de permissiontrigger: Ce qui a causé le changement. L’un de"shift_tab","exit_plan_mode","auto_gate_denied", ou"auto_opt_in". Absent lorsque la transition provient du SDK ou du pont
Événement d’authentification
Enregistré lorsque/login ou /logout se termine.
Nom de l’événement : claude_code.auth
Attributs :
- Tous les attributs standard
event.name:"auth"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionaction:"login"ou"logout"success:"true"ou"false"auth_method: Méthode d’authentification, telle que"oauth"error_category: Type d’erreur catégorique lorsque l’action a échoué. Le message d’erreur brut n’est jamais inclusstatus_code: Code de statut HTTP sous forme de chaîne lorsque l’action a échoué avec une erreur HTTP
Événement de connexion du serveur MCP
Enregistré lorsqu’un serveur MCP se connecte, se déconnecte ou échoue à se connecter. Nom de l’événement :claude_code.mcp_server_connection
Attributs :
- Tous les attributs standard
event.name:"mcp_server_connection"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionstatus:"connected","failed", ou"disconnected"transport_type: Transport du serveur, tel que"stdio","sse", ou"http"server_scope: Portée à laquelle le serveur est configuré, telle que"user","project", ou"local"duration_ms: Durée de la tentative de connexion en millisecondeserror_code: Code d’erreur lorsque la connexion a échouéis_plugin:truelorsque le serveur est fourni par un plugin,falsesinonplugin_id_hash(lorsqueis_pluginesttrue) : Hash stable du nom du plugin et de la place de marché, pour regrouper les événements par plugin sans exposer le nomplugin.name(lorsqueis_pluginesttrue) : Nom du plugin qui fournit le serveur. Pour les plugins tiers, ceci est la chaîne littérale"third-party"sauf siOTEL_LOG_TOOL_DETAILS=1; cela protège les noms de plugins tiers d’apparaître dans les journaux par défaut. Les plugins provenant de sources officielles d’Anthropic sont toujours identifiés par nom. Les attributsplugin_id_hashetplugin.namecirculent vers votre propre backend de surveillance et ne sont pas envoyés à Anthropicserver_name(lorsqueOTEL_LOG_TOOL_DETAILS=1) : Nom du serveur configuréerror(lorsqueOTEL_LOG_TOOL_DETAILS=1) : Message d’erreur complet lorsque la connexion a échoué
Événement d’erreur interne
Enregistré lorsque Claude Code détecte une erreur interne inattendue. Seul le nom de la classe d’erreur et un code de style errno sont enregistrés. Le message d’erreur et la trace de pile ne sont jamais inclus. Cet événement n’est pas émis lors de l’exécution sur Amazon Bedrock, Google Cloud’s Agent Platform, ou Microsoft Foundry, ou lorsqueDISABLE_ERROR_REPORTING est défini.
Nom de l’événement : claude_code.internal_error
Attributs :
- Tous les attributs standard
event.name:"internal_error"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionerror_name: Nom de la classe d’erreur, tel que"TypeError"ou"SyntaxError"error_code: Code errno Node.js tel que"ENOENT"lorsqu’il est présent sur l’erreur
Événement de plugin installé
Enregistré lorsqu’un plugin termine l’installation, à partir de la commande CLIclaude plugin install et de l’interface utilisateur interactive /plugin.
Nom de l’événement : claude_code.plugin_installed
Attributs :
- Tous les attributs standard
event.name:"plugin_installed"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionmarketplace.is_official:"true"si la place de marché est une place de marché officielle d’Anthropic,"false"sinoninstall.trigger:"cli"ou"ui"plugin.name: Nom du plugin installé. Pour les places de marché tierces, ceci est inclus uniquement lorsqueOTEL_LOG_TOOL_DETAILS=1plugin.version: Version du plugin lorsqu’elle est déclarée dans l’entrée de la place de marché. Pour les places de marché tierces, ceci est inclus uniquement lorsqueOTEL_LOG_TOOL_DETAILS=1marketplace.name: Place de marché à partir de laquelle le plugin a été installé. Pour les places de marché tierces, ceci est inclus uniquement lorsqueOTEL_LOG_TOOL_DETAILS=1
Événement de plugin chargé
Enregistré une fois par plugin activé au démarrage de la session. Utilisez cet événement pour inventorier les plugins actifs dans votre flotte, en complément deplugin_installed qui enregistre l’action d’installation elle-même.
Nom de l’événement : claude_code.plugin_loaded
Attributs :
- Tous les attributs standard
event.name:"plugin_loaded"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionplugin.name: nom du plugin. Pour les plugins en dehors de la place de marché officielle et du bundle intégré, la valeur est"third-party"sauf siOTEL_LOG_TOOL_DETAILS=1marketplace.name: place de marché à partir de laquelle le plugin a été installé, lorsqu’elle est connue. Masquée à"third-party"sous la même condition queplugin.nameplugin.version: version du manifeste du plugin. Inclus uniquement lorsque le nom n’est pas masqué et que le manifeste déclare une versionplugin.scope: catégorie de provenance du plugin :"official","org","user-local", ou"default-bundle"enabled_via: comment le plugin en est venu à être activé :"default-enable","org-policy","seed-mount", ou"user-install"plugin_id_hash: hash déterministe du nom du plugin et de la place de marché, envoyé uniquement à votre exportateur configuré. Vous permet de compter combien de plugins tiers distincts sont chargés dans votre flotte sans enregistrer leurs nomshas_hooks: si le plugin contribue des hookshas_mcp: si le plugin contribue des serveurs MCPhost_owned_mcp:truelorsque l’hôte SDK gère les connexions MCP de ce plugin et Claude Code a ignoré la lecture de la configuration du serveur MCP du plugin,falsesinon. Nécessite Claude Code v2.1.172 ou ultérieurskill_path_count: nombre de répertoires de compétences que le plugin déclarecommand_path_count: nombre de répertoires de commandes que le plugin déclareagent_path_count: nombre de répertoires d’agents que le plugin déclaresafe_mode:"true"lorsque la session a été démarrée avec--safe-mode,"false"sinon. En mode sûr, cet événement rapporte l’inventaire configuré uniquement ; les commandes, compétences, hooks et serveurs MCP du plugin ne se chargent pas. Nécessite Claude Code v2.1.169 ou ultérieur
Événement de compétence activée
Enregistré lorsqu’une compétence est invoquée, que Claude l’appelle via l’outil Skill ou que vous l’exécutiez en tant que commande/.
Nom de l’événement : claude_code.skill_activated
Attributs :
- Tous les attributs standard
event.name:"skill_activated"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionskill.name: Nom de la compétence. Pour les compétences définies par l’utilisateur et les compétences de plugin tiers, la valeur est l’espace réservé"custom_skill"sauf siOTEL_LOG_TOOL_DETAILS=1invocation_trigger: Comment la compétence a été déclenchée ("user-slash","claude-proactive", ou"nested-skill")skill.source: D’où la compétence a été chargée (par exemple,"bundled","userSettings","projectSettings","plugin")skill.kind:"workflow"lorsque la compétence est une compétence de flux de travail. Absent sinonplugin.name(lorsqueOTEL_LOG_TOOL_DETAILS=1ou le plugin provient d’une place de marché officielle) : Nom du plugin propriétaire lorsque la compétence est fournie par un pluginmarketplace.name(lorsqueOTEL_LOG_TOOL_DETAILS=1ou le plugin provient d’une place de marché officielle) : Place de marché du plugin propriétaire, lorsque la compétence est fournie par un plugin
Événement de mention @
Enregistré lorsque Claude Code résout une mention@ dans une invite. Pas chaque mention n’émet un événement : les chemins de sortie anticipée tels que les refus de permission, les fichiers surdimensionnés, les pièces jointes de référence PDF et les défaillances de listage de répertoires retournent sans enregistrement.
Nom de l’événement : claude_code.at_mention
Attributs :
- Tous les attributs standard
event.name:"at_mention"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionmention_type: Type de mention ("file","directory","agent","mcp_resource")success: Si la mention a été résolue avec succès ("true"ou"false")
Événement de tentatives d’API épuisées
Enregistré une fois lorsqu’une demande d’API échoue après plus d’une tentative. Émis aux côtés de l’événementapi_error final.
Nom de l’événement : claude_code.api_retries_exhausted
Attributs :
- Tous les attributs standard
event.name:"api_retries_exhausted"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionmodel: Modèle utiliséerror: Message d’erreur finalstatus_code: Code de statut HTTP sous forme de nombre. Absent pour les erreurs non-HTTP.total_attempts: Nombre total de tentatives effectuéestotal_retry_duration_ms: Temps mural total sur toutes les tentativesspeed:"fast"ou"normal"
Événement de hook enregistré
Enregistré une fois par hook configuré au démarrage de la session. Utilisez cet événement pour inventorier les hooks actifs dans votre flotte, en complément des événementshook_execution_start et hook_execution_complete par exécution.
Nom de l’événement : claude_code.hook_registered
Attributs :
- Tous les attributs standard
event.name:"hook_registered"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionhook_event: type d’événement hook, tel que"PreToolUse"ou"PostToolUse"hook_type: type d’implémentation du hook :"command","prompt","mcp_tool","http", ou"agent"hook_source: où le hook est défini :"userSettings","projectSettings","localSettings","flagSettings","policySettings", ou"pluginHook"safe_mode:"true"lorsque la session a été démarrée avec--safe-mode,"false"sinon. Nécessite Claude Code v2.1.169 ou ultérieurhook_matcher(lorsqueOTEL_LOG_TOOL_DETAILS=1) : la chaîne matcher de la configuration du hook, lorsqu’elle est définieplugin.name(lorsquehook_sourceest"pluginHook") : nom du plugin contributeur. Pour les plugins en dehors de la place de marché officielle et du bundle intégré, la valeur est"third-party"sauf siOTEL_LOG_TOOL_DETAILS=1plugin_id_hash(lorsquehook_sourceest"pluginHook") : hash déterministe du nom du plugin et de la place de marché, envoyé uniquement à votre exportateur configuré. Vous permet de compter les plugins contributeurs distincts sans enregistrer leurs noms
Événement de démarrage d’exécution de hook
Enregistré lorsqu’un ou plusieurs hooks commencent à s’exécuter pour un événement de hook. Nom de l’événement :claude_code.hook_execution_start
Attributs :
- Tous les attributs standard
event.name:"hook_execution_start"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionhook_event: Type d’événement hook, tel que"PreToolUse"ou"PostToolUse"hook_name: Nom complet du hook incluant le matcher, tel que"PreToolUse:Write"num_hooks: Nombre de commandes hook correspondantesmanaged_only:"true"lorsque seuls les hooks de politique gérée sont autoriséshook_source:"policySettings"ou"merged"safe_mode:"true"lorsque la session a été démarrée avec--safe-mode,"false"sinon. Nécessite Claude Code v2.1.169 ou ultérieurhook_definitions: Configuration du hook sérialisée en JSON. Inclus uniquement lorsque le traçage bêta détaillé etOTEL_LOG_TOOL_DETAILS=1sont tous deux activés
Événement de fin d’exécution de hook
Enregistré lorsque tous les hooks pour un événement de hook ont terminé. Nom de l’événement :claude_code.hook_execution_complete
Attributs :
- Tous les attributs standard
event.name:"hook_execution_complete"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionhook_event: Type d’événement hookhook_name: Nom complet du hook incluant le matchernum_hooks: Nombre de commandes hook correspondantesnum_success: Nombre qui se sont terminées avec succèsnum_blocking: Nombre qui ont retourné une décision de blocagenum_non_blocking_error: Nombre qui ont échoué sans bloquernum_cancelled: Nombre annulé avant la fintotal_duration_ms: Durée murale de tous les hooks correspondantsmanaged_only:"true"lorsque seuls les hooks de politique gérée sont autoriséshook_source:"policySettings"ou"merged"safe_mode:"true"lorsque la session a été démarrée avec--safe-mode,"false"sinon. Nécessite Claude Code v2.1.169 ou ultérieurhook_definitions: Configuration du hook sérialisée en JSON. Inclus uniquement lorsque le traçage bêta détaillé etOTEL_LOG_TOOL_DETAILS=1sont tous deux activés
Événement de métriques de plugin hook
Enregistré lorsqu’un hook de plugin de place de marché officielle émet des métriques par invocation. Seuls les plugins installés à partir d’une place de marché officielle d’Anthropic peuvent émettre ces métriques. Les plugins de place de marché tiers et les hooks configurés par l’utilisateur n’émettent pas vers cet événement. Utilisez cet événement pour surveiller le comportement des plugins tels que les taux de découverte, les coûts et les durées à partir de votre propre pile d’observabilité. Nom de l’événement :claude_code.hook_plugin_metrics
Attributs :
- Tous les attributs standard
event.name:"hook_plugin_metrics"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionplugin_id: identifiant du plugin sous la forme<name>@<marketplace>hook_event: type d’événement hook qui a émis les métriques- Jusqu’à 20 clés de métriques émises par le plugin. Les noms correspondent à
^[a-z][a-z0-9_]{0,39}$. Les valeurs sont booléennes ou numériques.
Événement de compaction
Enregistré lorsque la compaction de conversation se termine. Nom de l’événement :claude_code.compaction
Attributs :
- Tous les attributs standard
event.name:"compaction"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessiontrigger:"auto"ou"manual"success:"true"ou"false"duration_ms: Durée de la compactionpre_tokens: Nombre approximatif de jetons avant la compactionpost_tokens: Nombre approximatif de jetons après la compactionerror: Message d’erreur lorsque la compaction a échouéprecompute_reuse: Défini uniquement lorsquetriggerest"manual". La compaction automatique peut préparer un résumé en arrière-plan avant que la fenêtre de contexte ne se remplisse, et cet attribut enregistre si/compacta réutilisé ce résumé préparé."hit"signifie qu’il a été réutilisé ;"miss_custom_instructions","miss_hook", et"miss_not_ready"donnent la raison pour laquelle un résumé frais a été calculé à la place. Nécessite Claude Code v2.1.153 ou ultérieur
Événement de sondage de rétroaction
Enregistré lorsqu’un sondage de qualité de session est affiché ou auquel il est répondu. Voir Sondages de qualité de session pour savoir ce que les sondages collectent et comment les contrôler. Nom de l’événement :claude_code.feedback_survey
Attributs :
- Tous les attributs standard
event.name:"feedback_survey"event.timestamp: Horodatage ISO 8601event.sequence: Compteur monotone croissant pour ordonner les événements au sein d’une sessionevent_type: Événement du cycle de vie du sondage, par exemple"appeared","responded", ou"transcript_prompt_appeared"appearance_id: ID unique liant les événements émis pour une instance de sondagesurvey_type: Quel sondage a produit l’événement."session"est l’invite d’évaluation « Comment Claude se débrouille-t-il ? »response: La sélection de l’utilisateur sur les événementsrespondedenabled_via_override:truelorsqueCLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTELest défini. Émis en tant que booléen, pas une chaîne. Présent sur les événements de sondagesession. Filtrez sur cet attribut pour confirmer que le remplacement est appliqué dans votre flotte
Interpréter les données de métriques et d’événements
Les métriques et événements exportés prennent en charge une gamme d’analyses :Surveillance de l’utilisation
Surveillance des coûts
La métriqueclaude_code.cost.usage aide à :
- Suivre les tendances d’utilisation entre les équipes ou les individus
- Identifier les sessions à utilisation élevée pour l’optimisation
- Attribuer les dépenses à des compétences, des plugins ou des types de sous-agents spécifiques via les attributs
skill.name,plugin.name, etagent.name
Les métriques de coûts sont des approximations. Pour les données de facturation officielles, consultez votre fournisseur d’API (Claude Console, Amazon Bedrock ou Google Cloud’s Agent Platform).
Alertes et segmentation
Les alertes courantes à considérer :- Pics de coûts
- Consommation de jetons inhabituelle
- Volume de session élevé d’utilisateurs spécifiques
model est disponible sur claude_code.token.usage, claude_code.cost.usage, et à partir de la v2.1.172, claude_code.lines_of_code.count.
Les ventilations par modèle des commits ne peuvent être approximées que en joignant les métriques de jetons ou de coûts sur session.id, puisqu’une session peut s’étendre sur plusieurs modèles. Filtrez le côté jetons ou coûts pour les lignes où query_source est "main" afin que les demandes auxiliaires et de sous-agents n’attribuent pas les commits de la session à un modèle qui ne les a pas effectués.
Détecter l’épuisement des tentatives
Claude Code réessaie les demandes d’API échouées en interne et n’émet un seul événementclaude_code.api_error qu’après avoir abandonné, donc l’événement lui-même est le signal terminal pour cette demande. Les tentatives de nouvelle tentative intermédiaires ne sont pas enregistrées comme des événements séparés.
L’attribut attempt sur l’événement enregistre le nombre total de tentatives effectuées. CLAUDE_CODE_MAX_RETRIES est par défaut 10 et plafonné à 15 ; à partir de la v2.1.199, CLAUDE_CODE_RETRY_WATCHDOG augmente la valeur par défaut et supprime le plafond. Lorsque la demande épuise toutes les tentatives sur une erreur transitoire, attempt est égal à un de plus que cette limite effective : 11 par défaut, et jamais plus de 16 sauf si le watchdog est défini. Une valeur inférieure indique une erreur non réessayable telle qu’une réponse 400.
Pour distinguer une session qui s’est rétablie d’une qui s’est bloquée, groupez les événements par session.id et vérifiez si un événement api_request ultérieur existe après l’erreur.
Analyse des événements
Les données d’événements fournissent des informations détaillées sur les interactions de Claude Code : Modèles d’utilisation des outils : analyser les événements de résultat d’outil pour identifier :- Les outils les plus fréquemment utilisés
- Les taux de réussite des outils
- Les temps d’exécution moyens des outils
- Les modèles d’erreur par type d’outil
Audit des événements de sécurité
Les événements OpenTelemetry sont la source de données d’audit pour l’activité de Claude Code. Chaque événement porte des attributs d’identité qui lient les appels d’outils, l’activité MCP et les décisions de permission à l’utilisateur qui les a déclenchés. L’exportateur de journaux OTLP peut livrer ces événements à n’importe quelle plateforme SIEM (Security Information and Event Management) avec un récepteur OTLP, ou à un collecteur OpenTelemetry qui transfère vers votre SIEM.Attribuer les actions aux utilisateurs
Les attributs standard sur chaque événement incluent l’identité de l’utilisateur authentifié :user.email, user.account_uuid, user.account_id, et organization.id lorsqu’il est connecté avec un compte Claude, plus user.id et le per-session session.id. user.id est un identifiant limité à l’installation, sauf sur les sessions de passerelle d’applications Claude, où il s’agit du sujet IdP du jeton émis par la passerelle.
Les appels d’outils MCP, les commandes Bash et les éditions de fichiers sont donc attribués au développeur qui a démarré la session. Claude Code n’agit pas sous un compte de service distinct ; l’identité enregistrée sur chaque événement est le propre compte Claude du développeur, ou l’identité IdP du développeur sur une session de passerelle d’applications Claude.
Lorsque Claude Code s’authentifie avec une clé API directe, ou contre Amazon Bedrock, Google Cloud’s Agent Platform ou Microsoft Foundry, il n’y a pas de compte Claude dans la session et seuls user.id et session.id sont remplis. Dans ces déploiements, attachez l’identité utilisateur vous-même avec OTEL_RESOURCE_ATTRIBUTES, défini par utilisateur via le fichier paramètres gérés ou un wrapper de lancement. Les sessions de passerelle d’applications Claude n’ont besoin d’aucune de ces opérations : le CLI horodate l’identité IdP automatiquement, comme décrit dans Attributs standard.
Audit de l’activité MCP
Pour capturer l’activité du serveur MCP avec tous les détails d’appel, activez l’exportateur de journaux et définissezOTEL_LOG_TOOL_DETAILS=1. Chaque opération MCP produit alors des événements structurés qui portent le nom du serveur, le nom de l’outil et les arguments d’appel aux côtés des attributs d’identité standard :
Sans
OTEL_LOG_TOOL_DETAILS, ces événements suppriment le détail d’identification :
tool_result: conservetool_nameetmcp_server_scope, ometmcp_server_name,mcp_tool_name, et les argumentstool_decision: conservetool_name, omettool_parametersmcp_server_connection: ometserver_nameet le message d’erreur, mais conserveis_plugin,plugin_id_hash, etplugin.name, avec les noms de plugins non-Anthropic redactés au littéral"third-party", de sorte que les serveurs fournis par les plugins restent distinguables sans journalisation détaillée
Mapper les questions de sécurité aux événements
Lors de la création de règles de détection, recherchez le signal que vous souhaitez surveiller et interrogez votre backend pour l’événement correspondant et les attributs :
Claude Code émet uniquement le flux d’événements brut. La détection d’anomalies, l’établissement de lignes de base, la corrélation entre les sessions et les alertes sont la responsabilité de votre SIEM ou backend d’observabilité.
Envoyer les événements à un SIEM
PointezOTEL_EXPORTER_OTLP_LOGS_ENDPOINT vers le récepteur OTLP de votre SIEM, ou vers un collecteur OpenTelemetry qui transfère vers l’API d’ingestion native de votre SIEM. L’exemple de paramètres gérés suivant exporte uniquement les événements, avec tous les détails d’outil activés pour l’audit MCP et Bash :
Considérations relatives aux backends
Votre choix de backends de métriques, de journaux et de traces détermine les types d’analyses que vous pouvez effectuer :Pour les métriques
- Bases de données de séries chronologiques (par exemple, Prometheus) : Calculs de taux, métriques agrégées
- Magasins colonnaires (par exemple, ClickHouse) : Requêtes complexes, analyse d’utilisateurs uniques
- Plates-formes d’observabilité complètes (par exemple, Honeycomb, Datadog, Grafana Cloud) : Requêtes avancées, visualisation, alertes
Pour les événements/journaux
- Systèmes d’agrégation de journaux (par exemple, Elasticsearch, Loki) : Recherche en texte intégral, analyse de journaux
- Magasins colonnaires (par exemple, ClickHouse) : Analyse d’événements structurés
- Plates-formes d’observabilité complètes (par exemple, Honeycomb, Datadog, Grafana Cloud) : Corrélation entre les métriques et les événements
Pour les traces
Choisissez un backend qui prend en charge le stockage de traces distribuées et la corrélation d’intervalles :- Systèmes de traçage distribué (par exemple, Jaeger, Zipkin, Grafana Tempo) : Visualisation d’intervalles, cascades de demandes, analyse de latence
- Plates-formes d’observabilité complètes (par exemple, Honeycomb, Datadog, Grafana Cloud) : Recherche de traces et corrélation avec les métriques et les journaux
Informations sur le service
Toutes les métriques et tous les événements sont exportés avec les attributs de ressource suivants :service.name:claude-codeservice.version: Version actuelle de Claude Codeos.type: Type de système d’exploitation (par exemple,linux,darwin,windows)os.version: Chaîne de version du système d’exploitationhost.arch: Architecture de l’hôte (par exemple,amd64,arm64)wsl.version: Numéro de version WSL (présent uniquement lors de l’exécution sur Windows Subsystem for Linux)- Nom du compteur :
com.anthropic.claude_code
Ressources de mesure du ROI
Pour un guide complet sur la mesure du retour sur investissement pour Claude Code, y compris la configuration de la télémétrie, l’analyse des coûts, les métriques de productivité et les rapports automatisés, consultez le Guide de mesure du ROI de Claude Code. Ce référentiel fournit des configurations Docker Compose prêtes à l’emploi, des configurations Prometheus et OpenTelemetry, et des modèles pour générer des rapports de productivité intégrés à des outils comme Linear.Sécurité et confidentialité
- L’export OpenTelemetry vers votre backend est opt-in et nécessite une configuration explicite. Pour la télémétrie opérationnelle distincte d’Anthropic et comment la désactiver, consultez Utilisation des données
- Les contenus de fichiers bruts et les extraits de code ne sont pas inclus dans les métriques ou les événements. Les intervalles de trace constituent un chemin de données distinct : voir la puce
OTEL_LOG_TOOL_CONTENTci-dessous - Lorsqu’authentifié via OAuth,
user.emailest inclus dans les attributs de télémétrie. Si cela pose un problème pour votre organisation, travaillez avec votre backend de télémétrie pour filtrer ou masquer ce champ - Le contenu des invites utilisateur n’est pas collecté par défaut. Seule la longueur de l’invite est enregistrée. Pour inclure le contenu de l’invite, définissez
OTEL_LOG_USER_PROMPTS=1 - Le texte de réponse de l’assistant n’est pas collecté par défaut. Seule la longueur de la réponse est enregistrée. Pour inclure le texte de réponse, définissez
OTEL_LOG_ASSISTANT_RESPONSES=1. Comme toutes les données OpenTelemetry de Claude Code, le texte de réponse est envoyé uniquement au point de terminaison OTel que vous configurez, jamais à Anthropic. Lorsque cette variable n’est pas définie,OTEL_LOG_USER_PROMPTSest utilisé comme solution de secours, donc définissezOTEL_LOG_ASSISTANT_RESPONSES=0si vous souhaitez le contenu de l’invite sans contenu de réponse - Les arguments d’entrée d’outil et les paramètres ne sont pas enregistrés par défaut. Pour les inclure, définissez
OTEL_LOG_TOOL_DETAILS=1. Ces données sont envoyées uniquement au point de terminaison OTEL que vous configurez, jamais à Anthropic. Les arguments peuvent toujours contenir des valeurs sensibles, donc configurez votre backend de télémétrie pour filtrer ou masquer ces attributs selon les besoins. Lorsqu’activé :- Les événements
tool_resultettool_decisionincluent un attributtool_parametersavec les commandes Bash, les noms de serveur MCP et d’outil, et les noms de compétences. Les champs tels quefull_commandsont émis sans troncature - Les événements
tool_resultincluent également un attributtool_inputavec les chemins de fichiers, les URL, les modèles de recherche et d’autres arguments. Les valeurs individuelles dépassant 512 caractères sont tronquées et le total est limité à environ 4 K caractères - Les événements
user_promptincluent lecommand_nameverbatim pour les commandes personnalisées, de plugin et MCP - Les intervalles de trace incluent le même attribut
tool_inputet les attributs dérivés de l’entrée tels quefile_path, avec la même troncature quetool_input
- Les événements
- Le contenu d’entrée et de sortie d’outil n’est pas enregistré dans les intervalles de trace par défaut. Pour l’inclure, définissez
OTEL_LOG_TOOL_CONTENT=1. Lorsqu’activé, les événements d’intervalle incluent le contenu complet d’entrée et de sortie d’outil tronqué à 60 Ko par intervalle. Cela peut inclure les contenus de fichiers bruts des résultats de l’outil Read et la sortie de commande Bash. Configurez votre backend de télémétrie pour filtrer ou masquer ces attributs selon les besoins - Les corps bruts de la demande et de la réponse de l’API Messages d’Anthropic ne sont pas enregistrés par défaut. Pour les inclure, définissez
OTEL_LOG_RAW_API_BODIES. Avec=1, chaque appel d’API émet des événements de journauxapi_request_bodyetapi_response_bodydont l’attributbodyest la charge utile sérialisée en JSON, tronquée à 60 Ko. Avec=file:<dir>, les corps non tronqués sont écrits dans les fichiers.request.jsonet.response.jsonsous ce répertoire et les événements portent un cheminbody_refà la place du corps en ligne. Livrez le répertoire avec un collecteur de journaux ou un sidecar plutôt que via le flux de télémétrie. Dans les deux modes, les corps contiennent l’historique complet de la conversation (invite système, chaque tour d’utilisateur et d’assistant antérieur, résultats d’outils), donc l’activation de cette option implique le consentement à tout ce que les autres drapeaux de contenuOTEL_LOG_*révèleraient. Le contenu de réflexion étendue de Claude est toujours masqué de ces corps indépendamment des autres paramètres