使用 OpenTelemetry 监控 Agent 使用情况
本文介绍了如何为 VS Code 中的 Copilot Chat Agent 交互启用和配置 OpenTelemetry 监控。
Copilot Chat 可以通过 OpenTelemetry (OTel) 导出跟踪 (traces)、指标 (metrics) 和事件 (events),使您能够深入了解 Agent 交互、LLM 调用、工具执行和 Token 使用情况。所有信号名称和属性均遵循 OTel GenAI 语义约定,因此数据适用于任何兼容 OTel 的后端。
采集的内容
Copilot Chat 会发出三种类型的 OTel 信号:跟踪、指标和事件。
跟踪 (Traces)
每个 Agent 交互都会产生一个分层跨度树 (span tree),捕捉完整的执行流程
invoke_agent copilot [~15s]
├── chat gpt-4o [~3s] (LLM requests tool calls)
├── execute_tool readFile [~50ms]
├── execute_tool runCommand [~2s]
├── chat gpt-4o [~4s] (LLM generates final response)
└── (span ends)
跟踪由三种跨度 (span) 类型组成
| 跨度 | 描述 | 关键属性 |
|---|---|---|
invoke_agent |
封装整个 Agent 的编排过程,包括所有 LLM 调用和工具执行 | Agent 名称、会话 ID、轮次计数、总 Token 使用量 |
chat |
单次 LLM API 调用 | 模型、Token 计数、响应时间、结束原因 |
execute_tool |
单次工具调用 | 工具名称、工具类型、持续时间、成功状态 |
当 Agent 调用子 Agent(例如通过 runSubagent 工具)时,跟踪上下文会自动传播。子 Agent 的 invoke_agent 跨度将作为父 Agent execute_tool 跨度的子级出现,从而在异步边界间生成连贯的跟踪树。
指标 (Metrics)
| 指标 | 类型 | 描述 |
|---|---|---|
gen_ai.client.operation.duration |
直方图 | LLM API 调用持续时间(秒) |
gen_ai.client.token.usage |
直方图 | Token 计数(输入和输出) |
copilot_chat.tool.call.count |
计数器 | 按名称和成功状态统计的工具调用 |
copilot_chat.tool.call.duration |
直方图 | 工具执行延迟(毫秒) |
copilot_chat.agent.invocation.duration |
直方图 | Agent 端到端持续时间(秒) |
copilot_chat.agent.turn.count |
直方图 | 每次 Agent 调用的 LLM 往返次数 |
copilot_chat.session.count |
计数器 | 已启动的聊天会话数 |
copilot_chat.time_to_first_token |
直方图 | 首个 SSE Token 的响应时间(秒) |
指标包含用于过滤的属性,例如 gen_ai.request.model、gen_ai.provider.name、gen_ai.tool.name 和 error.type。
活动
| 事件 (Event) | 描述 |
|---|---|
gen_ai.client.inference.operation.details |
包含模型、Token 和结束原因的完整 LLM 调用元数据 |
copilot_chat.session.start |
在新聊天会话开始时触发 |
copilot_chat.tool.call |
包含计时和错误详细信息的单次工具调用 |
copilot_chat.agent.turn |
包含 Token 计数的每轮 LLM 往返 |
资源属性
所有信号都携带这些资源属性
| 属性 | 值 |
|---|---|
service.name |
copilot-chat(可通过 OTEL_SERVICE_NAME 配置) |
service.version |
扩展版本 |
session.id |
每个 VS Code 窗口唯一 |
使用 OTEL_RESOURCE_ATTRIBUTES 添加自定义资源属性,以便按团队、部门或其他组织边界进行过滤
export OTEL_RESOURCE_ATTRIBUTES="team.id=platform,department=engineering"
内容采集
默认情况下,不会采集提示词内容、响应或工具参数。仅包含模型名称、Token 计数和持续时间等元数据。
要采集完整内容,请启用 github.copilot.chat.otel.captureContent 设置,或设置 COPILOT_OTEL_CAPTURE_CONTENT=true。这将使用完整的提示词消息、响应消息、系统提示词、工具架构、工具参数和工具结果填充跨度属性。
内容采集可能包含敏感信息,如代码、文件内容和用户提示词。请仅在受信任的环境中启用此功能。
启用 OTel 监控
当以下任一条件为真时,OTel 即被激活
- github.copilot.chat.otel.enabled 为
true COPILOT_OTEL_ENABLED=true- 设置了
OTEL_EXPORTER_OTLP_ENDPOINT
VS Code 设置
打开 设置 (⌘, (Windows, Linux Ctrl+,)) 并搜索 copilot otel
| 设置 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| github.copilot.chat.otel.enabled | 布尔值 | false |
启用 OTel 发送 |
| github.copilot.chat.otel.exporterType | 字符串 | "otlp-http" |
otlp-http, otlp-grpc, console 或 file |
| github.copilot.chat.otel.otlpEndpoint | 字符串 | "https://:4318" |
OTLP 采集器端点 |
| github.copilot.chat.otel.captureContent | 布尔值 | false |
采集完整的提示词和响应内容 |
| github.copilot.chat.otel.outfile | 字符串 | "" |
JSON-lines 输出的文件路径 |
环境变量
环境变量始终优先于 VS Code 设置。
| 变量 | 默认值 | 描述 |
|---|---|---|
COPILOT_OTEL_ENABLED |
false |
启用 OTel。当设置了 OTEL_EXPORTER_OTLP_ENDPOINT 时也会启用。 |
COPILOT_OTEL_ENDPOINT |
OTLP 端点 URL(优先于 OTEL_EXPORTER_OTLP_ENDPOINT) |
|
OTEL_EXPORTER_OTLP_ENDPOINT |
标准 OTel OTLP 端点 URL | |
OTEL_EXPORTER_OTLP_PROTOCOL |
http/protobuf |
OTLP 协议。仅 grpc 会更改行为。 |
OTEL_SERVICE_NAME |
copilot-chat |
资源属性中的服务名称 |
OTEL_RESOURCE_ATTRIBUTES |
额外的资源属性 (key1=val1,key2=val2) |
|
COPILOT_OTEL_CAPTURE_CONTENT |
false |
采集完整的提示词和响应内容 |
OTEL_EXPORTER_OTLP_HEADERS |
认证请求头(例如 Authorization=Bearer token) |
配合可观测性后端使用
Copilot Chat 的 OTel 输出适用于任何支持 OTLP 协议的后端。将 github.copilot.chat.otel.otlpEndpoint 设置或 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量指向后端的 OTLP 接收 URL,并配置与后端协议相匹配的导出类型 (otlp-http 或 otlp-grpc)。
Aspire Dashboard
Aspire Dashboard 是本地开发最简单的选项。它是一个包含内置 OTLP 端点和跟踪查看器的单个 Docker 容器,无需云账户。
docker run --rm -d \
-p 18888:18888 \
-p 4317:18889 \
--name aspire-dashboard \
mcr.microsoft.com/dotnet/aspire-dashboard:latest
{
"github.copilot.chat.otel.enabled": true,
"github.copilot.chat.otel.exporterType": "otlp-grpc",
"github.copilot.chat.otel.otlpEndpoint": "https://:4317"
}
打开 https://:18888 并转到 Traces 查看您的 Agent 交互跨度。
Jaeger
Jaeger 是一个开源分布式跟踪平台,可直接接收 OTLP 数据。
docker run -d --name jaeger -p 16686:16686 -p 4318:4318 jaegertracing/jaeger:latest
{
"github.copilot.chat.otel.enabled": true,
"github.copilot.chat.otel.otlpEndpoint": "https://:4318"
}
打开 https://:16686,选择服务 copilot-chat,然后选择 Find Traces。
Azure Application Insights
使用带有 Azure Monitor 导出器 的 OTel 采集器 (Collector) 将 Copilot Chat 遥测数据转发到 Application Insights。将 VS Code 的 github.copilot.chat.otel.otlpEndpoint 设置指向采集器的 OTLP 端点,并配置采集器将数据导出到您的 Application Insights 连接字符串。
Langfuse
Langfuse 是一个开源的 LLM 可观测性平台,具有原生的 OTLP 接收功能并支持 OTel GenAI 语义约定。
{
"github.copilot.chat.otel.enabled": true,
"github.copilot.chat.otel.otlpEndpoint": "https://:3000/api/public/otel",
"github.copilot.chat.otel.captureContent": true
}
使用 OTEL_EXPORTER_OTLP_HEADERS 环境变量设置认证请求头。有关详细信息,请参阅 Langfuse OTel 文档。
其他后端
任何兼容 OTLP 的后端均可使用,包括 Grafana Tempo、Honeycomb 和 Datadog。请参阅各后端的文档以获取 OTLP 接收设置。
安全与隐私
OTel 监控默认处于关闭状态,在您明确启用之前不会发送任何数据。您可以完全控制采集的内容和发送的目的地。
| 方面 | 详情 |
|---|---|
| 默认关闭 | 除非您明确启用,否则不会发送 OTel 数据。禁用时不会加载 OTel SDK,从而实现零运行时开销。 |
| 默认不采集内容 | 提示词、响应和工具参数需要通过 captureContent 显式选择加入。 |
| 默认属性中无 PII(个人身份信息) | 会话 ID、模型名称和 Token 计数不属于个人身份信息。 |
| 用户配置的端点 | 数据仅发送到您指定的位置。没有任何“回传”行为。 |