平均値や中央値と比べて大きい/小さいものをcountしたい時はeventstats


もっと包括的なタイトルの方が良い気がしますが、初期衝動でそのままにします。

通常、平均値(avg)や中央値(median)を単純に得るには、statsコマンドを使うと思います。

しかし、今回私がやりたかったのは、
「得られたそれらの値と元の値とを比較した結果で絞りたい」というものでした。

ここで利用するのがeventstatsコマンドです。
eventstatsで平均値や中央値を出すと、
それらの値がそれぞれのイベントに紐付くので、あとから比較処理ができます。

whereコマンドで比較後に、countコマンドで再集計してミッションコンプリートです。

index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
| where bytes >= med
| stats count

※ tableコマンドは本来不要ですが、後述時の視覚化のために記述してあります。

参考にしたサイト

上記コマンド 各フェイズの結果対応

1行目

index=main host=web_application 


2行目(eventstats)

index=main host=web_application 
| eventstats median(bytes) AS med



statsコマンドを使用した時と違いますね。(その分、処理はeventstatsの方が重いです。)

3行目

index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med

一応、次の項のために、bytesフィールドを昇順ソートしときました。

4行目(元の値と統計値を各イベントごとに比較)

index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
| where bytes >= med

5行目(改めて数える)

index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
| where bytes >= med
| stats count

20210306追記(上記をグループ別に実施することも可能)

言われてみれば何てことないですが、きっとそういうことやりたい人も居るよね?

index=main host=web_application 
| eventstats median(bytes) AS med by categoryId


↑↓ 一致してますよね
  (8グループ。各グループごとの中央値が、所属するイベントに各々紐付けられました。)

更に次へ

@odorusatoshi さんの記事。面白いぞ