オブザーバビリティ
本番環境におけるJamJetワークフローのトレース、メトリクス、ログ。
可観測性
JamJetはすべての実行について構造化されたトレース、メトリクス、ログを出力します。OpenTelemetryおよび既存のツールと互換性があります。
計装対象
すべてのJamJet実行は自動的に以下を出力します:
- トレース — 実行ごと・ノードごとのスパン(タイミング、モデル、トークン数を含む)
- メトリクス — 実行時間、キュー深度、ノードレイテンシ、トークン使用量、エラー率
- ログ — すべての状態遷移の構造化JSONログ
- イベント — 完全な実行イベントログ(
jamjet inspectで照会可能)
OpenTelemetry
JamJetは完全にOpenTelemetryネイティブです。jamjet.tomlでOTLPエクスポーターを設定します:
[telemetry]
enabled = true
service_name = "my-agent"
service_version = "0.2.0"
[telemetry.otlp]
endpoint = "http://localhost:4317" # OTLP gRPC
# または
endpoint = "http://localhost:4318" # OTLP HTTPこれは任意のOTLP互換バックエンドで動作します:
トレース構造
各実行はトレース階層を生成します:
execution exec_01JM4X8NKWP2 (2.1s)
├── node:search (search) [tool] 823ms
│ └── mcp.call brave-search/web_search 820ms
├── node:draft (draft) [model] 1.1s
│ └── model.call claude-sonnet-4-6 1.09s
│ ├── input_tokens: 412
│ └── output_tokens: 891
└── node:evaluate (evaluate) [eval] 180ms
└── eval.llm_judge claude-haiku 178ms
└── score: 4.7スパン属性
JamJetはモデルスパンに関するGenAIセマンティック規約に準拠しています:
| 属性 | 値 |
|---|---|
gen_ai.system | anthropic、openaiなど |
gen_ai.request.model | モデルID |
gen_ai.usage.input_tokens | 入力トークン数 |
gen_ai.usage.output_tokens | 出力トークン数 |
jamjet.workflow.id | ワークフローID |
jamjet.workflow.version | ワークフローバージョン |
jamjet.execution.id | 実行ID |
jamjet.node.id | ノードID |
jamjet.node.kind | ノードタイプ |
Prometheusメトリクス
Prometheusスクレイプエンドポイントを有効化:
[telemetry.prometheus]
enabled = true
port = 9090利用可能なメトリクス:
| メトリクス | タイプ | 説明 |
|---|---|---|
jamjet_executions_total | Counter | ワークフロー + ステータス別の総実行数 |
jamjet_execution_duration_ms | Histogram | エンドツーエンドの実行時間 |
jamjet_node_duration_ms | Histogram | ノードタイプ別のノード実行時間 |
jamjet_queue_depth | Gauge | キュー内の保留中の実行数 |
jamjet_model_tokens_total | Counter | モデルと方向別のトークン使用量 |
jamjet_model_cost_usd_total | Counter | モデル別の推定コスト |
実行レイテンシーのp99を取得するPrometheusクエリ例:
histogram_quantile(0.99,
rate(jamjet_execution_duration_ms_bucket[5m])
)Grafanaダッシュボード
公式JamJet Grafanaダッシュボード(ID: jamjet-runtime)をインポートして、構築済みの概要を表示:
- 実行スループットとエラー率
- モデルレイテンシー分布
- 時系列のトークン使用量とコスト
- キュー深度とワーカー飽和度
構造化ログ
JamJetはデフォルトで標準出力に構造化JSONログを出力:
{
"timestamp": "2026-03-07T09:31:00.012Z",
"level": "info",
"event": "node_completed",
"execution_id": "exec_01JM4X8NKWP2",
"workflow_id": "research-agent",
"node_id": "think",
"node_kind": "model",
"model": "claude-haiku-4-5-20251001",
"duration_ms": 512,
"input_tokens": 64,
"output_tokens": 312
}jamjet.tomlでログレベルとフォーマットを設定:
[logging]
level = "info" # debug | info | warn | error
format = "json" # json | text実行の検査
jamjet inspectコマンドを使用すると、オブザーバビリティバックエンドなしでローカルで完全な実行トレースを取得できます:
jamjet inspect exec_01JM4X8NKWP2
jamjet inspect exec_01JM4X8NKWP2 --events # 完全なイベントタイムライン
jamjet inspect exec_01JM4X8NKWP2 --state # 最終ステートのみアラート
Prometheus + Alertmanagerで以下のアラートを追加:
# alerts.yml
groups:
- name: jamjet
rules:
- alert: HighExecutionErrorRate
expr: |
rate(jamjet_executions_total{status="failed"}[5m]) /
rate(jamjet_executions_total[5m]) > 0.05
for: 2m
annotations:
summary: "JamJet error rate above 5%"
- alert: ExecutionQueueBacklog
expr: jamjet_queue_depth > 100
for: 5m
annotations:
summary: "JamJet execution queue is backing up"注意: すべてのテレメトリは
jamjet devではオプトインです。本番環境では、エージェントの動作を可視化するため、テレメトリはデフォルトで有効になっています。