本文へ移動
AI Dev Lab Japan AI開発ツール、AIコーディングエージェント、M...

AIエージェントの実行ログ設計:trace・tool call・承認ログを事故調査に使える形で残す

AIエージェントの実行ログ設計で、trace、tool call、承認ログ、metrics、logsを分けて示すアイキャッチ

3行まとめ

Visual本番導入で分けて見る3つのログAIエージェントの実行を、調査、観測、監査の目的別に整理します。
debugログ

開発中の不具合確認に使い、本番の証跡とは分けて扱います。

observability

trace、metrics、logsで処理経路、遅延、異常、コストの入口を作ります。

audit trail

tool call、approval、external requestをつなぎ、誰が何を見て実行したかを残します。

相関ID

run ID、thread/session ID、tool call ID、approval ID、external request IDで横断調査できるようにします。

うまく動いた記録ではなく、あとから説明できる記録として設計します。

  • AIエージェントの実行ログは、debugログ、observabilityのtrace・metrics・logs、監査用のtool call・承認ログに分けて設計します。
  • 事故調査で必要なのは、run ID、thread/session ID、tool call ID、approval ID、external request IDをつなぎ、「誰が、何を見て、何を実行したか」を遡れることです。
  • OpenAI Agents SDK、LangSmith、Mastra、OpenTelemetryの公式情報を2026-06-14に確認し、本文ではX検索の需要シグナルを事実根拠にしていません。

AIエージェントは、動いた瞬間よりも、あとから説明できるかで本番導入の難しさが変わります。うまくいったrunだけを見るなら、traceの画面やconsole logで足りるかもしれません。けれど、顧客へ誤送信した、社内データを読ませすぎた、tool callが連鎖してコストが跳ねた、承認したはずのない操作が走った。こうした場面では、ログの量ではなく、証跡のつながりが必要です。

この記事では、AIエージェントの実行ログを事故調査、実行後レビュー、コスト確認に使える形へ分解します。OpenAI Agents SDKのtracing、guardrails、LangSmithとMastraのobservability、OpenTelemetryのtraces、logs、metricsを参照しつつ、特定vendorの導入手順ではなく、どの基盤でも最初に決めるべき設計項目に絞ります。

この記事でわかること

Visual読後に整理できる論点AIエージェントのログ設計で、先に決めるべき観点を並べます。
ログの分離

debug、observability、audit trailを目的と保存先で分けます。

IDのつなぎ方

run、thread、tool call、approval、external requestを同じ調査線で追えるようにします。

保存する情報

traceに残す属性と、hash、参照ID、要約へ寄せる情報を分けます。

副作用の証跡

tool callログを、外部世界への操作を説明する台帳として設計します。

承認と調査

承認者、表示内容、却下、編集、期限切れ、実行結果を調査できる形にします。

trace画面だけでなく、承認と外部実行まで含めた運用設計として見ます。

  • AIエージェントのログをdebug、observability、audit trailに分ける理由
  • run ID、thread/session ID、tool call ID、approval ID、external request IDのつなぎ方
  • traceに残してよい情報と、hash、参照ID、要約へ寄せる情報の分け方
  • tool callログを副作用の証跡台帳として設計する方法
  • 承認ログに残すべき承認者、表示内容、却下、編集、期限切れ、実行結果
  • metricsとlogsをコスト確認、異常検知、事故調査の入口にする考え方
  • ZDRやPII、secret、private repo情報を含む業務で注意する保存先とアクセス権

すでにtrace、metric、logの一般的な計装設計を整理したい場合は、公開済みの<a href="https://ai-dev.blog.mo-gmo.com/codex-observability-instrumentation-trace-metric-log-alert-review/">Codexにobservability計装を任せる前に決めること</a>が近い入口です。この記事では、そこから一段絞って、AIエージェントのrun、tool call、approval、audit trailに焦点を当てます。

前提知識

Visualログの3分類同じログでも、使う目的が違えば保存先と閲覧者も変わります。
項目内容見方
debugログ一時的なconsole出力や例外stackで、開発中の不具合確認に使います。
observabilitytrace、span、logs、metricsで処理経路、傾向、異常を見ます。
audit trailtool call台帳やapproval snapshotで、実行責任と承認を説明します。
guardrails入力や出力を止める仕組みであり、誰が何を許可したかを残す承認ログとは別に扱います。

ZDRが必要な業務では、OpenAI側のtraceに頼る前提ではなく、自社側の監査ログも設計します。

