OpenTelemetry を使用したエージェント使用状況の監視
この記事では、VS Code における Copilot Chat エージェントのやり取りに対して OpenTelemetry 監視を有効化および構成する方法を説明します。
Copilot Chat は OpenTelemetry (OTel) を介してトレース、メトリクス、イベントをエクスポートでき、エージェントのやり取り、LLM 呼び出し、ツール実行、トークン使用量を可視化できます。すべてのシグナル名と属性は OTel GenAI セマンティック規約に従っているため、データは OTel 互換のあらゆるバックエンドで機能します。
収集されるデータ
Copilot Chat は、トレース、メトリクス、イベントという 3 種類の OTel シグナルを出力します。
トレース
エージェントの各やり取りは、完全な実行フローをキャプチャする階層的なスパンツリーを生成します。
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)
トレースを構成する 3 つのスパンタイプ
| スパン | 説明 | 主要な属性 |
|---|---|---|
invoke_agent |
すべての LLM 呼び出しやツール実行を含む、エージェントのオーケストレーション全体をラップします | エージェント名、会話 ID、ターン数、合計トークン使用量 |
chat |
単一の LLM API 呼び出し | モデル、トークン数、応答時間、終了理由 |
execute_tool |
単一のツール呼び出し | ツール名、ツールタイプ、期間、成功ステータス |
エージェントがサブエージェントを呼び出す際(例えば runSubagent ツール経由など)、トレースコンテキストは自動的に伝播されます。サブエージェントの invoke_agent スパンは、親エージェントの execute_tool スパンの子として表示され、非同期境界を越えて接続されたトレースツリーを生成します。
メトリクス
| メトリクス | タイプ | 説明 |
|---|---|---|
gen_ai.client.operation.duration |
ヒストグラム | LLM API 呼び出し期間(秒) |
gen_ai.client.token.usage |
ヒストグラム | トークン数(入力および出力) |
copilot_chat.tool.call.count |
カウンター | 名前および成功ごとのツール呼び出し |
copilot_chat.tool.call.duration |
ヒストグラム | ツール実行レイテンシ(ミリ秒) |
copilot_chat.agent.invocation.duration |
ヒストグラム | エージェントのエンドツーエンド期間(秒) |
copilot_chat.agent.turn.count |
ヒストグラム | エージェントの呼び出しあたりの LLM ラウンドトリップ数 |
copilot_chat.session.count |
カウンター | 開始されたチャットセッション |
copilot_chat.time_to_first_token |
ヒストグラム | 最初の SSE トークンまでの時間(秒) |
メトリクスには、gen_ai.request.model、gen_ai.provider.name、gen_ai.tool.name、error.type などのフィルタリング用属性が含まれます。
イベント
| イベント | 説明 |
|---|---|
gen_ai.client.inference.operation.details |
モデル、トークン、終了理由を含む完全な LLM 呼び出しメタデータ |
copilot_chat.session.start |
新しいチャットセッションが開始されたときに発行されます |
copilot_chat.tool.call |
タイミングとエラー詳細を含むツールごとの呼び出し |
copilot_chat.agent.turn |
トークン数を含むターンごとの 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"
コンテンツのキャプチャ
デフォルトでは、プロンプトの内容、応答、ツール引数はキャプチャされません。モデル名、トークン数、期間などのメタデータのみが含まれます。
完全なコンテンツをキャプチャするには、 github.copilot.chat.otel.captureContent 設定を有効にするか、COPILOT_OTEL_CAPTURE_CONTENT=true を設定してください。これにより、スパン属性に完全なプロンプトメッセージ、応答メッセージ、システムプロンプト、ツールスキーマ、ツール引数、ツール結果が格納されます。
コンテンツキャプチャには、コード、ファイル内容、ユーザープロンプトなどの機密情報が含まれる可能性があります。信頼できる環境でのみ有効にしてください。
OTel 監視の有効化
以下のいずれかの条件が真の場合、OTel はアクティブになります
- github.copilot.chat.otel.enabled が
trueである COPILOT_OTEL_ENABLED=trueOTEL_EXPORTER_OTLP_ENDPOINTが設定されている
VS Code 設定
設定 (⌘, (Windows, Linux Ctrl+,)) を開き、copilot otel を検索します
| 設定 | タイプ | 既定値 | 説明 |
|---|---|---|---|
| github.copilot.chat.otel.enabled | boolean | false |
OTel 出力を有効にする |
| github.copilot.chat.otel.exporterType | string | "otlp-http" |
otlp-http、otlp-grpc、console、または file |
| github.copilot.chat.otel.otlpEndpoint | string | "https://:4318" |
OTLP コレクターのエンドポイント |
| github.copilot.chat.otel.captureContent | boolean | false |
プロンプトと応答の完全な内容をキャプチャする |
| github.copilot.chat.otel.outfile | string | "" |
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 に移動して、エージェントのやり取りのスパンを表示します。
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
OTel Collector と Azure Monitor エクスポーター を使用して、Copilot Chat のテレメトリを Application Insights に転送します。VS Code の github.copilot.chat.otel.otlpEndpoint 設定をコレクターの OTLP エンドポイントに向け、コレクターが Application Insights の接続文字列にエクスポートするように構成します。
Langfuse
Langfuse は、ネイティブの OTLP 取り込みと OTel GenAI セマンティック規約のサポートを備えたオープンソースの LLM オブザーバビリティ・プラットフォームです。
{
"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 のドキュメントを参照してください。
その他のバックエンド
Grafana Tempo、Honeycomb、Datadog など、OTLP 互換のあらゆるバックエンドが機能します。各バックエンドのドキュメントで OTLP 取り込みのセットアップを参照してください。
セキュリティとプライバシー
OTel 監視はデフォルトでオフになっており、明示的に有効にするまでデータは発行されません。何が収集され、どこに送られるかを制御できます。
| 側面 | 詳細 |
|---|---|
| デフォルトでオフ | 明示的に有効にしない限り、OTel データは発行されません。無効時には OTel SDK が読み込まれないため、実行時のオーバーヘッドはゼロです。 |
| デフォルトでコンテンツなし | プロンプト、応答、ツール引数は、captureContent でのオプトインが必要です。 |
| デフォルト属性に個人情報なし | セッション ID、モデル名、トークン数は個人を特定できる情報ではありません。 |
| ユーザーが構成したエンドポイント | データは指定した先にのみ送信されます。「電話ホーム」のような動作はありません。 |