Примечание.
Второй пилот SDK в настоящее время находится в Technical Preview. Функциональность и доступность могут меняться.
GitHub Copilot SDK имеет встроенную поддержку настройки OpenTelemetry на процессе CLI и распространения W3C Trace Context между SDK и CLI.
Примеры в Python, Go и .NET см. репозиторийgithub/copilot-sdk.
Встроенная поддержка телеметрии
Чтобы согласиться на телеметрию, при создании клиента укажите:TelemetryConfig
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
| Опция | Node.js | Описание |
|---|---|---|
| Конечная точка OTLP | otlpEndpoint | URL конечной точки OTLP HTTP |
| Путь к файлу | filePath | Путь файла для вывода JSON-lines trace |
| Тип экспортера | exporterType |
`"otlp-http"` или `"file"` |
| Имя источника | sourceName | Название области приборов |
| Захват контента | captureContent | Нужно ли фиксировать содержимое сообщений |
Распространение контекста следов
Примечание.
Большинству пользователей это не нужно. Вышеописанное — всё, TelemetryConfig что нужно для сбора трассировок из CLI. Распространение контекста трассировки — это продвинутая функция для приложений, которые создают собственные OpenTelemetry промежутки и хотят, чтобы они отображались в той же распределённой трассе, что и споведы CLI.
SDK может передавать W3C Trace Context (traceparent/tracestate) на JSON-RPC полезных нагрузках, чтобы span-и вашего приложения и CLI были связаны в одну распределённую трассу. Это полезно, например, когда вы хотите показать вызов SDK как дочерний диапазон обработки запросов.
Для подробной диаграммы последовательности сессионного потока см. репозиторийgithub/copilot-sdk.
SDK на CLI (исходящий маршрут)
Дайте обратный onGetTraceContext звонок по вариантам клиента. Это необходимо только если ваше приложение уже использует @opentelemetry/api это и вы хотите связать свои соны с спанами CLI. SDK вызывает этот обратный вызов перед session.create, session.resume, и 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 к SDK (входящий)
Когда CLI вызывает обработчик инструментов, traceparent доступны и tracestate от пролёта CLI. Поскольку SDK не зависит от OpenTelemetry, эти строки передаются на ToolInvocation объект в виде сырых строк. При необходимости восстанавливайте контекст вручную:
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();
}
})
);
});
Дополнительные материалы
-
[Семантические конвенции OpenTelemetry GenAI](https://opentelemetry.io/docs/specs/semconv/gen-ai/) в документации OpenTelemetry -
[Семантические конвенции OpenTelemetry MCP](https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/) в документации OpenTelemetry -
[OpenTelemetry Python SDK](https://opentelemetry.io/docs/instrumentation/python/) в документации OpenTelemetry