AIエージェントの実行ログを考えるとき、まず「ログ」という言葉を分けます。開発中に読むdebugログ、処理経路を追うtrace、傾向を見るmetrics、個別eventを残すlogs、監査のためのtool call台帳、承認ログは、目的も保存先も違います。

OpenAIのAgents guideでは、1回のモデル呼び出しとtool、アプリ側ロジックで足りるならResponses APIを使い、アプリ側がorchestration、tool execution、approvals、stateを持つ場合にAgents SDKのページを参照する整理になっています。つまり、SDKを使う時点で「アプリ側が何を保存し、どこで承認し、何を観測するか」を決める領域が増えます。

OpenAI Agents SDKのtracing docsでは、LLM generation、tool call、handoff、guardrail、custom eventなどがtrace対象として説明されています。tracingはデフォルトで有効ですが、Zero Data Retentionの組織では利用できないという注意もあります。ZDRが必要な業務では、OpenAI側のtraceに頼る前提ではなく、自社側の監査ログを別に設計します。

LangSmithはtraceをrunの集合として扱い、multi-turn conversationをthreadでつなぐ考え方を説明しています。Mastraはagent run、workflow step、tool call、model interactionをtrace、logs、metricsで見る考え方を説明し、metricsではduration、token usage、cost estimateを扱います。OpenTelemetryでは、trace、log、metricが別のsignalとして整理されています。

実行ログを3種類に分ける

最初に分けるのは、次の3種類です。

種類目的代表例注意点
debugログ開発中の不具合確認一時的なconsole出力、例外stack本番の証跡にしない
observability処理経路、傾向、異常検知trace、span、logs、metricspromptやpayloadを残しすぎない
audit trail実行責任と承認の説明tool call台帳、approval snapshot監査要件、保存期間、閲覧権限を決める

評価基準

debugログは、開発者が一時的に読むためのものです。observabilityは、どこで遅いか、どこで失敗したか、どのtoolが多く呼ばれたかを見るためのものです。audit trailは、あとから「誰が何を見て、何を許可し、何が実行されたか」を説明するためのものです。

この3つを混ぜると、traceに顧客payloadを丸ごと入れたり、debugログだけで承認証跡を済ませたり、metricsだけで事故原因を説明しようとしたりします。設計の初期値としては、traceは道筋、tool callログは副作用、承認ログは責任の記録と考えると整理しやすくなります。

guardrailsと承認ログは別物

OpenAI Agents SDKのguardrails docsでは、入力や出力の検証、tripwireによる停止、blocking executionなどが説明されています。guardrailsは、危険な入力や不適切な出力を止める検査層として有効です。

注意点

ただし、guardrailsが止めたことと、人間が承認したことは別です。guardrailは「条件に合わないので止めた」を記録する材料になります。承認ログは「人間が何を見て、なぜ許可または却下したか」を残す材料です。どちらも必要ですが、同じテーブルに雑に押し込まない方が調査しやすくなります。

結果:最初に設計するのは5つのIDと3つのログ

Visual5つのIDでつなぐ調査線agent実行から外部APIまで、時刻だけに頼らず追跡できる形にします。
  1. 1run ID

    1回のagent実行を識別し、どの実行で起きたかを示します。

  2. 2thread/session ID

    会話や作業の連続性を識別し、どの文脈から発生したかを追います。

  3. 3tool call ID

    tool呼び出しを識別し、何を外部へ実行しようとしたかを残します。

  4. 4approval ID

    承認判断を識別し、誰が何を見て許可または却下したかをつなぎます。

  5. 5external request ID

    外部APIやDB更新を識別し、外部世界で何が実行済みかを確認します。

最小構成は、大きな監査基盤ではなく、IDの接続とログ種別の分離から始めます。

AIエージェントの実行ログ設計では、最初から大きな監査基盤を作る必要はありません。最小構成は、5つのIDをそろえ、3つのログを分けることです。

設計対象最小で決めること事故調査で答える質問
run_id1回のagent実行を識別するどの実行で起きたか
thread_id / session_id会話や作業の連続性を識別するどの文脈から発生したか
tool_call_idtool呼び出しを識別する何を外部へ実行したか
approval_id承認判断を識別する誰が何を見て許可したか
external_request_id外部APIやDB更新を識別する外部世界では何が実行済みか

この5つがないと、trace、アプリDB、承認画面、外部APIログ、CI artifact、チケットの間を人間が手作業でつなぐことになります。時刻だけで追う運用は、timezone、retry、queue、並列tool callが入った瞬間につらくなります。

