この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。jqの標準機能を基準に、旧記事の空配列除算、curlのHTTPエラー見逃し、欠損latencyの扱いを修正しました。検証ステータス:✅ jq/curl構造確認済み
JSONログをステータス別に集計するなら、group_byとmap、reduceを組み合わせられます。ただし実運用では「dataが配列ではない」「latencyがnull」「HTTP 500なのにファイルへ保存された」といった例外を先に潰します。
安全側の集計例
jq '
(.data // [])
| map(select(.status != null))
| group_by(.status)
| map({
status: (.[0].status | tostring),
count: length,
avg_latency: (
[.[].latency | numbers]
| if length == 0 then null else add / length end
)
})
' response.json
numbersで数値だけを集め、対象が0件なら平均値をnullにします。欠損を一律0にすると、本当に0msだったデータと「値がない」データを区別できなくなるためです。
curlはHTTPエラーも失敗として扱う
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
curl --fail-with-body --silent --show-error --location \
--retry 3 \
"$RAW_LOG_URL" \
-o "$tmp"
jq -e '.data | type == "array"' "$tmp" >/dev/null
--fail-with-bodyを使うとHTTP 4xx/5xxを終了コードへ反映できます。
巨大JSONではgroup_byの前提を見直す
group_byは入力全体を扱うため、数GB級ログではメモリ負荷が大きくなります。日次ファイルへ分割する、前段で対象を絞る、NDJSONとしてストリーム処理する、専用集計基盤へ移す、といった設計も比較します。
reduceは出力形式を組み替えるときに使う
配列のまま扱えるならmapだけでも十分です。ステータスをキーにしたオブジェクトへ変換したい場合にreduceを使うと意図が明確になります。
参考情報
この記事の更新履歴
- 2026-09-14 追加:空配列、null、非数値latency、HTTPエラーの防御を追加。
- 2026-09-14 変更:正常データ前提の集計から、入力検証付きの実務構成へ変更。
- 2026-09-14 削除:内部style_prompt、本文H1、欠損latencyを無条件0にする説明を削除。

