Agent SDK の見える化|OpenTelemetry で記録

公開 更新 著者 永上裕之仕事の自動化
AIエージェントの動きが、時間の流れにそって棒グラフの記録として画面に並んでいくイメージ

この記事の要点

  • Agent SDK は中で Claude Code を動かしていて、その Claude Code が OpenTelemetry の記録を出す。設定は環境変数で渡す
  • 記録は「数の集計・出来事・流れ」の3種類。どれも既定ではオフで、送り先の設定が要る
  • 既定では、AI が読み書きした中身は記録されない。中身まで残す設定は、保存先の承認を取ってから

活用例:社内で動かす AI エージェントの操作を、利用者ごとに記録して監査できるようにする

部署
情報システム・内部監査
使うもの
Claude Agent SDK・OpenTelemetry に対応した監視の仕組み
AIに任せる
依頼された調査や資料づくり
人が決める
記録の送り先・中身まで残すかどうか・保存期間

AI エージェントを社内で本番として動かすと、「どの道具を使ったのか」「1回の依頼にどれだけ時間とお金がかかったのか」「どこで失敗したのか」 を、あとから確かめたくなります。

この記事では、公式ドキュメント「Observability with OpenTelemetry」(2026年11月11日確認)にもとづいて、Claude Agent SDK の動きを OpenTelemetry という共通の形式で記録し、監視の仕組みに送る方法を整理します。SDK を本番で動かす全体の考え方は Agent SDK の本番運用(ホスティング) で解説しています。

結論:記録を出すのは中の Claude Code。設定は環境変数で渡す

Agent SDK は、中で Claude Code を子どもの処理として動かしています。 記録を出すのはその Claude Code で、SDK 自身は記録を作りません。SDK は設定を Claude Code に渡し、Claude Code が記録を送り先に直接送ります。

設定は 環境変数 で渡します。渡し方は2つです。

渡し方向いている場面
アプリを動かす環境に入れる本番。コードを変えずに、すべての query() に効く(公式のおすすめ)
query() の env オプションに入れる同じアプリの中で、エージェントごとに設定を変えたい時

TypeScript 版で env を指定すると、元の環境変数が置き換わります。 元の値も一緒に入れます。Python 版では、元の環境変数の上に足されます。

左にAIエージェント、真ん中に記録の3つの種類、右に監視の画面へ送られていく流れの図
左にAIエージェント、真ん中に記録の3つの種類、右に監視の画面へ送られていく流れの図(イメージ)

記録は3種類

種類中身有効にする設定
数の集計(メトリクス)トークン・費用・会話の数・書いた行数・道具の許可の判断OTEL_METRICS_EXPORTER
出来事(ログ)依頼・API の呼び出し・エラー・道具の結果を1件ずつOTEL_LOGS_EXPORTER
流れ(トレース)1回のやりとり・モデルへの依頼・道具の呼び出しを時間の帯で(ベータ)OTEL_TRACES_EXPORTER と CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1

どれも既定ではオフ です。CLAUDE_CODE_ENABLE_TELEMETRY=1 を入れ、少なくとも1つの送り先を選ぶと動き始めます。よくあるのは、3種類すべてを OTLP の HTTP で集める仕組み(コレクター)に送る形です。

動いているかの確かめ方と、2つの落とし穴

送ったあとは、集める仕組みの側に記録が届いているか で確かめます。

  1. 送り先の失敗は静かに捨てられる:送り先に届かなくてもエージェントは普通に動き、エラーも出ない。届いていない時は、送り先の側の記録を見る
  2. 画面に出す送り方(console)は使わない:SDK は標準出力をやりとりに使っているため、ぶつかってしまう。手元で見たい時は、手元に集める仕組みを立てて送る

短い処理で記録が抜ける時

記録はまとめて送られます。既定では 数の集計は60秒ごと、出来事と流れは5秒ごと です。処理がすぐ終わると、送り切る前に終わって記録が抜けることがあります。送る間隔を短くしておくと、抜けにくくなります。

流れ(トレース)で見えること

帯の名前中身
claude_code.interaction1回の依頼から返事までのやりとり全体
claude_code.llm_requestClaude への依頼1回ごと(モデル名・かかった時間・トークン数)
claude_code.tool道具の呼び出し1回ごと(許可待ちの時間と、実行そのものに分かれる)
claude_code.hookフックの実行1回ごと(詳しい記録の設定が別に要る)

サブエージェントの動きは、呼び出した親の道具の帯の下に入るので、任せた流れが1本につながって見えます。 同じ会話で何度も query() を呼んだ時は、会話の番号(session.id)で絞ると1本の時系列で見られます。自分のアプリが記録の流れを出している時は、その中にエージェントの流れが自動で入ります。

利用者ごとに記録を分ける

1つのアプリで多くの人に使ってもらう場合、そのままでは 記録に残るのはアプリの認証の情報で、実際に頼んだ人ではありません。 query() を呼ぶたびに、頼んだ人の情報を記録の属性として足すと、利用者ごとの監査記録 になります。

監査で特に使うのは、道具の許可の判断と結果(tool_decision・tool_result)、外部の道具の接続(mcp_server_connection)、権限のモードの変更(permission_mode_changed)です。サービスの名前も既定の claude-code から変えられるので、エージェントが複数ある時は名前で分けておきます。

機密の扱い

既定の記録には、AI が読み書きした中身は入りません。 かかった時間・モデル名・道具の名前などの形だけです。次の設定を入れると、中身も記録に入ります。

設定足されるもの
OTEL_LOG_USER_PROMPTS=1依頼の文
OTEL_LOG_TOOL_DETAILS=1道具に渡した内容(ファイルの場所・コマンドなど)
OTEL_LOG_TOOL_CONTENT=1ファイルの中身やコマンドの結果など
OTEL_LOG_RAW_API_BODIESAPI のやりとりの全文

公式ドキュメントでは、記録の保存先が、エージェントの扱うデータを保存してよいと承認されていない限り、入れないように とされています。

よくある質問

費用だけ知りたい時も、この仕組みが要りますか?

要りません。 使った量と費用は、SDK の返事の流れから直接読めます。Agent SDK の費用と使用量の記録 で解説しています。ふだんの Claude Code の監視の設定は Claude Code の利用状況の監視 でまとめています。

まとめ

出典

永上裕之

ユニコスクール株式会社 代表取締役。AIエージェント専門のスクール&コミュニティを運営しています。

この記事はAIを使って下書きし、著者が事実確認・加筆しています。ツールの機能や料金は変わることがあるため、最新の情報は各社の公式ページでご確認ください。

関連する記事