3つのログは、次のように分けます。

ログ保存するもの保存しない初期値
trace/logsspan名、tool名、status、latency、error type、cost estimate、参照IDprompt全文、顧客payload全文、secret、内部URL
tool call audittool名、version、read/write、入力要約、payload hash、external ID、実行結果API key、cookie、private token、不要なraw response
approval log承認者、表示したsnapshot、判断、理由、期限、実行結果との紐づけ承認画面に出していない情報を後から混ぜた説明

ここまで決まれば、実装担当やCodexに依頼する単位がかなり具体的になります。「ログを足して」ではなく、「run_id、tool_call_id、approval_idを相関させ、tool inputはhashと要約だけ残し、raw payloadは保存しない」という依頼にできます。

traceはagent runからtool callまで一本の道筋で追う

Visualagent runから外部呼び出しまでのtrace1回の実行が、どの順番で進み、どこで止まり、何を呼んだかを見ます。
  1. 1agent run

    run ID、model、status、durationを持つ実行全体の入口です。

  2. 2model call

    LLM generationの状態を残し、全文ではなく分類済み属性を中心に扱います。

  3. 3tool call

    tool call ID、tool名、read/write区分、statusを残します。

  4. 4guardrailとapproval

    blocked reasonやapproval stateを、実行経路の中で確認できるようにします。

  5. 5external call

    external request ID、status、latencyを残し、外部API側の記録へつなげます。

spanは細かすぎても粗すぎても調査しにくいため、最初に粒度を決めます。

traceは、1回のagent runがどの順番で進んだかを見るための道筋です。OpenAI Agents SDKのtracingは、LLM generation、tool call、handoff、guardrailなどを追える設計になっています。MastraやLangSmithのobservabilityも、agent runやworkflow step、tool callを追う単位を持っています。

spanの粒度を先に決める

spanを細かくしすぎると、画面はにぎやかになりますが、事故調査では読みにくくなります。逆に粗すぎると、どのtoolで失敗したか、guardrailがどこで働いたか、retryが何回起きたかを追えません。

最初は次の粒度で十分です。

spanまたはevent残す属性
agent runsupport_reply_agent.runrun_id、model、status、duration
tool calltool.search_tickettool_call_id、tool名、read/write、status
guardrailguardrail.input_checkrule名、result、blocked reason
approvalapproval.requestedapproval_id、approval state
external callcrm.update_ticketexternal request ID、status、latency
erroragent.errorerror type、retryable、step

粒度の初期値

OpenTelemetryのtraceやspanの考え方に合わせるなら、1つのrunをroot traceとして扱い、その下にagent step、tool call、guardrail、approval待ち、外部APIをぶら下げます。vendor固有の実装は違っても、「何をspanにするか」を先に決める点は共通です。

prompt全文ではなく分類済み属性を残す

traceにpromptやtool argumentsを丸ごと残すと、デバッグは楽です。ただ、顧客情報、社内文書、private repo情報、API key、内部URL、未公開payloadがtrace基盤へ流れます。traceを見る権限を広くすると、二次的な情報漏えいの入口になります。

初期値は、全文保存ではなく分類済み属性です。

残す候補
tool名update_ticket_status
対象種別ticketpull_requestcustomer_profile
対象ID内部IDまたはマスク済みID
入力要約「statusをpendingからresolvedへ変更」
payload hash後から同一性を確認するためのhash
error typevalidation_errortimeoutpermission_denied
cost estimaterun単位、model call単位の概算

保存範囲

raw payloadが必要な業務もあります。その場合も、traceへそのまま入れるのではなく、アクセス権が狭い保存先へ置き、traceには参照IDだけを残す方が扱いやすいです。

ZDRが必要な業務では代替ログを決める

OpenAI Agents SDKのtracing docsでは、Zero Data Retentionの組織ではtracingが利用できないと説明されています。ZDRが必要な業務で「Agents SDKのtrace dashboardを見ればよい」という設計にすると、導入前提が崩れます。

この場合は、自社側で次のeventを残します。

agent_run_event:
  run_id: "run_20260614_001"
  thread_id: "thread_sample"
  actor_type: "user"
  agent_name: "support_reply_agent"
  event_type: "tool_call_requested"
  tool_name: "update_ticket_status"
  tool_call_id: "toolcall_001"
  input_summary: "ticket status update"
  input_hash: "sha256:dummy"
  approval_id: "approval_001"
  timestamp: "2026-06-14T09:24:00Z"
  pii_mode: "redacted"

