OpenTelemetry を使用したエージェント使用状況の監視

この記事では、VS Code における Copilot Chat エージェントのインタラクションについて、OpenTelemetry 監視を有効化および設定する方法を説明します。

Copilot Chat は OpenTelemetry (OTel) を介してトレース、メトリクス、イベントをエクスポートでき、エージェントのインタラクション、LLM 呼び出し、ツール実行、トークン使用量などを可視化できます。すべてのシグナル名と属性は OTel GenAI セマンティック規約に従っているため、データは OTel 互換のあらゆるバックエンドで機能します。

収集されるデータ

Copilot Chat は、トレース、メトリクス、イベントという 3 種類の OTel シグナルを出力します。

属性の名前空間

Copilot Chat は、以下の 3 つの名前空間の下で OTel 属性を出力します。

名前空間 ソース 使用タイミング
gen_ai.* OTel GenAI セマンティック規約 標準キーが存在する場合に使用
github.copilot.* GitHub Copilot CLI OpenTelemetry 規約と共有される、Copilot 専用の標準名前空間 新しいダッシュボード、アラート、クエリで推奨
copilot_chat.* 従来の VS Code 拡張機能用名前空間 レガシー。一部のキーは現在、github.copilot.* の同等キーと並行して二重に出力されます

レガシーな copilot_chat.* キーは、既存のコレクター、ダッシュボード、およびダウンストリームの消費者が変更なしで動作し続けるよう、無期限に出力されます。終了日はありません。このセクションの表では、二重に出力される行を「レガシー」と表記し、推奨されるキーへのポインタを示しています。

トレース

各エージェントのインタラクションは、実行フロー全体をキャプチャする階層的なスパンツリーを生成します。

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)

エージェントがサブエージェントを呼び出す際(例:runSubagent ツール経由)、トレースコンテキストは自動的に伝播されます。サブエージェントの invoke_agent スパンは、親エージェントの execute_tool スパンの子として表示され、非同期境界を越えて接続されたトレースツリーを作成します。

invoke_agent スパン

すべての LLM 呼び出しとツール実行を含む、エージェントオーケストレーション全体をラップします。

