1. evalで新しいフィールドを作る
evalは、計算や加工の結果を新しいフィールドとして作り出すコマンドです。
既存のフィールドから値を算出したり、文字列を組み立てたりできます。
index=web | eval bytes_kb = bytes / 1024
文字列の連結には.(ピリオド)を使います。
index=web | eval label = host . " : " . status
evalは条件分岐にも対応します。
if(条件, 真のときの値, 偽のときの値)と、
複数条件を順に判定するcase(条件1, 値1, 条件2, 値2, ...)が代表的です。
index=web | eval category = case(status >= 500, "サーバーエラー", status >= 400, "クライアントエラー", status >= 200, "正常", true(), "その他")
case()の最後にtrue(), "その他"を置くと、
どの条件にも当てはまらなかったイベントの受け皿になります。
2. whereで条件を絞り込む
whereは、条件に合致するイベントだけを残すフィルタリングコマンドです。
evalで作った計算結果に対して、さらに絞り込みをかけるときによく使います。
index=web | eval bytes_kb = bytes / 1024 | where bytes_kb > 500
3. whereとsearchの違い
イベントを絞り込むコマンドにはsearchもありますが、
whereとの使い分けにはコツがあります。
| コマンド | 得意なこと |
|---|---|
search |
フィールドと定数の比較(status=500など)。ワイルドカードも使える |
where |
フィールド同士の比較や、eval関数を使った条件判定 |
たとえば「送信バイト数が受信バイト数を上回るイベント」のように、
フィールド同士を比べる条件はwhereでしか書けません。
index=web | where bytes_out > bytes_in
whereではフィールド名を引用符で囲みません。
where status="500"のように書くと"500"は文字列として扱われ、
意図した比較にならないことがあります。数値の比較はwhere status=500とします。
4. fillnullで欠損値を埋める
イベントによっては、特定のフィールドが存在せずnull(欠損)になることがあります。
集計や計算で邪魔になる場合は、fillnullで既定値を埋めておくと扱いやすくなります。
index=web | fillnull error_count
valueオプションで埋める値を指定できます。何も指定しなければ0が入ります。
index=web | fillnull value="unknown" user
5. まとめ
evalは計算・文字列連結・if()/case()による条件分岐で新フィールドを作るwhereは条件に合うイベントだけを残すフィルタコマンド- フィールド同士の比較や
eval関数が必要なときはsearchではなくwhereを使う fillnullは欠損値(null)を既定値(既定は0)や指定値で埋める