この例は実データではありません。実務では、社内のセキュリティ、法務、監査担当と保存先、閲覧権限、保存期間を決めてから実装します。

tool callログは副作用の証跡台帳にする

Visual副作用台帳の必須列AIエージェントが外部世界へ何を実行しようとしたかを説明する台帳です。
項目内容見方
tool名とversiontool仕様の変化を追えるように、crm.updateticket@2026-06-14のように残します。
read/write区分read、draft、writeを分け、承認要否や影響範囲を判断します。
実行主体user tokenやservice accountなど、誰の権限で実行したかを追います。
対象resourceticket、repo、invoiceなど、影響した対象を特定します。
idempotency keyメール送信、DB更新、決済、Issue作成などの重複実行を調査しやすくします。

input/outputは全文保存を初期値にせず、summary、hash、参照IDを基本にします。

tool callログは、便利な引数保存ではありません。AIエージェントが外部世界へ何を実行しようとしたか、何を実行したかを残す台帳です。read-only toolとwrite toolを同じ粒度で扱うと、危険な操作の証跡が薄くなります。

toolごとに副作用と権限を記録する

tool call台帳には、最低限この列を持たせます。

理由
tool名とversioncrm.update_ticket@2026-06-14tool仕様の変化を追う
read/write区分readdraftwrite承認要否を分ける
実行主体user token、service account誰の権限で実行したかを追う
対象resourceticket、repo、invoice影響範囲を見る
input summary変更内容の要約承認画面と調査で読む
input hashsha256:...rawを残さず同一性を確認する
approval IDapproval_001人間判断と接続する
external IDAPI request ID、issue number外部世界の実行結果と接続する
statusrequested、approved、executed、failed現在地を追う

確認項目

特にwrite系toolでは、idempotency keyとexternal IDを必ず検討します。メール送信、DB更新、決済、GitHub Issue作成、CRM更新は、二重実行が事故になりやすい領域です。workflow側でresumeできることと、外部操作を二重実行しないことは別の設計です。

input/outputは3段階で扱う

tool inputやoutputの保存範囲は、3段階に分けます。

保存レベル使う場面注意点
全文保存法的・監査上、原文保存が必要な限定領域閲覧権限、削除、暗号化を厳しくする
マスク済み保存調査で内容の傾向が必要な領域redaction漏れをreviewする
hash・参照IDのみ多くの業務の初期値必要時に原本へ到達できる権限設計が必要

AIエージェントに渡したprompt、tool arguments、tool outputは、同じ感覚で保存しない方がよいです。promptにはユーザーの依頼や社内文脈が入り、tool argumentsには操作対象や変更内容が入り、tool outputには顧客情報や社内情報が返ることがあります。それぞれ機密度が違います。

read-onlyから始める

本番前のPoCでは、read-only toolから始める方が失敗を観察しやすくなります。write toolを入れる場合は、toolの説明、入力schema、実行前承認、実行ログ、ロール制御をセットで設計します。MCPやtool callingの権限境界を広く整理したい場合は、<a href="https://ai-dev.blog.mo-gmo.com/category/mcp/">MCPカテゴリ</a>の記事群も参考になります。

承認ログは誰が何を見て許可したかを残す

Visual承認に関わる4つのactor承認ボタンの事実だけでなく、表示内容と実行結果までつなげます。
  1. 1依頼者

    agent runを開始した人またはsystemを記録します。

  2. 2agent

    tool callを提案した実行体として、提案内容と理由を残します。

  3. 3承認者

    操作を許可、却下、編集、期限切れにした人と判断時刻を残します。

  4. 4実行者

    backendやservice accountなど、実際にAPIを呼んだ主体を分けて記録します。

  5. 5approval snapshot

    承認画面に表示したtool名、対象、差分、リスク、戻し方を保存します。

承認者と実行者を同じ言葉でまとめると、監査時に外部APIの責任境界が曖昧になります。

人間承認は、ボタンを押した事実だけでは足りません。事故調査で必要なのは、承認者が何を見て、どのリスクを理解し、どの操作を許可し、その後どのtool callが実行されたかです。

承認者と実行者を分ける

AIエージェントの承認では、少なくとも4つのactorが出ます。

actor役割
依頼者agent runを開始した人またはsystem
agenttool callを提案した実行体
承認者操作を許可または却下した人
実行者backendやservice accountなど、実際にAPIを呼んだ主体

