Remarque
Kit de développement logiciel (SDK) Copilot est actuellement en préversion technique. Les fonctionnalités et la disponibilité sont susceptibles de changer.
SDK GitHub Copilot 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.
Pour obtenir des exemples dans Python, Go et .NET, consultez le github/copilot-sdkréférentiel.
Prise en charge de la télémétrie intégrée
Pour choisir la télémétrie, fournissez une TelemetryConfig valeur lors de la création du client :
import { CopilotClient } from "@github/copilot-sdk";
const client = new CopilotClient({
telemetry: {
otlpEndpoint: "http://localhost:4318",
},
});
import { CopilotClient } from "@github/copilot-sdk";
const client = new CopilotClient({
telemetry: {
otlpEndpoint: "http://localhost:4318",
},
});
Options de configuration de télémétrie
| Choix | Node.JS | Description |
|---|---|---|
| Point de terminaison OTLP | otlpEndpoint | URL du point de terminaison HTTP OTLP |
| Chemins d'accès au fichier | filePath | Chemin d’accès au fichier pour la sortie de trace de lignes JSON |
| Type d’exportateur | exporterType |
`"otlp-http"` ou `"file"` |
| Nom de la source | sourceName | Nom de la portée d’instrumentation |
| Capturer du contenu | captureContent | Indique s’il faut capturer le contenu du message |
Propagation du contexte de trace
Remarque
La plupart des utilisateurs n’ont pas besoin de cela.
TelemetryConfig est tout ce qu'il vous faut pour collecter des traces depuis l'interface CLI. La propagation du contexte de trace 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.
Le 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 afficher l’appel du SDK en tant que sous-élément de votre plage de traitement des requêtes.
Pour obtenir un diagramme de séquence détaillé du flux de session, consultez le github/copilot-sdkréférentiel.
SDK vers CLI (sortant)
Fournissez une 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 :
import { CopilotClient } from "@github/copilot-sdk";
import { propagation, context } from "@opentelemetry/api";
const client = new CopilotClient({
telemetry: { otlpEndpoint: "http://localhost:4318" },
onGetTraceContext: () => {
const carrier: Record<string, string> = {};
propagation.inject(context.active(), carrier);
return carrier; // { traceparent: "00-...", tracestate: "..." }
},
});
import { CopilotClient } from "@github/copilot-sdk";
import { propagation, context } from "@opentelemetry/api";
const client = new CopilotClient({
telemetry: { otlpEndpoint: "http://localhost:4318" },
onGetTraceContext: () => {
const carrier: Record<string, string> = {};
propagation.inject(context.active(), carrier);
return carrier; // { traceparent: "00-...", tracestate: "..." }
},
});
CLI vers SDK (entrant)
Lorsque l’interface CLI appelle un gestionnaire d’outils, les traceparent et tracestate de l'étendue du CLI sont disponibles. Étant donné que le SDK n’a pas de dépendance OpenTelemetry, ceux-ci sont passés sous forme de chaînes brutes sur l’objet ToolInvocation . Restaurez le contexte manuellement si nécessaire :
import { propagation, context, trace } from "@opentelemetry/api";
session.registerTool(myTool, async (args, invocation) => {
// Restore the CLI's trace context as the active context
const carrier = {
traceparent: invocation.traceparent,
tracestate: invocation.tracestate,
};
const parentCtx = propagation.extract(context.active(), carrier);
// Create a child span under the CLI's span
const tracer = trace.getTracer("my-app");
return context.with(parentCtx, () =>
tracer.startActiveSpan("my-tool", async (span) => {
try {
const result = await doWork(args);
return result;
} finally {
span.end();
}
})
);
});
import { propagation, context, trace } from "@opentelemetry/api";
session.registerTool(myTool, async (args, invocation) => {
// Restore the CLI's trace context as the active context
const carrier = {
traceparent: invocation.traceparent,
tracestate: invocation.tracestate,
};
const parentCtx = propagation.extract(context.active(), carrier);
// Create a child span under the CLI's span
const tracer = trace.getTracer("my-app");
return context.with(parentCtx, () =>
tracer.startActiveSpan("my-tool", async (span) => {
try {
const result = await doWork(args);
return result;
} finally {
span.end();
}
})
);
});
Lectures complémentaires
-
[Conventions sémantiques OpenTelemetry GenAI](https://opentelemetry.io/docs/specs/semconv/gen-ai/) dans la documentation OpenTelemetry -
[Conventions sémantiques MCP OpenTelemetry](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/) dans la documentation OpenTelemetry -
[Kit de développement logiciel (SDK) Python OpenTelemetry](https://opentelemetry.io/docs/instrumentation/python/) dans la documentation OpenTelemetry