はじめてのSplunk ― 概要から応用までを体系的に学ぶ

4-2 サーチ結果のフィルタリング(eval/where/fillnull)

1. evalで新しいフィールドを作る

evalは、計算や加工の結果を新しいフィールドとして作り出すコマンドです。 既存のフィールドから値を算出したり、文字列を組み立てたりできます。

SPL ― バイト数をキロバイトに換算
index=web | eval bytes_kb = bytes / 1024

文字列の連結には.(ピリオド)を使います。

SPL ― ホストとステータスを1つの文字列にまとめる
index=web | eval label = host . " : " . status

evalは条件分岐にも対応します。 if(条件, 真のときの値, 偽のときの値)と、 複数条件を順に判定するcase(条件1, 値1, 条件2, 値2, ...)が代表的です。

SPL ― ステータスコードから区分を作る
index=web | eval category = case(status >= 500, "サーバーエラー", status >= 400, "クライアントエラー", status >= 200, "正常", true(), "その他")

case()の最後にtrue(), "その他"を置くと、 どの条件にも当てはまらなかったイベントの受け皿になります。

2. whereで条件を絞り込む

whereは、条件に合致するイベントだけを残すフィルタリングコマンドです。 evalで作った計算結果に対して、さらに絞り込みをかけるときによく使います。

SPL ― 換算後の値でフィルタ
index=web | eval bytes_kb = bytes / 1024 | where bytes_kb > 500

3. whereとsearchの違い

イベントを絞り込むコマンドにはsearchもありますが、 whereとの使い分けにはコツがあります。

コマンド 得意なこと
search フィールドと定数の比較(status=500など)。ワイルドカードも使える
where フィールド同士の比較や、eval関数を使った条件判定

たとえば「送信バイト数が受信バイト数を上回るイベント」のように、 フィールド同士を比べる条件はwhereでしか書けません。

SPL ― フィールド同士を比較する
index=web | where bytes_out > bytes_in

whereではフィールド名を引用符で囲みません。 where status="500"のように書くと"500"は文字列として扱われ、 意図した比較にならないことがあります。数値の比較はwhere status=500とします。

4. fillnullで欠損値を埋める

イベントによっては、特定のフィールドが存在せずnull(欠損)になることがあります。 集計や計算で邪魔になる場合は、fillnullで既定値を埋めておくと扱いやすくなります。

SPL ― nullを0で埋める(既定値)
index=web | fillnull error_count

valueオプションで埋める値を指定できます。何も指定しなければ0が入ります。

SPL ― nullを "unknown" で埋める
index=web | fillnull value="unknown" user

5. まとめ

  • evalは計算・文字列連結・if()/case()による条件分岐で新フィールドを作る
  • whereは条件に合うイベントだけを残すフィルタコマンド
  • フィールド同士の比較やeval関数が必要なときはsearchではなくwhereを使う
  • fillnullは欠損値(null)を既定値(既定は0)や指定値で埋める