承認者と実行者を同じ言葉でまとめると、監査時に「誰の権限で外部APIが呼ばれたのか」が曖昧になります。人間が承認しても、実行はagentやbackendが行います。ログには両方を残します。

承認画面に表示した内容をsnapshotにする

承認ログには、承認画面に表示した内容のsnapshotを残します。後から最新DBを見ても、承認時点で人間が見た情報とは限りません。

保存する項目
approval IDapproval_001
tool call IDtoolcall_001
表示したtool名crm.update_ticket
対象resourceticket ID、repo、customer ID
入力要約「statusをresolvedへ変更」
差分変更前後の要約
リスク顧客通知あり、課金影響なし
戻し方statusをpendingへ戻す
承認者user IDまたはrole
判断approved、rejected、edited、expired
判断理由任意の短いコメント

評価基準

却下、編集、期限切れ、再承認もeventにします。approvedだけを残すと、止めた判断や差し戻した理由が消えます。事故調査では「実行した証跡」と同じくらい「止めた証跡」も重要です。

承認ログとworkflow stateを混同しない

承認付きworkflowの設計は、公開済みの<a href="https://ai-dev.blog.mo-gmo.com/langgraph-mastra-human-approval-workflow-state-resume/">LangGraphとMastraで承認付きワークフローを設計する</a>で扱っています。この記事の焦点は、workflowをどう止めるかではなく、止めた時に何を残すかです。

workflow engineのstateは、再開のために必要です。承認ログは、説明責任のために必要です。両方を同じ保存先に置く場合でも、列と閲覧権限は分けます。

metricsとlogsは事故調査とコスト確認の入口にする

Visual調査入口になる指標metricsで傾向を見つけ、logsとtraceで個別eventへ降ります。
run count

agent runの増減を見て、急な利用増や停止を確認します。

tool call count per run

tool連鎖や想定外の呼び出し増加を見ます。

retry count

外部APIやguardrail周辺の詰まりを検知します。

approval wait time

承認待ちによる滞留と再開処理の影響を確認します。

approval rejection rate

危険操作や誤提案が増えていないかを見ます。

cost estimate

duration、token usage、tool call、handoffの増加をコスト確認につなげます。

平均応答時間だけでは、AIエージェントの事故原因やコスト増は見えにくくなります。

metricsは傾向を見るための入口です。logsは個別eventの証拠です。traceはその間をつないで、1つのrunの道筋を追います。

Mastraのobservability docsでは、traces、logs、metricsが相関IDを共有し、metric spikeからtraceやlogsへ移動できる考え方が説明されています。OpenTelemetryでも、traces、logs、metricsは別のsignalとして整理されています。AIエージェントでも、この分離はそのまま有効です。

metricsで見るもの

AIエージェントでは、平均応答時間だけを見ても足りません。次のmetricsを候補にします。

metric見たいこと
run countagent runの増減
run failure rate失敗率
tool call count per runtool連鎖や想定外の増加
retry count外部APIやguardrail周辺の詰まり
approval wait time承認待ちによる滞留
approval rejection rate危険操作や誤提案の増加
guardrail trigger count入力・出力検査で止まる頻度
token usagecontext肥大やhandoff増加
estimated costmodel callやtool連鎖による費用

コスト上振れは、モデル単価だけでは説明できません。tool再試行、長いcontext、handoff、承認待ち後の再開、失敗runが積み重なって増えます。費用を見るなら、run単位、team単位、tool単位で分けます。

logsで見るもの

logsは、あとから読むeventの証拠です。trace IDやrun IDを持たないlogは、事故調査で孤立します。

log event必須に近い属性
agent.run.startedrun ID、actor、agent名、entrypoint
tool.call.requestedrun ID、tool call ID、tool名、input summary
approval.requestedapproval ID、tool call ID、risk summary
approval.decidedapproval ID、decision、reviewer
tool.call.executedexternal request ID、status、latency
guardrail.triggeredrule名、blocked reason
agent.run.completedstatus、duration、cost estimate
agent.run.failederror type、retryable、next action

alertは、logsそのものではなく、metricsやeventの異常に置きます。想定外toolの試行、同一runでのtool call急増、guardrail発火の連続、承認却下率の上昇、cost上限接近は、早めに気づきたいシグナルです。

保存先とアクセス権を先に決める

