{"meta":{"title":"Instrumentation OpenTelemetry pour le Kit de développement logiciel (SDK) Copilot","intro":"Ce guide explique comment ajouter le traçage OpenTelemetry à vos applications Copilot SDK.","product":"GitHub Copilot","breadcrumbs":[{"href":"/fr/copilot","title":"GitHub Copilot"},{"href":"/fr/copilot/how-tos","title":"Procédures"},{"href":"/fr/copilot/how-tos/copilot-sdk","title":"Kit de développement logiciel (SDK) Copilot"},{"href":"/fr/copilot/how-tos/copilot-sdk/observability","title":"Observabilité"},{"href":"/fr/copilot/how-tos/copilot-sdk/observability/opentelemetry","title":"Opentelemetry"}],"documentType":"article"},"body":"# Instrumentation OpenTelemetry pour le Kit de développement logiciel (SDK) Copilot\n\nCe guide explique comment ajouter le traçage OpenTelemetry à vos applications Copilot SDK.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## Prise en charge de la télémétrie intégrée\n\nLe Kit de développement logiciel (SDK) prend en charge la configuration d’OpenTelemetry sur le processus CLI et la propagation du contexte de trace W3C entre le Kit de développement logiciel (SDK) et l’interface CLI. Fournissez `TelemetryConfig` lors de la création du client pour activer cette option :\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n<!-- docs-validate: skip -->\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient({\n  telemetry: {\n    otlpEndpoint: \"http://localhost:4318\",\n  },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n<!-- docs-validate: skip -->\n\n```python\nfrom copilot import CopilotClient\n\nclient = CopilotClient(\n    telemetry={\n        \"otlp_endpoint\": \"http://localhost:4318\",\n    },\n)\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n<!-- docs-validate: skip -->\n\n```golang\nclient := copilot.NewClient(&copilot.ClientOptions{\n    Telemetry: &copilot.TelemetryConfig{\n        OTLPEndpoint: \"http://localhost:4318\",\n    },\n})\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n<!-- docs-validate: skip -->\n\n```csharp\nvar client = new CopilotClient(new CopilotClientOptions\n{\n    Telemetry = new TelemetryConfig\n    {\n        OtlpEndpoint = \"http://localhost:4318\",\n    },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n<!-- docs-validate: skip -->\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\n\nvar client = new CopilotClient(new CopilotClientOptions()\n    .setTelemetry(new TelemetryConfig()\n        .setOtlpEndpoint(\"http://localhost:4318\"))\n);\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"rust\" data-label=\"Rust\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Rust</div>\n\n<!-- docs-validate: skip -->\n\n```rust\nuse github_copilot_sdk::{Client, ClientOptions, TelemetryConfig};\n\nlet client = Client::start(ClientOptions::new()\n    .with_telemetry(TelemetryConfig::new()\n        .with_otlp_endpoint(\"http://localhost:4318\"))\n).await?;\n```\n\n</div>\n\n</div>\n\n### Options de configuration de télémétrie\n\n| Choix                      | Node.JS          | Python            | Allez            | .NET             | Java             | Rust              | Description                                                                    |\n| -------------------------- | ---------------- | ----------------- | ---------------- | ---------------- | ---------------- | ----------------- | ------------------------------------------------------------------------------ |\n| Point de terminaison OTLP  | `otlpEndpoint`   | `otlp_endpoint`   | `OTLPEndpoint`   | `OtlpEndpoint`   | `otlpEndpoint`   | `otlp_endpoint`   | URL du point de terminaison HTTP OTLP                                          |\n| Protocole OTLP             | `otlpProtocol`   | `otlp_protocol`   | `OTLPProtocol`   | `OtlpProtocol`   | `otlpProtocol`   | `otlp_protocol`   | Protocole HTTP OTLP pour tous les signaux : `\"http/json\"` ou `\"http/protobuf\"` |\n| Chemins d'accès au fichier | `filePath`       | `file_path`       | `FilePath`       | `FilePath`       | `filePath`       | `file_path`       | Chemin du fichier pour la sortie trace au format JSON-lines                    |\n| Type d’exportateur         | `exporterType`   | `exporter_type`   | `ExporterType`   | `ExporterType`   | `exporterType`   | `exporter_type`   |                                                                                |\n| `\"otlp-http\"` ou `\"file\"`  |                  |                   |                  |                  |                  |                   |                                                                                |\n| Nom de la source           | `sourceName`     | `source_name`     | `SourceName`     | `SourceName`     | `sourceName`     | `source_name`     | Nom de la portée d’instrumentation                                             |\n| Capturer du contenu        | `captureContent` | `capture_content` | `CaptureContent` | `CaptureContent` | `captureContent` | `capture_content` | Indique s’il faut capturer le contenu du message                               |\n\nLe champ du protocole OTLP configure l’exportateur de l’interface de ligne de commande (CLI) `\"otlp-http\"` pour tous les signaux. Laissez-le vide pour utiliser la valeur par défaut de la CLI, ou définissez-le sur `\"http/protobuf\"` pour exporter des données protobuf via HTTP.\n\n### Propagation du contexte de trace\n\n> **La plupart des utilisateurs n’ont pas besoin de cela.** Le `TelemetryConfig` ci-dessus est tout ce dont vous avez besoin pour collecter les traces depuis le CLI. La propagation du contexte de trace décrite dans cette section est une **fonctionnalité avancée** pour les applications qui créent leurs propres étendues OpenTelemetry et veulent qu’elles apparaissent dans la **même trace distribuée** que les étendues de l’interface CLI.\n\nLe Kit de développement logiciel (SDK) peut propager le contexte de trace W3C (`traceparent`/`tracestate`) sur des charges utiles JSON-RPC afin que les étendues de votre application et les étendues de l’interface CLI soient liées dans une trace distribuée. Cela est utile lorsque, par exemple, vous souhaitez voir une étendue « gérer l’appel d’outil » dans votre application imbriquée dans l’étendue « outil d’exécution » de l’interface CLI, ou afficher l’appel du SDK en tant qu’enfant de votre étendue de gestion des demandes.\n\nPour l’attribution des coûts aux côtés des traces, abonnez-vous aux événements `assistant.usage` et examinez `apiEndpoint` (`AssistantUsageApiEndpoint`) afin de voir si un tour a utilisé Chat Completions, Responses ou Anthropic Messages ; voir [Événements de session de streaming](/fr/copilot/how-tos/copilot-sdk/features/streaming-events).\n\n#### SDK → CLI (sortant)\n\nPour **Node.js**, fournissez une `onGetTraceContext` fonction de rappel dans les options du client. Cela n’est nécessaire que si votre application utilise `@opentelemetry/api` déjà et que vous souhaitez lier vos étendues avec les étendues de l’interface CLI. Le Kit de développement logiciel (SDK) appelle ce callback avant `session.create`, `session.resume` et `session.send` RPC :\n\n<!-- docs-validate: skip -->\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\nimport { propagation, context } from \"@opentelemetry/api\";\n\nconst client = new CopilotClient({\n  telemetry: { otlpEndpoint: \"http://localhost:4318\" },\n  onGetTraceContext: () => {\n    const carrier: Record<string, string> = {};\n    propagation.inject(context.active(), carrier);\n    return carrier; // { traceparent: \"00-...\", tracestate: \"...\" }\n  },\n});\n```\n\nPour **Python**, **Go** et **.NET**, l’injection de contexte de trace est automatique lorsque l’API OpenTelemetry/Activity respective est configurée. Aucun rappel n’est nécessaire.\n\n#### CLI → SDK (entrant)\n\nLorsque le CLI invoque un gestionnaire d’outils, les éléments `traceparent` et `tracestate` de la portée du CLI sont disponibles dans toutes les langues :\n\n* **Go** : le champ `ToolInvocation.TraceContext` est un(e) `context.Context` avec la trace déjà restaurée : utilisez-la directement comme parent pour vos étendues.\n* **Python** : le contexte de trace est automatiquement restauré au niveau du gestionnaire via `trace_context()` : les étendues enfants ont automatiquement pour parent le span de la CLI.\n* **.NET** : le contexte de trace est automatiquement restauré via `RestoreTraceContext()` — les instances enfants `Activity` sont automatiquement rattachées à l’étendue de la CLI.\n* **Node.js** : puisque le SDK n’a aucune dépendance à OpenTelemetry, `traceparent` et `tracestate` sont transmis comme chaînes brutes dans l’objet `ToolInvocation`. Restaurez le contexte manuellement si nécessaire :\n\n<!-- docs-validate: skip -->\n\n```typescript\nimport { defineTool } from \"@github/copilot-sdk\";\nimport { propagation, context, trace } from \"@opentelemetry/api\";\n\nconst myTool = defineTool(\"my-tool\", {\n  description: \"Do work\",\n  handler: async (args, invocation) => {\n    // Restore the CLI's trace context as the active context\n    const carrier = {\n      traceparent: invocation.traceparent,\n      tracestate: invocation.tracestate,\n    };\n    const parentCtx = propagation.extract(context.active(), carrier);\n\n    // Create a child span under the CLI's span\n    const tracer = trace.getTracer(\"my-app\");\n    return context.with(parentCtx, () =>\n      tracer.startActiveSpan(\"my-tool\", async (span) => {\n        try {\n          const result = await doWork(args);\n          return result;\n        } finally {\n          span.end();\n        }\n      })\n    );\n  },\n});\n\n// Tool handlers are registered when the session is created.\nconst session = await client.createSession({ tools: [myTool] });\n```\n\n### Dépendances par langage\n\n| Language | Dépendance                           | Remarques                                                                                                                                                                                                                                     |\n| -------- | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Node.JS  | —                                    | Aucune dépendance ; fournir une `onGetTraceContext` fonction de rappel pour la propagation sortante                                                                                                                                           |\n| Python   | `opentelemetry-api`                  | Installer avec `pip install copilot-sdk[telemetry]`                                                                                                                                                                                           |\n| Allez    | `go.opentelemetry.io/otel`           | Dépendance requise                                                                                                                                                                                                                            |\n| .NET     | —                                    | Utilise le `System.Diagnostics.Activity` intégré                                                                                                                                                                                              |\n| Java     | `io.opentelemetry:opentelemetry-api` | Ajoutez cette dépendance pour la configuration basée sur le Kit de développement logiciel (SDK) ; l’injection de contexte de trace est automatique lorsque l’agent openTelemetry Java ou le Kit de développement logiciel (SDK) est configuré |\n\n## References\n\n* [Conventions sémantiques OpenTelemetry GenAI](https://opentelemetry.io/docs/specs/semconv/gen-ai/)\n* [Conventions sémantiques MCP OpenTelemetry](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/)\n* [Kit de développement logiciel (SDK) OpenTelemetry Python](https://opentelemetry.io/docs/instrumentation/python/)\n* [Documentation du SDK Copilot](https://github.com/github/copilot-sdk)"}