使用 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.modelgen_ai.provider.namegen_ai.tool.nameerror.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 在 VS Code 中打开 在 VS Code Insiders 中打开 设置,或设置 COPILOT_OTEL_CAPTURE_CONTENT=true。这将使用完整的提示词消息、响应消息、系统提示词、工具架构、工具参数和工具结果填充跨度属性。

注意

内容采集可能包含敏感信息,如代码、文件内容和用户提示词。请仅在受信任的环境中启用此功能。

启用 OTel 监控

当以下任一条件为真时,OTel 即被激活

  • github.copilot.chat.otel.enabled 在 VS Code 中打开 在 VS Code Insiders 中打开 true
  • COPILOT_OTEL_ENABLED=true
  • 设置了 OTEL_EXPORTER_OTLP_ENDPOINT

VS Code 设置

打开 设置 (⌘, (Windows, Linux Ctrl+,)) 并搜索 copilot otel

设置 类型 默认值 描述
github.copilot.chat.otel.enabled 在 VS Code 中打开 在 VS Code Insiders 中打开 布尔值 false 启用 OTel 发送
github.copilot.chat.otel.exporterType 在 VS Code 中打开 在 VS Code Insiders 中打开 字符串 "otlp-http" otlp-http, otlp-grpc, consolefile
github.copilot.chat.otel.otlpEndpoint 在 VS Code 中打开 在 VS Code Insiders 中打开 字符串 "https://:4318" OTLP 采集器端点
github.copilot.chat.otel.captureContent 在 VS Code 中打开 在 VS Code Insiders 中打开 布尔值 false 采集完整的提示词和响应内容
github.copilot.chat.otel.outfile 在 VS Code 中打开 在 VS Code Insiders 中打开 字符串 "" 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 在 VS Code 中打开 在 VS Code Insiders 中打开 设置或 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量指向后端的 OTLP 接收 URL,并配置与后端协议相匹配的导出类型 (otlp-httpotlp-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 在 VS Code 中打开 在 VS Code Insiders 中打开 设置指向采集器的 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 TempoHoneycombDatadog。请参阅各后端的文档以获取 OTLP 接收设置。

安全与隐私

OTel 监控默认处于关闭状态,在您明确启用之前不会发送任何数据。您可以完全控制采集的内容和发送的目的地。

方面 详情
默认关闭 除非您明确启用,否则不会发送 OTel 数据。禁用时不会加载 OTel SDK,从而实现零运行时开销。
默认不采集内容 提示词、响应和工具参数需要通过 captureContent 显式选择加入。
默认属性中无 PII(个人身份信息) 会话 ID、模型名称和 Token 计数不属于个人身份信息。
用户配置的端点 数据仅发送到您指定的位置。没有任何“回传”行为。
© . This site is unofficial and not affiliated with Microsoft.