Visual保存先ごとに決めること残す情報が増えるほど、保存先、閲覧権限、削除、保持期間の管理も増えます。
項目内容見方
OpenAI/SDK tracemodel call、tool call、guardrailなどのtraceを置き、ZDRやdata controlsを確認します。
observability vendortrace、logs、metrics、dashboardに転送するpromptやpayloadの範囲を確認します。
自社DBaudit trail、approval snapshot、tool台帳を置き、role、retention、削除を設計します。
CI artifact作業ログ、test結果、差分を置く場合は、公開repoや外部contributorに注意します。
ticket/postmortemtimeline、impact、action itemsを残し、個人情報や内部URLを削ります。
PIIとsecret顧客情報、API key、cookie、private key、raw prompt、raw tool outputは保存前に分類します。

ZDRだから何も残らないとは扱わず、OpenAI側、vendor側、自社側、通知先を分けて確認します。

実行ログ設計で一番危ないのは、「残しておけば安心」と考えることです。残すほど、保存先、閲覧権限、削除、保持期間、vendor転送の管理が増えます。

OpenAI側のtraceと自社側ログを分ける

OpenAI Agents SDKのtrace、LangSmithやMastraのobservability、自社DB、SIEM、CI artifact、Slack通知、チケットには、それぞれ別の保存先と閲覧者がいます。OpenAI側のdata controlsを確認しても、自社アプリ側のDBやログ基盤に残る情報は別管理です。

保存先置くもの注意点
OpenAI/SDK tracemodel call、tool call、guardrailなどのtraceZDRやdata controlsを確認する
observability vendortrace、logs、metrics、dashboardpromptやpayloadの転送範囲を見る
自社DBaudit trail、approval snapshot、tool台帳role、retention、削除を設計する
CI artifact作業ログ、test結果、差分公開repoや外部contributorに注意
ticket/postmortemtimeline、impact、action items個人情報や内部URLを削る

注意点

「ZDRだから何も残らない」と扱うのも危険です。OpenAI側の保存、vendor側の保存、自社側の保存、通知先、CI artifactは別です。どこに何が残るかを、ログ種別ごとに見ます。

PIIとsecretは保存前に分類する

保存前に分類する対象は、少なくとも次です。

  • 顧客メール、氏名、電話番号、住所、決済情報
  • 社内文書、private repo情報、未公開仕様
  • API key、access token、cookie、private key
  • 内部URL、管理画面URL、staging host
  • raw prompt、raw tool arguments、raw tool output
  • 外部APIのraw response

初期値は、redaction、hash、参照IDです。全文保存が必要な場合は、アクセス権を狭くし、削除方法と保持期間を明記します。

失敗点

Visual残しすぎと残さなすぎの落とし穴便利さだけでログを増やすと、あとから調査と管理の両方が難しくなります。
prompt全文を残す

顧客情報や社内文脈が入りやすく、traceの閲覧範囲がそのままリスクになります。

tool引数を丸ごと残す

外部操作の対象やraw payloadが残り、必要以上の情報を広げる可能性があります。

approvedだけを残す

承認者が何を見て、なぜ許可したのかをあとから説明できません。

metricsだけで原因を見る

異常の入口は見えても、個別eventやtool callの実行結果までは追えません。

保存先だけ増える

trace、DB、Slack、ticket、CI artifactのアクセス権が揃わないと、管理が崩れます。

初期値は、分類済み属性、要約、hash、参照IDに寄せるほうが扱いやすくなります。

AIエージェントの実行ログでよくある失敗は、残しすぎと残さなすぎの両方です。

traceにpromptとtool引数を丸ごと残す

最初は便利です。何が起きたかすぐ分かります。しかし、promptには顧客情報や社内文脈が入り、tool引数には外部操作の対象やraw payloadが入ります。trace基盤の閲覧権限が広い場合、そこが機密情報の倉庫になります。

対策は、分類済み属性、要約、hash、参照IDを初期値にすることです。raw payloadが必要な業務だけ、別の保存先と閲覧権限で扱います。

承認ログにapprovedだけを残す

承認ボタンを押した事実だけでは、事故調査に耐えません。何を見たのか、どの差分だったのか、承認者は誰か、却下や編集はあったのか、承認後にどのtoolが実行されたのかが必要です。

approvedだけのログは、監査ログではなく操作履歴に近いものです。承認snapshot、decision reason、executed tool callをつなげます。

metricsだけで事故原因を見ようとする

metricsは入口です。失敗率やlatencyの上昇は、調査のきっかけにはなりますが、原因の説明には足りません。metric spikeからtrace、tool callログ、approval snapshotへ移動できるリンクが必要です。

