GenAI テレメトリのカスタムダッシュボードの作成
カスタムダッシュボードを使用する理由
Bedrock Model Invocation Logging を有効にして ADOT 自動インストルメンテーションエージェントをデプロイすると、AWS はすぐに使えるダッシュボードを提供してくれます。Bedrock は自動的に呼び出し回数、レイテンシー、トークン数、スロットルメト リクスを提供します。Application Signals はサービスマップと SLO ビューを自動生成します。これは確かな基盤ですが、全体像ではありません。
すぐに使えるダッシュボードは「AI は今正常に動作しているか?」という問いに答えるものです。しかし、DevOps、FinOps、セキュリティチームが実際に問いかける質問には答えてくれません。
- Bedrock 予算の 80% を消費しているのはどの呼び出し元か?
- 午後 3 時のデプロイ後にコンプリート率が低下したのはなぜか?
- クロスリージョン推論は実際に役立っているのか、それともレイテンシーを増加させているのか?
- キャッシュの恩恵を最も受けるプロンプトはどれか?
- PII を返したモデル呼び出しを行ったのは誰で、何を尋ねたのか?
- エージェントはツールレイヤーで失敗しているのか、それともモデルレイヤーで失敗しているのか?
これらの問いに答えるには、ロググループを結合し、トークンからコストを計算し、IAM ロール別にセグメント化し、スパンツリーを詳細に分析するカスタムクエリが必要です。生のテレメトリはすでに流れています — 価値はそれをどのように切り分けるかによって生まれます。
1 つのパイプライン、異なるオーディエンス
GenAI テレメトリは 3 つのロググループに記録されます。 bedrock-model-invocation-logging, aws/spans、および /aws/bedrock-agentcore/runtimes/<agent>データ自体は変わりませんが、表示方法は変わります。同じ呼び出しデータが次のようになります。
- DevOps ダッシュボード — 完了率、コンポーネントのレイテンシー、エージェントエラーのドリルダウンを表示し、「システムは正常に動作しているか?」に焦点を当てています。
- FinOps ダッシュボード — モデルごとのコスト、上位の消費者、キャッシュの最適化機会を表示し、「効率的に支出しているか?」に焦点を当てています。
このガイドでは、両方を構築するためのクエリを提供します。対象読者に関連するセクションを選択してください。各クエリには、ソースロググループ、ビュータイプ、クエリ言語、および回答する質問が記載されています。
基盤となるデータパイプラインの概要と、それぞれを有効にするタイミングについては、AWS での GenAI Observability を参照してください。
DevOps ペルソナダッシュボード
DevOps チームは、自分の GenAI ワークロードは正常か、ボトルネックはどこにあるか? という問いに答える必要があります。これらのクエリは、呼び出しの健全性、エージェントワークフローの信頼性、およびパフォーマンスのボトルネックに焦点を 当てています。