属性 説明
gen_ai.operation.name 常に invoke_agent
gen_ai.provider.name プロバイダー(例:github
gen_ai.agent.name エージェント名(例:copilot, copilotcli, claude
gen_ai.conversation.id 会話セッション ID
gen_ai.request.model 要求されたモデル
gen_ai.response.model 解決されたモデル
gen_ai.usage.input_tokens セッション全体での入力トークン合計
gen_ai.usage.output_tokens セッション全体での出力トークン合計
gen_ai.usage.cache_read.input_tokens 利用可能な場合のキャッシュ読み取り入力トークン
gen_ai.usage.cache_creation.input_tokens 利用可能な場合のキャッシュ作成入力トークン
github.copilot.agent.type builtin, custom, または plugin
github.copilot.git.repository Git リポジトリ内の場合、リモート URL
github.copilot.git.branch Git リポジトリ内の場合、アクティブなブランチ
github.copilot.git.commit_sha Git リポジトリ内の場合、現在のコミット
github.copilot.github.org GitHub リモートのみ、GitHub 組織の所有者
copilot_chat.repo.remote_url レガシー。github.copilot.git.repository を推奨
copilot_chat.repo.head_branch_name レガシー。github.copilot.git.branch を推奨
copilot_chat.repo.head_commit_hash レガシー。github.copilot.git.commit_sha を推奨
copilot_chat.turn_count このセッションでの LLM ラウンドトリップ数
error.type エラー発生時のエラークラス
gen_ai.input.messages 完全なプロンプトメッセージ(コンテンツキャプチャのみ)
gen_ai.output.messages 完全な応答メッセージ(コンテンツキャプチャのみ)
gen_ai.tool.definitions ツールスキーマ(コンテンツキャプチャのみ)

chat スパン

LLM API 呼び出しごとに 1 つのスパン

属性 説明
gen_ai.operation.name 常に chat
gen_ai.provider.name プロバイダー名
gen_ai.request.model 要求されたモデル
gen_ai.response.model 解決されたモデル
gen_ai.response.finish_reasons 停止理由(例:["stop"]
gen_ai.request.max_tokens 最大出力トークン数
gen_ai.request.temperature 設定されている場合の Temperature 値
gen_ai.request.top_p 設定されている場合の Top-p 値
gen_ai.usage.input_tokens この呼び出しの入力トークン数
gen_ai.usage.output_tokens この呼び出しの出力トークン数
gen_ai.usage.cache_read.input_tokens 利用可能な場合のキャッシュ読み取り入力トークン
gen_ai.usage.cache_creation.input_tokens 利用可能な場合のキャッシュ作成入力トークン
gen_ai.usage.reasoning.output_tokens 利用可能な場合の推論トークン数
gen_ai.usage.reasoning_tokens レガシー。gen_ai.usage.reasoning.output_tokens を推奨
copilot_chat.time_to_first_token 最初の SSE トークンまでの時間(ミリ秒)
server.address API ホスト名
error.type エラー発生時のエラークラス

execute_tool スパン

ツール呼び出しごとに 1 つのスパン

属性 説明
gen_ai.operation.name 常に execute_tool
gen_ai.tool.name ツール名(例:readFile
gen_ai.tool.type function または extension (MCP ツール)
gen_ai.tool.call.id ツール呼び出し識別子
github.copilot.tool.parameters.edit_type 編集ツールの場合:create, update, str_replace, または insert
github.copilot.tool.parameters.skill_name スキル呼び出しの場合
github.copilot.tool.parameters.mcp_server_name_hash MCP ツールの場合:サーバー名の SHA-256
github.copilot.tool.parameters.mcp_tool_name MCP ツールの場合:呼び出されたツール名
github.copilot.tool.parameters.command シェルツールの場合(コンテンツキャプチャのみ、切り詰め済み)
github.copilot.tool.parameters.file_path ファイルツールの場合(コンテンツキャプチャのみ)
github.copilot.tool.parameters.mcp_server_name MCP ツールの場合(コンテンツキャプチャのみ)
error.type エラー発生時のエラークラス
gen_ai.tool.call.arguments ツール入力引数(コンテンツキャプチャのみ)
gen_ai.tool.call.result ツール出力(コンテンツキャプチャのみ)

execute_hook スパン

フック実行ごとに 1 つのスパン(例:PreToolUse, Stop

属性 説明
gen_ai.operation.name 常に execute_hook
github.copilot.hook.decision pass, block, または non_blocking_error
github.copilot.hook.duration フック実行時間(秒)
github.copilot.hook.tool_names フックが対象とするツール(JSON 配列として)
copilot_chat.hook_type フックイベント(例:PreToolUse
copilot_chat.hook_result_kind success, error, または non_blocking_error
copilot_chat.hook_input フック入力ペイロード(切り詰め済み)
copilot_chat.hook_output 成功時のフック標準出力(切り詰め済み)
error.type エラー発生時のエラークラス

メトリクス

GenAI セマンティック規約のメトリクス

メトリクス タイプ 説明
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 トークンまでの時間(秒)

エージェントのアクティビティと結果に関するメトリクスは、すべてのインターフェース(インラインチャット、ローカルエージェント、Copilot CLI エージェント、Claude エージェント、Copilot コーディングエージェント)にわたるエージェントによるコード変更を追跡します。

メトリクス タイプ 説明
copilot_chat.edit.acceptance.count カウンター 編集の承諾および拒否の決定(インラインチャット、チャット編集、ハンクレベル)
copilot_chat.chat_edit.outcome.count カウンター ファイルレベルのチャット編集セッションの結果(承諾、拒否、保存)
copilot_chat.lines_of_code.count カウンター 承諾されたエージェントの編集によって追加または削除されたコード行数
copilot_chat.edit.survival.four_gram ヒストグラム 4-gram テキスト類似度サバイバルスコア (0-1)
copilot_chat.edit.survival.no_revert ヒストグラム No-revert(差し戻しなし)サバイバルスコア (0-1)
copilot_chat.user.action.count カウンター ユーザーのエンゲージメントアクション:コピー、挿入、適用、フォローアップ
copilot_chat.user.feedback.count カウンター チャット応答に対する高評価(サムズアップ)と低評価(サムズダウン)
copilot_chat.agent.edit_response.count カウンター 成功またはエラー別のエージェント編集応答数
copilot_chat.agent.summarization.count カウンター コンテキスト要約の結果(適用、失敗)
copilot_chat.pull_request.count カウンター CLI エージェント経由で作成されたプルリクエスト数
copilot_chat.cloud.session.count カウンター パートナーエージェント別のクラウドおよびリモートエージェントセッション数
copilot_chat.cloud.pr_ready.count カウンター リモートエージェントの PR 準備完了通知数

メトリクスには、gen_ai.request.modelgen_ai.provider.namegen_ai.tool.namecopilot_chat.edit.sourceerror.type などのフィルタリング用属性が含まれます。

イベント

イベント 説明
gen_ai.client.inference.operation.details モデル、トークン、終了理由を含む完全な LLM 呼び出しメタデータ
copilot_chat.session.start 新しいチャットセッションが開始されたときに出力
copilot_chat.tool.call タイミングとエラー詳細を含むツールごとの呼び出し
copilot_chat.agent.turn トークン数を含むターンごとの LLM ラウンドトリップ
copilot_chat.edit.feedback ユーザーがファイルレベルのエージェント編集を承諾または拒否
copilot_chat.edit.hunk.action ユーザーが個別のハンクを承諾または拒否
copilot_chat.inline.done インラインチャット編集が承諾または拒否
copilot_chat.edit.survival 承諾後にAI生成コードがどの程度残存しているかの定期的な測定
copilot_chat.user.feedback チャット応答に対するユーザーの投票(高評価または低評価)
copilot_chat.cloud.session.invoke クラウドまたはリモートエージェントセッションが開始

リソース属性

すべてのシグナルには、以下のリソース属性が含まれます。

属性
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 Open in VS Code Open in VS Code Insiders 設定を有効にするか、COPILOT_OTEL_CAPTURE_CONTENT=true を設定してください。これにより、スパン属性に完全なプロンプトメッセージ、応答メッセージ、システムプロンプト、ツールスキーマ、ツール引数、ツール結果が格納されます。

注意

コンテンツキャプチャには、コード、ファイル内容、ユーザープロンプトなどの機密情報が含まれる可能性があります。信頼できる環境でのみ有効にしてください。

OTel 監視の有効化

以下のいずれかの条件が真である場合、OTel がアクティブになります。

  • github.copilot.chat.otel.enabled Open in VS Code Open in VS Code Insiders true
  • github.copilot.chat.otel.dbSpanExporter.enabled Open in VS Code Open in VS Code Insiders true
  • COPILOT_OTEL_ENABLED=true
  • OTEL_EXPORTER_OTLP_ENDPOINT が設定されている

VS Code 設定

設定 (⌘, (Windows, Linux Ctrl+,)) を開き、copilot otel を検索します。

設定 タイプ 既定値 説明
github.copilot.chat.otel.enabled Open in VS Code Open in VS Code Insiders boolean false OTel 出力を有効化
github.copilot.chat.otel.exporterType Open in VS Code Open in VS Code Insiders string "otlp-http" otlp-http, otlp-grpc, console, または file
github.copilot.chat.otel.otlpEndpoint Open in VS Code Open in VS Code Insiders string "https://:4318" OTLP コレクターエンドポイント
github.copilot.chat.otel.captureContent Open in VS Code Open in VS Code Insiders boolean false プロンプトと応答の全内容をキャプチャ
github.copilot.chat.otel.maxAttributeSizeChars Open in VS Code Open in VS Code Insiders 整数 0 コンテンツ属性(プロンプト、ツール引数、ツール結果)ごとの最大文字数。0 は切り詰めを無効にします。バックエンドの属性ごとのサイズ制限に合わせて正の値を設定してください。
github.copilot.chat.otel.outfile Open in VS Code Open in VS Code Insiders string "" JSON-lines 出力用のファイルパス
github.copilot.chat.otel.dbSpanExporter.enabled Open in VS Code Open in VS Code Insiders boolean false Chat: Export Agent Traces DB コマンド用に OTel スパンをローカルの SQLite データベースに保存します。暗黙的に OTel を有効にします。

環境変数

環境変数は常に 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 のみが動作を変更します。
COPILOT_OTEL_PROTOCOL OTLP プロトコルを上書き(grpc または http)。OTEL_EXPORTER_OTLP_PROTOCOL より優先されます。
OTEL_SERVICE_NAME copilot-chat リソース属性のサービス名
OTEL_RESOURCE_ATTRIBUTES 追加のリソース属性(key1=val1,key2=val2
COPILOT_OTEL_CAPTURE_CONTENT false プロンプトと応答の全内容をキャプチャ
COPILOT_OTEL_MAX_ATTRIBUTE_SIZE_CHARS 0 コンテンツ属性の最大文字数を上書きします。0 は切り詰めを無効にします。maxAttributeSizeChars 設定よりも優先されます。
COPILOT_OTEL_LOG_LEVEL info 最小ログレベル:trace, debug, info, warn, または error
COPILOT_OTEL_FILE_EXPORTER_PATH すべてのシグナルを JSON-lines 形式でこのファイルに書き込みます。
COPILOT_OTEL_HTTP_INSTRUMENTATION false HTTP レベルの OTel インストルメンテーションを有効にします。
OTEL_EXPORTER_OTLP_HEADERS 認証ヘッダー(例:Authorization=Bearer token

コマンド

github.copilot.chat.otel.dbSpanExporter.enabled Open in VS Code Open in VS Code Insiders true の場合、Copilot Chat は OTel スパンをローカルの SQLite データベースに保存します。これは、OTLP バックエンドを実行せずにオフラインで検査したり、トレースデータを共有したりする際に便利です。

コマンド 説明
Chat: Export Agent Traces DB (github.copilot.chat.otel.exportAgentTracesDB) ローカルの SQLite スパンデータベースを .db ファイルとしてエクスポートします。dbSpanExporter.enabled 設定が true の場合のみ利用可能です。

バックグラウンドエージェントおよび Claude エージェントのトレース構造

OTel が有効になると、すべてのエージェントタイプが自動的にインストゥルメントされます。フォアグラウンドエージェントのトレースを有効にする設定は、Copilot CLI および Claude エージェントのトレースも有効にします。

Copilot CLI (バックグラウンドエージェント)

Copilot CLI SDK はチャット拡張機能と同じ VS Code プロセス内で実行され、サブエージェント、権限、フック、ツール呼び出しを含む詳細なトレース階層を生成します。拡張機能のラッパースパン (invoke_agent copilotcli, サービス copilot-chat) が SDK のネイティブスパン (サービス github-copilot) の親となります。両方ともコレクター内で同じトレースに表示されます。

CLI セッションでは、トレースビューアに表示される内容と同一の SDK 階層全体が、VS Code の Agent Debug Log パネルにも表示されます。デバッグパネルは SDK の内部トレースが常にアクティブであるため、OTel 出力が無効な場合でも機能します。

OTel 出力が無効な場合、デバッグパネルは自動的にプロンプトと応答の全内容をキャプチャします。OTel 出力が有効な場合、 github.copilot.chat.otel.captureContent Open in VS Code Open in VS Code Insiders 設定が、デバッグパネルと OTLP 出力両方のコンテンツキャプチャを制御します。

Copilot CLI (ターミナルセッション)

New Copilot CLI Session で開始されたターミナル CLI セッションは、別のプロセスで実行されます。OTel が有効な場合、拡張機能は COPILOT_OTEL_ENABLED および OTEL_EXPORTER_OTLP_ENDPOINT をターミナルプロセスに転送します。ターミナルトレースは、サービス github-copilot の下の独立したルートトレースとして表示され、拡張機能のトレースにはリンクされません。

CLI ランタイムは otlp-http のみをサポートしています。otlp-grpc が構成されている場合でも、ターミナル CLI は HTTP を使用します。同じポートで両方のプロトコルを処理するバックエンド(Aspire Dashboard など)は透過的に機能します。

Claude エージェント

OTel が有効な場合、Claude エージェントセッションは、GenAI セマンティック規約に従うサービス copilot-chat の下で拡張機能レベルのスパンを生成します。拡張機能は、Claude SDK メッセージを傍受し、ローカル HTTP サーバーを介して LLM 呼び出しをプロキシすることでスパンを作成します。

invoke_agent claude ルートスパンが各ユーザーリクエストをラップし、その下に chatexecute_tool、および execute_hook スパンがネストされます。ツールが Agent(Claude サブエージェントの呼び出し)である場合、子スパンである chat および execute_tool がその下にネストされ、サブエージェントの詳細な可視性が確保されます。

エージェントタイプによるフィルタリング

トレースビューアで service.name をフィルタリングして、特定のエージェントランタイムからのトレースを表示します。

service.name ソース
copilot-chat フォアグラウンドエージェント、CLI ラッパー、Claude エージェントスパン (拡張機能出力)
github-copilot CLI SDK ネイティブスパンおよび CLI ターミナルセッション
claude-code Claude Code サブプロセス SDK テレメトリ (CLAUDE_CODE_ENABLE_TELEMETRY が転送された場合)

copilot-chat サービス内で、エージェントタイプを gen_ai.agent.name で区別します。

gen_ai.agent.name エージェントタイプ
GitHub Copilot Chat フォアグラウンドエージェント (エージェントモード)
copilotcli CLI ラッパースパン
claude Claude エージェント

可観測性(オブザーバビリティ)バックエンドでの使用

Copilot Chat の OTel 出力は、OTLP プロトコルをサポートするすべてのバックエンドで機能します。 github.copilot.chat.otel.otlpEndpoint Open in VS Code Open in VS Code Insiders 設定または OTEL_EXPORTER_OTLP_ENDPOINT 環境変数をバックエンドの OTLP インジェスチョン URL に指定し、エクスポータータイプをバックエンドのプロトコル (otlp-http または otlp-grpc) に合わせて構成します。

Aspire Dashboard

Aspire Dashboard はローカル開発において最もシンプルなオプションです。組み込みの OTLP エンドポイントとトレースビューアを備えた単一のアプリであり、クラウドのアカウントは不要です。

Aspire CLI を使用してダッシュボードを開始できます。

aspire dashboard run

または、Docker コンテナイメージから同じスタンドアロンダッシュボードを実行することもできます。

docker run --rm -d -p 18888:18888 -p 4318:18890 --name aspire-dashboard \
  mcr.microsoft.com/dotnet/aspire-dashboard:latest

VS Code 設定

{
  "github.copilot.chat.otel.enabled": true,
  "github.copilot.chat.otel.captureContent": true
}

https://:18888 を開き、Traces に移動してエージェントインタラクションのスパンを表示します。

Screenshot showing agent interaction traces in the Aspire Dashboard with spans for invoke_agent, chat, and execute_tool.

Jaeger

Jaeger は、OTLP を直接受け入れるオープンソースの分散トレースプラットフォームです。

docker run -d --name jaeger -p 16686:16686 -p 4318:4318 jaegertracing/jaeger:latest

VS Code 設定

{
  "github.copilot.chat.otel.enabled": true,
  "github.copilot.chat.otel.otlpEndpoint": "https://:4318"
}

https://:16686 を開き、サービス copilot-chat を選択して Find Traces をクリックします。

Azure Application Insights

OTel CollectorAzure Monitor エクスポーター を使用して、Copilot Chat のテレメトリを Application Insights に転送します。VS Code の github.copilot.chat.otel.otlpEndpoint Open in VS Code Open in VS Code Insiders 設定をコレクターの OTLP エンドポイントに向け、Application Insights の接続文字列にエクスポートするようにコレクターを構成します。

既製のダッシュボードを使用したエンドツーエンドのセットアップについては、Monitor AI coding agents with Grafana を参照してください。このガイドでは、OTel Collector の実行、VS Code からの参照、および構築済みの Azure Managed Grafana ダッシュボードのインポート手順について説明しています。このダッシュボードでは、Copilot の操作、入力および出力トークン、チャットセッション、ツール呼び出し、モデル別の応答時間と TTFT を Application Insights から可視化します。

Langfuse

Langfuse は、OTLP ネイティブインジェスチョンを備え、OTel GenAI セマンティック規約をサポートするオープンソースの LLM 可観測性プラットフォームです。

VS Code 設定

{
  "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 docs を参照してください。

その他のバックエンド

Grafana TempoHoneycombDatadog など、OTLP 互換のあらゆるバックエンドが動作します。OTLP インジェスチョンの設定については、各バックエンドのドキュメントを参照してください。

その他のエクスポーターの例

デフォルトのエクスポーターは otlp-http です。バックエンドやデバッグワークフローに合わせて otlp-grpcconsole、または file に切り替えることができます。

OTLP/gRPC

{
  "github.copilot.chat.otel.enabled": true,
  "github.copilot.chat.otel.exporterType": "otlp-grpc",
  "github.copilot.chat.otel.otlpEndpoint": "https://:4317"
}

コンソール出力(クイックデバッグ)

{
  "github.copilot.chat.otel.enabled": true,
  "github.copilot.chat.otel.exporterType": "console"
}

ファイルベース出力(オフラインまたは CI)

{
  "github.copilot.chat.otel.enabled": true,
  "github.copilot.chat.otel.exporterType": "file",
  "github.copilot.chat.otel.outfile": "/tmp/copilot-otel.jsonl"
}

リモートコレクターの認証ヘッダーは、OTEL_EXPORTER_OTLP_HEADERS 環境変数(例:Authorization=Bearer your-token)を介してのみ設定可能です。

セキュリティとプライバシー

OTel 監視はデフォルトでオフであり、明示的に有効にするまでデータは出力されません。収集対象と出力先はすべて自分で制御できます。

項目 詳細
デフォルトでオフ 明示的に有効にしない限り、OTel データは出力されません。無効時には OTel SDK が読み込まれないため、ランタイムオーバーヘッドはゼロになります。
デフォルトでコンテンツを含まない プロンプト、応答、ツール引数は captureContent でのオプトインが必要です。
デフォルト属性に個人情報を含まない セッション ID、モデル名、トークン数は個人を特定できる情報ではありません。
ユーザー構成可能なエンドポイント データは指定した先にのみ送信されます。電話のような外部への自動的なデータ送信(phone-home)動作はありません。
© . This site is unofficial and not affiliated with Microsoft.