BETA_TRACING_ENDPOINTでdetailed beta tracingの送信先を変える
Claude CodeのBETA_TRACING_ENDPOINTとENABLE_BETA_TRACING_DETAILEDの組み合わせで、hookスパンや内容付き属性を含む詳細トレースの送信先を切り替える方法をまとめます。
BETA_TRACING_ENDPOINTとは何か
BETA_TRACING_ENDPOINT は、Claude Codeの「detailed beta tracing(詳細ベータトレーシング)」が出力するログとトレースの送信先を指定するOTLPエンドポイントです。ENABLE_BETA_TRACING_DETAILED=1 とセットで設定すると、通常のOTLPエクスポーター設定を経由せず、ログとトレースがこのエンドポイントに直接送られます。
この2変数は、Claude Codeが通常提供しているOpenTelemetry連携とは別枠の機能です。通常のOTEL_EXPORTER_OTLP_ENDPOINTが標準的な送信先を決めるのに対し、BETA_TRACING_ENDPOINTはdetailed beta tracingが有効なときだけ働きます。公式の説明が置き換え対象にしているのはログとトレースの送信先で、メトリクスは含まれていません。
有効化の手順と設定できる場所
detailed beta tracingを有効にする流れ
- 1
2変数を両方設定する
ENABLE_BETA_TRACING_DETAILEDを1にし、BETA_TRACING_ENDPOINTに送信先のOTLPエンドポイントを入れます。片方だけでは有効になりません。 - 2
設定する場所を選ぶ
シェル環境変数、ユーザー設定、管理設定(managed settings)のいずれかです。プロジェクト設定とローカル設定に書いた値は、起動時に捨てられます。
- 3
allowlistを確認する
インタラクティブなCLIセッションでは、組織がベータ機能のallowlistに登録されている必要があります。Agent SDKと
-p付きの非対話セッションは登録なしで動きます。
export ENABLE_BETA_TRACING_DETAILED=1
export BETA_TRACING_ENDPOINT=http://collector.example.com:4317
claudeプロジェクト・ローカル設定が対象外なのは、セッションの内容そのものを外へ出す変数だからです。公式の設定リファレンスは、この2変数とOTEL_LOG_RAW_API_BODIESを「チェックアウトしたリポジトリに握らせない変数」に分類しています。OTEL_LOG_TOOL_DETAILSなどの内容系の変数も、project・local設定ではオフにする値(0)だけが有効です。
有効化すると何が追加されるか
通常のトレーシングでは出ない情報が2種類増えます。
claude_code.hookスパン
Hookの実行を表すスパンです。hook_event(PreToolUseなど)、hook_name(PreToolUse:Writeのような完全名)、実行されたhookコマンド数のnum_hooks、所要時間のduration_msを持ちます。成功・ブロック・ブロックしない失敗・キャンセルの件数も属性に入ります。
このスパンはdetailed beta tracingが有効なときにしか現れません。CLAUDE_CODE_ENHANCED_TELEMETRY_BETAだけでは生成されません。
内容を含むスパン属性
new_context、system_reminders、system_prompt_preview、user_system_prompt、tool_input、response.model_outputが追加されます。安定したスパンスキーマには含まれません。さらに属性ごとに別のゲート変数があり、2変数だけでは中身が空のままです。
| 属性 | 付くスパン | 追加で必要な変数 |
|---|---|---|
new_context | 付くスパンinteraction(ユーザープロンプト) | 追加で必要な変数OTEL_LOG_USER_PROMPTS=1 |
new_context | 付くスパンllm_request(新しいメッセージとツール結果) | 追加で必要な変数OTEL_LOG_USER_PROMPTS=1 |
system_reminders / system_prompt_preview / user_system_prompt / response.model_output | 付くスパンllm_request | 追加で必要な変数OTEL_LOG_USER_PROMPTS=1 |
new_context | 付くスパンtool(ツール呼び出しの結果) | 追加で必要な変数OTEL_LOG_TOOL_CONTENT=1 |
tool_input | 付くスパンtool | 追加で必要な変数OTEL_LOG_TOOL_DETAILS=1 |
hook_definitions | 付くスパンhook | 追加で必要な変数OTEL_LOG_TOOL_DETAILS=1 |
OTEL_LOG_USER_PROMPTS=1を足すと、システムプロンプト全文を運ぶclaude_code.system_promptイベントも出ます。最初に新しいシステムプロンプトを送るときと、コンパクション後に出ます。内容の長さは既定で60 KBに切り詰められます。
スパンの階層とhookスパンの位置
Claude Codeのトレースは、ユーザーの1プロンプトごとにclaude_code.interactionというルートスパンから始まります。API呼び出し、ツール実行、hook実行がその子として並びます。
claude_code.interaction
├── claude_code.llm_request
├── claude_code.hook (detailed beta tracingが必要)
└── claude_code.tool
├── claude_code.tool.blocked_on_user
├── claude_code.tool.execution
└── (Agentツール) サブエージェントのllm_request / toolスパンサブエージェントのスパンは、親のclaude_code.toolスパンの下にぶら下がります。PreToolUsehookがツール呼び出しを遅延させた場合は、その時点のトレースコンテキストが保存されます。セッションを再開してツールが再実行されると、そのスパンは遅延したターンのclaude_code.interactionの子として合流します。
hook_definitions属性はOTEL_LOG_TOOL_DETAILS=1のゲートも受けます。hookスパンの設定内容まで見たいときは、この変数も要ります。
サブプロセスへのトレースコンテキスト伝播
トレーシングが有効な状態では、BashやPowerShellのサブプロセスにTRACEPARENT環境変数が自動的に渡されます。実行中のツール実行スパンのW3Cトレースコンテキストなので、TRACEPARENTを読むスクリプトは、その処理を同じトレースの子スパンにできます。
Claude CodeがAnthropicのAPIに直接接続している場合、モデルへのリクエストにはclaude_code.llm_requestスパンのコンテキストを載せたtraceparentヘッダーが付きます。APIからのtraceresponseヘッダーはスパンリンクとして記録されます。
ANTHROPIC_BASE_URLでプロキシを経由している場合、traceparentヘッダーとTRACEPARENT変数は既定では送られません。理由は、未知のヘッダーを拒否するプロキシがあるためです。プロキシ越しでも伝播させたいときは、CLAUDE_CODE_PROPAGATE_TRACEPARENT=1 を設定します。
Agent SDKや-p付きの非対話セッションは、逆に呼び出し元のTRACEPARENTとTRACESTATEを読みます。Claude Code側のスパンを、呼び出し元の分散トレースの子として表示できます。対話セッションは、CIやコンテナ環境の値を誤って引き継がないよう外部のTRACEPARENTを無視します。
query_sourceとquery_source_safeの違い
claude_code.llm_requestスパンには、どのサブシステムがリクエストを発行したかを示す属性が2種類あります。
query_sourceはrepl_main_threadやサブエージェント名をそのまま記録し、ENABLE_BETA_TRACING_DETAILEDが有効なときだけ出ます。query_source_safeは:を.に置き換え、ユーザー定義のエージェント名をagent.customにまとめた形です。値の例はrepl_main_threadやagent.builtin.general-purposeで、detailed beta tracingの有無にかかわらず常に出ます。v2.1.268以降の属性です。
組み込みエージェントの種類を追うだけなら、detailed beta tracingを入れなくてもquery_source_safeで足ります。
通常のTraces(beta)とどう使い分けるか
通常のトレーシングは、CLAUDE_CODE_ENABLE_TELEMETRY=1、CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1、OTEL_TRACES_EXPORTERの3つで有効にします。detailed beta tracingは、通常のTracesとは別に、専用の2変数で有効にします。
どちらの変数を足すか
通常のTraces(beta)
OTEL_EXPORTER_OTLP_*変数で送信先を決めます。claude_code.hookスパンも内容を含む属性も出ません。project・local設定には、オフにする値(OTEL_TRACES_EXPORTER=noneなど)だけ書けます。この扱いはv2.1.282以降です。
detailed beta tracing
BETA_TRACING_ENDPOINTがログとトレースの送信先を専用の変数で上書きします。hookスパンが出て、内容を含む属性もOTEL_LOG_*のゲート付きで出ます。project・local設定に書いても無視されます。
hookスパンや内容付き属性が欲しいなら、通常のTraces(beta)の設定だけでは足りません。hookの成否だけ追うなら通常のTraces(beta)に2変数を足す形、プロンプトやツール出力まで追うならOTEL_LOG_*のゲート変数も足す形になります。
管理設定がある環境で何が起きるか
管理設定でログやトレースの送信先を固定している場合、開発者が設定したBETA_TRACING_ENDPOINTは起動時に取り除かれます。取り除かれる条件は、管理設定が次のいずれかでログまたはトレースの行き先を決めているときです。
- ログ・トレース用の汎用またはシグナル別のエンドポイントや認証情報
otelHeadersHelper- ログまたはトレースのエクスポーター指定が
none・console・空のとき CLAUDE_CODE_ENABLE_TELEMETRYのオフ
メトリクス専用のエンドポイントや認証情報だけなら、BETA_TRACING_ENDPOINTは残ります。管理設定でメトリクスだけ別の収集先に向けている組織では、開発者側のdetailed beta tracingがそのまま働きます。
関連する挙動の変わり目(バージョン別)
- v2.1.217管理設定のOTLP送信先が固定される
それ以前は、すべての変数が設定ごとの優先順位に独立に従っていました。ユーザー設定やシェルのシグナル別エンドポイントで、管理側のコレクターから送信先を逸らせました。
- v2.1.251beta tracingの抜け道が塞がれる
開発者が設定した
BETA_TRACING_ENDPOINTが、管理設定で固定したコレクターを素通りしていました。プロジェクト設定からdetailed beta tracingや生APIボディのログを有効化できる不具合も、同じ版で直っています。 - v2.1.268query_source_safeが追加される
detailed beta tracingなしでも出る、安全な形のリクエスト発行元の属性です。
- v2.1.282OTEL変数がproject・localで無視される
テレメトリのON/OFFや送信先、内容の取得範囲を決めるOTEL系変数が、project・local設定で効かなくなりました。オフにする値は引き続き通ります。
管理設定でOTLPの送信先を固定している組織では、v2.1.251より前のバージョンが残っていないかが確認点です。
管理設定で組織全体に配布する
管理設定のenvブロックでこの2変数を配ると、開発者のシェル設定やユーザー設定より優先されます。
{
"env": {
"ENABLE_BETA_TRACING_DETAILED": "1",
"BETA_TRACING_ENDPOINT": "http://collector.example.com:4317"
}
}同じ変数がシェルと設定ファイルの両方にある場合は、設定ファイル側が勝ちます。設定ファイル同士では管理設定がユーザー設定より優先され、project・local設定はこの2変数を書けないので争いに加わりません。
Claude Desktopアプリやセルフホスト環境のランナーがセッションを起動する場合は例外です。起動環境が組み立てた値が優先され、すでに設定済みの変数について設定ファイルのenvは無視されます。無視された変数名はデバッグログに出ます。
効かないときの切り分け
設定したのに何も出ないときは、変数を捨てられているのか、条件が足りないのかで対処が分かれます。project・local設定で無視された変数の名前は、セッション内の/statusかclaude doctorで確かめられます。どちらも変数名だけを一覧し、値は表示しません。-pやAgent SDKでは起動時のnoticeが出ないので、コレクター側にデータが届いているかで確かめます。
Claude Desktopやセルフホストの起動環境に値を上書きされた場合は、無視された変数名がデバッグログに出ます。v2.1.289のclaude --helpには、デバッグ用に次の2つのオプションが載っています。
-d, --debug [filter] Enable debug mode with optional category
filtering (e.g., "api,hooks" or
"!1p,!file")
--debug-file <path> Write debug logs to a specific file path
(implicitly enables debug mode)claude --debug-file /tmp/claude-debug.log
grep -i "BETA_TRACING" /tmp/claude-debug.log次の表は、症状から原因を当てはめる早見表です。
| 症状 | まず疑うこと |
|---|---|
| hookスパンも内容付き属性も出ない | まず疑うことBETA_TRACING_ENDPOINTの入れ忘れ。ENABLE_BETA_TRACING_DETAILEDだけでは有効にならない |
.claude/settings.jsonに書いたが効かない | まず疑うことproject・local設定では2変数とも無視される。シェル・ユーザー設定・管理設定へ移す |
CLAUDE_CODE_ENHANCED_TELEMETRY_BETAだけ設定した | まず疑うこと通常のTraces(beta)が有効になるだけで、hookスパンは出ない |
| インタラクティブCLIで何も出ない | まず疑うこと組織のallowlist未登録の可能性。-pかAgent SDKなら登録不要なので、そちらで動作を確かめる |
スパンはあるがnew_contextが空 | まず疑うことOTEL_LOG_USER_PROMPTS・OTEL_LOG_TOOL_CONTENTのゲート未設定 |
| 管理設定を入れてから急に出なくなった | まず疑うこと管理設定がログ・トレースの送信先を決めたため、BETA_TRACING_ENDPOINTが取り除かれた可能性 |
内容を送るリスクの見立て
detailed beta tracingは、モデル応答やツール出力、システムプロンプトといった内容を伴う情報をトレーシングバックエンドへ送る機能です。OTEL_LOG_USER_PROMPTSやOTEL_LOG_TOOL_CONTENTをすべて有効にすると、会話の中身がそのままコレクターに届きます。
有効化する前に、送信先のコレクターと後段のログ基盤が、どこまでアクセス制御されているかを確かめる選択肢があります。hookの成否だけ追えれば足りる場合は、内容系のゲート変数を足さずに2変数だけで始める運用もできます。
まとめ
hookの実行状況をスパン単位で追いたいだけなら、2変数にゲート変数を足さない構成から始められます。プロンプトやツール出力まで送る場合は、送信先の統制と、管理設定でのコレクター固定がv2.1.251以降かどうかを先に確かめます。すでにHooksをHTTPエンドポイントで受ける構成なら、hookの成否をスパンでも並べて見られます。