Splunk: 複数イベントの統計値を個別のイベントで使用したい時には


Splunk で時々使うのでメモ。

実施環境: Splunk Free 8.2.2

各値について平均値との差を取りたい時等、複数のイベントにおける統計値を個別のイベントで使用したい場合があります。
そのような場合は、 eventstats コマンドまたは streamstats コマンドを使用します。

eventstats と streamstats の違いは、計算に使用するイベントの範囲にあります。
eventstats は「全てのイベント」を計算に使用するのに対して、 streamstats は「計算しているイベントより前のイベント」を対象とします。
また、 streamstats は window オプションで計算範囲をさらに狭められます。

まあ、正直言葉ではわかりづらいので、以下に例を示します。

Splunk
| makeresults count=5
| eval Number = random() % 10
| eventstats sum(Number) AS SumEvent
| streamstats sum(Number) AS SumStream
| streamstats window=2 sum(Number) AS SumStream2
| fields - _time

2つのコマンドの利用用途について、もう少し考えてみます。

eventstats コマンドは、個別のイベントについて全体との比率や差分を計算するのに使用できます。

Splunk
| makeresults count=5
| eval Rand = random() % 100
| eventstats avg(Rand) AS Average
| eval Diff = Rand - Average
| fields - _time

streamstats コマンドは、イベント数を数える count 関数と合わせて連番を生成するのに便利です。

Splunk
| makeresults count=5
| streamstats count
| fields - _time

この2つはイベントを横断して算出した値を個別のイベントに適用できるため、上手く使用すればサブサーチの回数を減らして検索スピードを上げることができます。
以下の例では、 ID が Null 値であるイベントについて、 ID の最大値より大きい値を連番で付与しています。
サブサーチを使用せずとも、このように複雑なデータ処理が可能となるのです。

Splunk
| makeresults count=100
| eval Number = random() % 20
| eval ID = if( Number > 10, null(), Number)
| eventstats max(ID) AS MAXID
| eval NullCheck = if( isnull(ID), 1, 0)
| streamstats sum(NullCheck) AS PlusID
| eval NewID = if( isnull(ID), MAXID + PlusID, ID)
| fields - _time, Number, MAXID, NullCheck, PlusID