@maru

OpenTelemetry GenAI仕様 — プロンプト収集の禁止とエージェント追跡の標準化
AIエージェントや大規模言語モデル(LLM)を活用したバックエンドシステムが本番環境へ急速に拡大する中で、複雑な非同期処理の流れを透過的にデバッグすることが開発チームの核心課題として浮上しました。これまでは標準仕様が存在せず、各々が異なる方法でトレースデータを残していましたが、最近OpenTelemetryが専用のセマンティックコンベンションを策定し、標準化作業を完了しました。本稿では、新しいOpenTelemetryの仕様がどのように機密性の高いプロンプトの流出を防ぐセキュリティ設計を実現し、マルチエージェント環境における複雑な実行トレースの問題を解決するのかを解説します。
個人情報流出の防止:生のプロンプト収集の禁止とイベントモデルへの転換
新しいOpenTelemetry GenAI標準仕様は、個人情報流出を防ぐためにデータ収集の方式を根本から変更しました。従来の慣習のようにユーザーのプロンプト原文やモデルが生成した回答全体を、スパンの属性値としてそのまま文字列で保存すると、データストアや監視ツール上に機密性の高い個人情報が露呈してしまうという致命的なセキュリティ問題が生じるためです。
これに従い、最新の仕様では従来の gen_ai.prompt と gen_ai.completion 属性を公式に廃止しました。その代わり、プロンプトとメッセージ履歴をより安全かつ体系的に管理できるよう、gen_ai.input.messages および gen_ai.output.messages といった標準化されたイベントフォーマットを導入し、監視パイプラインでのマスキングやフィルタリングを容易に適用できるようにしました。
さらにインフラストラクチャのメタデータの整合性を高めるため、従来広く使用されていた gen_ai.system 属性の名称を、LLMプロバイダーの区別が明確な gen_ai.provider.name に変更しました。このような変化は、プライバシー侵害のリスクを先制的に予防しつつ、精度の高い分析データを維持することを可能にします。
エージェント動作の追跡:invoke_agentとexecute_tool標準の導入
AIエージェントが複雑なビジネスロジックや外部ツールを行き来するマルチステップアーキテクチャが主流となるにつれ、従来の単一モデル呼び出しの追跡方式では全体の実行フローを把握することが困難になりました。複数の非同期作業が絡み合うエージェントシステムでは、各ツールがいつ実行され、どのような結果を返したのかを透過的にデバッグできる追跡体系が不可欠です。
これを解決するために、最新のOpenTelemetry仕様ではエージェント本体の実行フローを表す invoke_agent スパンと、個別の外部機能の実行を検知する execute_tool スパンを標準として規定しました。invoke_agent スパンが全体のエージェントループの開始と終了を包含する親の役割を果たし、その内部で実行される様々な外部ツール呼び出しが execute_tool という子スパンとして連携されることで、複雑な非同期処理も階層的なトレースフロー内で一目で可視化できます。
特に近年広く活用されているモデルコンテキストプロトコル(MCP)環境においても、この標準スパン仕様は大きな力を発揮します。分散されたMCPサーバーと連携して多様なツールを動的に呼び出した場合でも、標準仕様が提供するコンテキストデータがそのまま伝搬されるため、開発者は特別なカスタムトレースコードを作成する必要がなく、一つの有機的な分散トレースフローの中でエージェントの動作を完全に追跡できます。
Fastifyの実践:@fastify/otel連携と伝搬ガイド
Node.js環境で高性能なサーバーを構築する際に欠かせないFastifyにおいても、最新のオブザーバビリティ標準の利点を完全に享受できます。これまで広く使用されていた従来のFastify計測用ライブラリは、現在公式サポートが終了しています。代わりにFastify財団が直接管理する公式プラグインである @fastify/otel を使用する必要があります。この公式プラグインはフレームワークのライフサイクル・フックに安全に組み込まれ、不要なオーバーヘッドなしに分散トレースを処理します。
公式プラグインを登録すると、ルートハンドラ内部から request.openTelemetry() メソッドを直接呼び出すことができます。このメソッドはリクエスト単位のコンテキスト情報を含むオブジェクトを返し、その中には最上位のHTTPトレースを繋ぐためのスパン、トレーサー、コンテキストがすべて含まれています。おかげでダウンストリームに続く大規模言語モデルの呼び出しやエージェント追跡スパンを、親トレースに漏れなく接続できます。
以下は @fastify/otel を活用して、リクエストのライフサイクル内でコンテキストを抽出し、子スパンを生成するサンプルコードです。
import Fastify from 'fastify';
import fastifyOtel from '@fastify/otel';
const fastify = Fastify();
await fastify.register(fastifyOtel);
fastify.get('/agent', async (request, reply) => {
// 요청 생명주기에서 span, tracer, context 직접 추출
const { span, tracer, context } = request.openTelemetry();
// 다운스트림 에이전트 스팬에 부모 컨텍스트를 연결하여 시작
const agentSpan = tracer.startSpan('invoke_agent', undefined, context);
// 비즈니스 로직 및 에이전트 작업 수행...
agentSpan.end();
return { status: 'success' };
});ただし、実際のビジネスへ導入する際には1点注意が必要です。Node.jsエコシステムで使用される様々なAI SDKは、新しいOpenTelemetry GenAI仕様に合わせて結果を自動的にバインディングしてくれる型ヘルパーを完全にはサポートしていません。そのため、クライアントを通じて得られたトークン使用量や応答イベントを、規格化されたスパン属性に合わせて手動でマッピングする連携コードを記述する丁寧さが必要です。
安全性と連携性を保証する未来志向のAIオブザーバビリティ
AIサービスのオブザーバビリティ体系は、単にログを蓄積する段階を超えて、複雑なシステムの因果関係を追跡する高度な分散トレースへと進化しています。セキュリティ上の懸念が大きいプロンプト原文の露呈を完全に防ぎつつ、多段階エージェントのフローを鮮明に把握するには、OpenTelemetry GenAI仕様に準拠するのが最も安全で合理的な選択です。
現在運用中のバックエンドパイプラインにおいて、無防備に原文テキストがログとして収集されていないか点検する時期です。公式規格に準拠した分散トレース体系を導入し、強力なセキュリティと柔軟な連携性を同時に確保してみてください。
参考リンク
- GitHub / open-telemetry/opentelemetry-js — Federation of OpenTelemetry GenAI Semantic Conventions in JS v1.42.0
- GitHub / open-telemetry/semantic-conventions-genai — Deprecation of gen_ai.system in Favor of gen_ai.provider.name
- npm / @opentelemetry/instrumentation-fastify — Official Deprecation of @opentelemetry/instrumentation-fastify