保存先が増えたのにアクセス権を揃えない

OpenAI側trace、observability vendor、自社DB、CI artifact、Slack通知、チケットに情報が散ると、削除と最小権限が難しくなります。ログ設計では、保存先を増やすたびに閲覧roleとretentionを決めます。

実務で使うなら

Visual最小PoCの依頼packet実装コードより先に、IssueやPR descriptionへ貼れる形で条件をそろえます。
項目内容見方
対象agentsupportreplyagentのように、どのagent実行を対象にするかを書きます。
対象toolsearchticket、draftreply、updateticketstatusなど、対象toolを列挙します。
相関IDrunid、threadid、toolcallid、approvalid、externalrequestidを必須にします。
保存するeventrun started、tool requested、approval decided、tool executed、run completedを決めます。
redactionemail、token、private repo URLをmaskし、tool inputはsummaryとhashに寄せます。
review観点1つのrun IDから、trace、tool call、approval、external APIまで追えるかを確認します。

保存期間は例では決めず、社内規定、契約、法務、監査要件に合わせます。

最小PoCでは、次の依頼packetを作ると始めやすいです。実装コードより先に、社内IssueやPR descriptionへ貼れる形にします。

項目記入例
対象agentsupport_reply_agent
対象toolsearch_ticketdraft_replyupdate_ticket_status
相関IDrun_idthread_idtool_call_idapproval_idexternal_request_id
保存するeventrun started、tool requested、approval decided、tool executed、run completed
保存しないfieldraw prompt、raw customer payload、secret、internal URL
redactionemail、token、private repo URLをmask
tool inputsummaryとhashのみ
approval snapshot表示したtool名、対象、差分、リスク、戻し方
metricsrun count、failure rate、tool calls per run、approval wait、token usage、cost estimate
review queryrun IDからtimelineを再構成できるか
retentiontrace 30日、approval audit 1年など、社内規定に合わせる
owneragent owner、security reviewer、on-call

ここで書いたretentionは例です。実際の保存期間は、社内規定、契約、法務、監査要件に合わせます。

最初のレビュー観点

reviewでは、ログが多いか少ないかではなく、次を見ます。

  • 1つのrun IDから、trace、tool call、approval、external APIまで追えるか
  • tool input/outputにPIIやsecretが残っていないか
  • 承認ログに、承認時点で表示した情報が残っているか
  • ZDRやdata controlsが必要な業務で、OpenAI側traceに依存していないか
  • metricsからtraceやtool callログへ移動できるか
  • 削除要求や閲覧権限の変更に対応できるか

レビューで止める条件

事故後の調査手順を組み立てるなら、<a href="https://ai-dev.blog.mo-gmo.com/codex-log-investigation-packet-timestamp-redaction-evidence/">Codexにログ調査を頼む前に決めること</a>も合わせて読むと、timeline、evidence、next actionへつなげやすくなります。

セキュリティ・コスト注意

Visual後回しにしない確認項目セキュリティとコストは、運用後に直しにくい前提として扱います。
secretを入れない

traceやlogへAPI key、cookie、private keyを入れないようにします。

raw保存を初期値にしない

raw prompt、raw tool arguments、raw tool outputを全文保存しない設計から始めます。

転送範囲を見る

observability vendor、CI artifact、Slack通知、ticketへ何が出るかを確認します。

閲覧権限を分ける

debug担当、on-call、security reviewer、audit reviewerで見られる範囲を変えます。

コストの増え方を見る

tool call、retry、handoff、context、承認待ち後の再開処理を確認します。

承認者がいる、traceがある、ZDRだから安全、という単純な見方は避けます。

AIエージェントの実行ログは、セキュリティとコストの両方に効きます。どちらも後回しにすると、運用後に直しにくくなります。

セキュリティ注意

  • traceやlogへsecret、API key、cookie、private keyを入れない
  • raw prompt、raw tool arguments、raw tool outputを初期値で全文保存しない
  • approval snapshotには、承認に必要な最小情報だけを残す
  • observability vendor、CI artifact、Slack通知、ticketへの転送範囲を確認する
  • 閲覧権限を、debug担当、on-call、security reviewer、audit reviewerで分ける
  • ZDRやdata controlsが必要な業務では、OpenAI側traceと自社側audit logを分ける

