OTel: post-reload resumed turn emits `invoke_agent` root without input messages
まだ誰も着手していません。
- 主要言語
- Shell
- スター
- 11.2k
- フォーク
- 1.9k
- 平均マージ
- 14時間 16分
- マージ済み PR(30日)
- 6
説明
Describe the bug
When a running Copilot CLI turn in VS Code Agent Host is interrupted by a VS Code window reload and then continues after Agent Host reconnects, the new root invoke_agent span can omit gen_ai.input.messages even though message-content capture is enabled.
This is specific to the resumed/continued invocation path, not every turn:
- the ordinary user turn immediately before the reload emitted both
gen_ai.input.messagesandgen_ai.output.messageson itsinvoke_agentroot; - the post-reload continuation emitted
gen_ai.output.messages, but nogen_ai.input.messages, on its newinvoke_agentroot; - ordinary user turns immediately afterward again emitted both input and output.
The exporter was healthy and child chat/tool spans were present. Some later child model spans contained input content, so this was not a transport failure or a global content-capture setting problem.
In LangSmith, gen_ai.input.messages is mapped to the run input. The affected root therefore appears as No data in the trace/Turns UI even though the continued turn did useful work and produced child spans.
Affected version
Observed on 1.0.81-0 (the value recorded in both the root span's service.version and gen_ai.agent.version attributes).
The latest CLI installed locally is now 1.0.82, but I have not yet repeated the active-turn reload sequence on that version, so I cannot claim that version is affected.
Steps to reproduce the behavior
-
In VS Code, enable Agent Host OTel export and content capture:
{ "chat.agentHost.otel.enabled": true, "chat.agentHost.otel.exporterType": "otlp-http", "chat.agentHost.otel.captureContent": true, "chat.agentHost.otel.dbSpanExporter.enabled": true } -
Start a Copilot CLI / Agent Host request that performs enough tool work to remain active.
-
While the turn is still running, reload the VS Code window.
-
Let Agent Host reconnect and continue the existing turn.
-
Inspect the locally exported OTLP spans or the configured backend.
-
Compare the
invoke_agentroot created for the post-reload continuation with ordinary roots before and after it.
Observed result: the continuation root has output and child spans but no gen_ai.input.messages attribute.
Expected behavior
With content capture enabled, an invoke_agent root that continues a user-initiated turn after reconnect/reload should remain self-contained and include the originating user input in gen_ai.input.messages.
If a reconnect intentionally starts a separate continuation trace, it should still carry meaningful continuation input/context (and ideally an explicit link to the original invocation) so OTel backends do not display an input-less root.
Additional context
- VS Code:
1.136.1 - OS: macOS
- Integration: VS Code Agent Host using the Copilot SDK/runtime
- Export: OTLP/HTTP to LangSmith plus the Agent Host local SQLite span exporter
- No OTLP forwarding failures were present after reload.
- The affected root began immediately after the fresh Agent Host process started, before the next user message. Its predecessor ended just before reload, and the next ordinary user-message root had input normally. This is why the evidence points to the reload/resume lifecycle path rather than an intermittent exporter failure.
- The public SDK telemetry E2E test validates the
invoke_agentroot structurally, but currently checks captured input/output content only on childchatspans: https://github.com/github/copilot-sdk/blob/main/nodejs/test/e2e/telemetry.e2e.test.ts
A regression test that reloads/reconnects during an active turn and asserts root-level gen_ai.input.messages would cover this path without relying on a particular OTel backend.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
nodejs/test/e2e/telemetry.e2e.test.ts から始め、Agent Host のテレメトリパスにおけるアクティブターンの reload/reconnect ライフサイクルを追跡します。コンテンツキャプチャを有効にして継続シナリオを再現し、その後、再開された invoke_agent ルートに gen_ai.input.messages が含まれることを確認するカバレッジを追加して、テレメトリ E2E テストを実行します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- nodejs
- 領域
- observability-sre, testing-qa
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 活発
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 66/100