jqでJSONログを集計する ― group_by・reduce・空配列対策を実務向けに整理

Linux・CLI・DevOpsカテゴリを表すパンダのイラスト Linux・CLI・DevOps

この記事について
この記事は、生成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にする説明を削除。

文書情報

記事タイトル
jqでJSONログを集計する ― group_by・reduce・空配列対策を実務向けに整理
作成日
更新日
Source URL
https://papanda925.com/?p=5618

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました