Nota:
SDK de Copilot actualmente está en Versión preliminar técnica. La funcionalidad y la disponibilidad están sujetas a cambios.
SDK de GitHub Copilot tiene soporte integrado para la configuración de OpenTelemetry en el proceso de la CLI y la propagación del contexto de seguimiento de W3C entre el SDK y la CLI.
Para obtener ejemplos en Python, Go y .NET, consulte el github/copilot-sdkrepositorio.
Compatibilidad con telemetría integrada
Para participar en la telemetría, proporcione al TelemetryConfig crear el cliente:
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",
},
});
Opciones de TelemetryConfig
| Opción | Node.js. | Descripción |
|---|---|---|
| Punto de conexión de OTLP | otlpEndpoint | Dirección URL del punto de conexión HTTP de OTLP |
| Ruta de acceso del archivo | filePath | Ruta de acceso del archivo para la salida de seguimiento de líneas JSON |
| Tipo de exportador | exporterType |
`"otlp-http"` o `"file"` |
| Nombre de origen | sourceName | Nombre del ámbito de instrumentación |
| Captura de contenido | captureContent | Si se va a capturar el contenido del mensaje |
Propagación del contexto de rastreo
Nota:
La mayoría de los usuarios no necesitan esto. Lo de arriba TelemetryConfig es todo lo que necesita para recopilar trazas de la CLI. La propagación del contexto de seguimiento es una característica avanzada para las aplicaciones que crean sus propios intervalos de OpenTelemetry y quieren que aparezcan en el mismo seguimiento distribuido que los intervalos de la CLI.
El SDK puede propagar el contexto de seguimiento de W3C (traceparent/tracestate) en cargas JSON-RPC para que las trazas de la aplicación y las trazas de la CLI estén vinculadas en un seguimiento distribuido. Esto resulta útil cuando, por ejemplo, quiere mostrar la llamada del SDK como elemento secundario del intervalo de control de solicitudes.
Para obtener un diagrama de secuencia detallado del flujo de sesión, consulte el github/copilot-sdkrepositorio.
SDK a CLI (saliente)
Proporcione un onGetTraceContext callback en las opciones del cliente. Esto solo es necesario si la aplicación ya usa @opentelemetry/api y quiere vincular los intervalos con los intervalos de la CLI. El SDK llama a esta devolución de llamada antes de session.create, session.resume y 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 a SDK (entrante)
Cuando la CLI invoca un controlador de herramientas, el traceparent y tracestate del ámbito de la CLI están disponibles. Dado que el SDK no tiene ninguna dependencia de OpenTelemetry, se pasan como cadenas sin formato en el ToolInvocation objeto . Restaure el contexto manualmente si es necesario:
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();
}
})
);
});
Lectura adicional
-
[Convenciones semánticas de OpenTelemetry GenAI](https://opentelemetry.io/docs/specs/semconv/gen-ai/) en la documentación de OpenTelemetry -
[Convenciones semánticas de MCP de OpenTelemetry](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/) en la documentación de OpenTelemetry -
[SDK de Python de OpenTelemetry](https://opentelemetry.io/docs/instrumentation/python/) en la documentación de OpenTelemetry