モデル呼び出しの健全性
1. モデル別の停止理由の内訳
- 目的: すべてのモデルにわたるすべての停止理由の分布を表示します。すべての Bedrock 呼び出しは停止理由で終了します —
end_turn(自然な完了)、tool_use(ツールを呼び出す)、max_tokens(truncated),stop_sequence(境界に達した場合)、またはエラーが発生した場合。例: 要約モデルの呼び出しの 15% がで終わることがわかる場合があります。max_tokens— つまり、ユーザーが途切れたレスポンスを受け取っている — 一方で分類モデルは 100%end_turn. - ソース:
bedrock-model-invocation-logging - 表示: 棒グラフ
- クエリ言語: CloudWatch Logs Insights
- クエリ:
fields @timestamp, modelId, operation, requestId,
output.outputBodyJson.stopReason as stop_reason
| filter schemaType = "ModelInvocationLog"
| filter ispresent(output.outputBodyJson.stopReason)
or ispresent(output.outputBodyJson.error)
| stats count() as stop_reason_count by stop_reason, modelId
- アラーム: 正常でない停止理由(not
end_turn,tool_use、またはstop_sequence) モデルの総呼び出し数の 10% を超える場合。
2. 完了率と切り捨て率の比較(時間別)
- 目的: 成功した完了の時間ごとの比率を追跡します (
end_turn+tool_use) と切り捨てられたレスポンス (max_tokens)。これは SLA メトリクスです — 完了率 95% 以上を目標とします。例:午後 3 時から午後 4 時の間に完了率が 97% から 88% に低下した場合、何かが変化しています — 新しいプロンプトテンプレート、モデルの更新、または設定変更によってトランケーションが増加しています。 - ソース:
bedrock-model-invocation-logging - 表示: 時系列 (スタック)
- クエリ言語: CloudWatch Logs Insights
- クエリ:
fields @timestamp, modelId,
output.outputBodyJson.stopReason as stop_reason
| filter schemaType = "ModelInvocationLog"
| filter ispresent(output.outputBodyJson.stopReason)
| stats sum(stop_reason = "end_turn" or stop_reason = "tool_use") as ok,
sum(stop_reason = "max_tokens") as truncated
by bin(@timestamp, 1h) as hour
| sort hour desc
- アラーム:
ok / (ok + truncated)2 時間連続で 95% を下回っています。
3. トークン効率 — 無駄なトークンを見つける
- 目的: 入力トークンが多く(2000 以上)、出力が少ない(200 未満)呼び出し元を検出します。これはトークンの無駄遣いのサインです。例: 分類パイプラインが製品カタログ全体(8000 ト ークン)を送信して、1 単語のラベル(3 トークン)を取得する場合。The
caller_arn列には、どのサービスまたはロールが責任を持つかが正確に示されているため、プロンプトの再構成について的を絞った会話ができます。 - ソース:
bedrock-model-invocation-logging - 表示: テーブル
- クエリ言語: CloudWatch Logs Insights
- クエリ:
fields @timestamp, modelId, operation,
input.inputTokenCount as input_tokens,
output.outputTokenCount as output_tokens,
identity.arn as caller_arn
| filter schemaType = "ModelInvocationLog"
| filter input_tokens > 2000 and output_tokens < 200
| stats count() as inefficient_requests,
avg(input_tokens) as avg_input_tokens,
avg(output_tokens) as avg_output_tokens,
sum(input_tokens) as total_wasted_tokens
by modelId, operation, caller_arn
| sort total_wasted_tokens desc
- アラーム: 呼び出し元が
total_wasted_tokens24 時間以内に 100K を超えた場合。
4. クロスリージョン推論のレイテンシー
- 目的: 各モデルの推論リージョン間でレイテンシーパーセンタイルを比較します。クロスリージョン推論を有効にしている場合、一部のリクエストはレイテンシーが高い遠隔リージョンにルーティングされます。例: 要約モデルの P95 が us-west-2 では 12 秒、us-east-1 では 4 秒の場合、us-east-1 を優先するように推論プロファイルを設定することで P95 を 40% 削減できます。
- ソース:
bedrock-model-invocation-logging - 表示: テーブル
- クエリ言語: CloudWatch Logs Insights
- クエリ:
fields @timestamp, modelId, region, inferenceRegion,
output.outputBodyJson.metrics.latencyMs as latency
| filter schemaType = "ModelInvocationLog"
| filter ispresent(inferenceRegion)
| filter latency > 0
| stats count() as invocations,
avg(latency) as avg_latency,
pct(latency, 50) as p50_latency,
pct(latency, 95) as p95_latency,
pct(latency, 99) as p99_latency,
stddev(latency) as latency_stddev
by modelId, region, inferenceRegion
| sort modelId asc, avg_latency asc
- アラーム: 特定のリージョンでいずれかのモデルの P95 が 10 秒を超えた場合。
5. プロンプトキャッシングの機会
- 目的: キャッシュヒットがゼロまたは低い状態で繰り返し呼び出されているプロンプトを検出します。これはキャッシュ導入による ROI が最も高い機会です。例: システムプロンプトが 500 回使用されているにもかかわらずキャッシュ読み取りがゼロの場合、毎回フル料金を支払っていることになります。キャッシュを有効にすることで、入力トークンのコストを 90% 削減できる可能性があります。
- ソース:
bedrock-model-invocation-logging - 表示: テーブル
- クエリ言語: CloudWatch Logs Insights
- クエリ:
fields @timestamp,
input.inputBodyJson.messages.0.content.0.text as promptText,
input.inputTokenCount as inputTokens,
input.cacheReadInputTokenCount as cacheReadTokens,
input.cacheWriteInputTokenCount as cacheWriteTokens,
modelId
| filter input.inputTokenCount > 0
| stats sum(input.inputTokenCount) as totalInputTokens,
count(*) as invocationCount,
avg(input.inputTokenCount) as avgInputTokens,
sum(input.cacheReadInputTokenCount) as totalCacheReadTokens,
sum(input.cacheWriteInputTokenCount) as totalCacheWriteTokens
by promptText, modelId
| filter invocationCount > 1
| sort totalInputTokens desc
- アラーム: なし(最適化レビュー、週次実行)。