Hinweis
Copilot SDK ist zurzeit in Technische Preview. Funktionalität und Verfügbarkeit können geändert werden.
GitHub Copilot SDK bietet integrierte Unterstützung für die Konfiguration von OpenTelemetry im CLI-Prozess und die Weitergabe von W3C Trace Context zwischen SDK und CLI.
Beispiele in Python, Go und .NET finden Sie im github/copilot-sdkRepository.
Integrierte Telemetrieunterstützung
Um die Telemetrie zu aktivieren, stellen Sie beim Erstellen des Clients folgendes TelemetryConfig bereit:
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",
},
});
TelemetryConfig-Optionen
| Auswahl | Node.js | Beschreibung |
|---|---|---|
| OTLP-Endpunkt | otlpEndpoint | OTLP HTTP-Endpunkt-URL |
| Dateipfad | filePath | Dateipfad für JSON-Zeilen-Ablaufverfolgungsausgabe |
| Exportertyp | exporterType |
`"otlp-http"` oder `"file"` |
| Quellname | sourceName | Name des Instrumentierungsbereichs |
| Erfassen von Inhalten | captureContent | Gibt an, ob Nachrichteninhalte erfasst werden sollen. |
Ablaufverfolgungskontext-Propagierung
Hinweis
Die meisten Benutzer benötigen dies nicht. Das TelemetryConfig oben ist alles, was Sie benötigen, um Ablaufverfolgungen von der CLI zu sammeln. Die Ablaufverfolgungskontextverteilung ist ein erweitertes Feature für Anwendungen, die eigene OpenTelemetry-Spans erstellen und möchten, dass sie in derselben verteilten Ablaufverfolgung wie die Spanne der CLI angezeigt werden.
Das SDK kann den W3C-Ablaufverfolgungskontext (traceparent/tracestate) an JSON-RPC Nutzlasten weitergeben, sodass die Spanne Ihrer Anwendung und die Spanne der CLI in einer verteilten Ablaufverfolgung verknüpft sind. Dies ist hilfreich, wenn Sie beispielsweise den SDK-Aufruf als untergeordnetes Element Ihrer Anforderungsbehandlungsspanne anzeigen möchten.
Ein detailliertes Sequenzdiagramm des Sitzungsflusses finden Sie im github/copilot-sdkRepository.
SDK zu CLI (ausgehend)
Stellen Sie eine onGetTraceContext Callback-Funktion für die Clientoptionen bereit. Dies ist nur erforderlich, wenn Ihre Anwendung bereits @opentelemetry/api verwendet und Sie Ihre Spannen mit den Spannen der CLI verknüpfen möchten. Das SDK ruft diesen Rückruf vor session.create, session.resumeund session.send RPCs auf:
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 zu SDK (eingehend)
Wenn die CLI einen Toolhandler aufruft, sind die traceparent und tracestate aus der CLI-Spanne verfügbar. Da das SDK keine OpenTelemetry-Abhängigkeit aufweist, werden diese als unformatierte Zeichenfolgen für das ToolInvocation Objekt übergeben. Stellen Sie den Kontext bei Bedarf manuell wieder her:
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();
}
})
);
});
Weiterführende Lektüre
-
[OpenTelemetry GenAI-Semantikkonventionen](https://opentelemetry.io/docs/specs/semconv/gen-ai/) in der OpenTelemetry-Dokumentation -
[OpenTelemetry MCP-Semantikkonventionen](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/) in der OpenTelemetry-Dokumentation -
[OpenTelemetry Python SDK](https://opentelemetry.io/docs/instrumentation/python/) in der OpenTelemetry-Dokumentation