承認者がいるから安全、traceがあるから安全、ZDRだから安全、という単純な見方は避けます。安全性は、保存しない情報、残す情報、見られる人、削除できる範囲をセットで決めて初めて評価できます。

コスト注意

コストは、モデル呼び出しだけではありません。tool callが増える、retryが増える、handoffが増える、contextが長くなる、承認待ち後に再開処理が増える。これらが積み重なると、予算超過やrate limitに近づきます。

runごとのtoken usageとestimated costを持つだけでなく、tool calls per run、retry count、guardrail trigger count、approval rejection rateも見ると、無駄なrunを早く見つけやすくなります。運用予算の設計は、公開済みの<a href="https://ai-dev.blog.mo-gmo.com/codex-usage-budget-guardrails-runaway-tasks-alerts/">Codexの使いすぎを防ぐ前に決めること</a>ともつながります。

FAQ

Visualよくある判断の分岐運用前に迷いやすい質問を、設計判断として整理します。
tracingを切る場合

run ID、tool call、approval、error、cost estimateを追える代替ログが必要です。

全文保存しない場合

対象ID、入力要約、payload hash、external request ID、承認snapshotで調査できる範囲を確認します。

workflow engine

再開用のstate保存と、監査に耐える承認snapshotは別物として考えます。

LangSmithやMastra

observabilityの入口になっても、自社の承認、保存期間、閲覧権限は別に設計します。

ZDRが必要な業務

OpenAI側traceに依存せず、自社側の監査ログと削除手順を先に決めます。

便利な観測基盤と、監査に必要な証跡は同じものとして扱わないようにします。

tracingを切っても運用できますか?

できます。ただし、run ID、tool call、approval、error、cost estimateを追える代替ログが必要です。ZDRが必要な業務では、OpenAI側tracingに依存しない自社側audit trailを用意します。

tool inputを全文保存しないと調査できませんか?

常に全文が必要とは限りません。多くの事故調査では、対象ID、入力要約、payload hash、external request ID、承認snapshotがあれば、何が起きたかを追えます。全文が必要な業務では、保存先と閲覧権限を狭くします。

承認ログはworkflow engineに任せればよいですか?

workflow engineのstate保存と、監査に耐える承認snapshotは別物として考えます。再開のためのstateには十分でも、承認者が見た内容、却下理由、実行結果との紐づけが足りないことがあります。

LangSmithやMastraを使えば監査ログは完成しますか?

いいえ。observability基盤は強力ですが、自社の監査要件、保存期間、閲覧権限、削除、承認者ロールまでは別に設計します。vendorのtraceやmetricsは、audit trailの一部として扱うのが安全です。

次に読むなら

AIエージェント、MCP、observability、承認付きworkflowの仕様更新を追いたい場合は、<a href="https://ai-dev.blog.mo-gmo.com/newsletter/">ニュースレター</a>で更新通知を受け取れます。チーム導入や監査ログ設計の相談は、<a href="https://ai-dev.blog.mo-gmo.com/contact/">お問い合わせ</a>から送れます。

参照した主な情報源

  • https://developers.openai.com/api/docs/guides/agents
  • https://openai.github.io/openai-agents-python/tracing/
  • https://openai.github.io/openai-agents-python/guardrails/
  • https://docs.langchain.com/langsmith/observability
  • https://docs.langchain.com/langsmith/observability-concepts
  • https://docs.langchain.com/langsmith/observability-quickstart
  • https://mastra.ai/docs/observability/overview
  • https://mastra.ai/docs/observability/tracing/overview
  • https://mastra.ai/docs/workflows/overview
  • https://opentelemetry.io/docs/concepts/signals/traces/
  • https://opentelemetry.io/docs/concepts/signals/logs/
  • https://opentelemetry.io/docs/concepts/signals/metrics/

更新履歴

Visual確認した一次情報と更新日この記事がどの時点の確認に基づくかを残します。
  1. 2026-06-14

    初版。OpenAI Agents guide、OpenAI Agents SDK tracing/guardrails、LangSmith、Mastra、OpenTelemetryの公式情報を確認して作成。

  2. 需要シグナル

    X検索結果は需要シグナルとしてのみ扱い、本文根拠には使っていません。

ログやdata controlsの扱いは変わる可能性があるため、確認日を明示します。

日付内容
2026-06-14初版。OpenAI Agents guide、OpenAI Agents SDK tracing/guardrails、LangSmith、Mastra、OpenTelemetryの公式情報を確認して作成。X検索結果は需要シグナルとしてのみ扱い、本文根拠には使っていません。