Splunkでイベントをグループ化する


[Master Joining Datasets
Without Using Join])https://conf.splunk.com/files/2019/slides/FNC2751.pdf)

About event grouping and correlation
に書いてあることを改めてまとめてみたいと思います。

でも書いてなかったか〜

解説


英語なので日本語に直してみる。
yesは段落を変えます。

  • データの1つのサブセットは静的なままか、ほとんど変化しないですか?
    • lookupを使ってください
  • 検索条件を単純な分離として書けますか?
  • 条件付き eval 式でグループ化を定義できますか?
    • 一定時間以上の大きなグループを分割しますか?
      • transactionを使ってください
    • IDなどのフィールド値でグループ化を定義できますか?
      • このフィールドは再利用されますか?(そうでなければ、それらは一意です)
      • グループ化されたイベントの全文を見る必要がありますか?
        • transactionを使ってください
    • 開始や終了などのパターンでグループ化を定義できますか?
      • transactionを使ってください
    • statsを使ってください
    • コマンド一つでは無理です。
  • joinappendを使ってください。

transaction人気

条件付き eval 式でグループ化を定義できますか? がここの肝だと思う。

Splunkで先月比のグラフをつくるとか、検索期間とかindexとかsourcetypeが別な検索結果をくっつけようとした時、単純に考えるとjoinを使いたくなります。

でもjoinが使える≒statsでまとめられる。のはず。

あんまりよくない例だけど
index=_audit  earliest=-2w@d 
| eval period=if(_time < relative_time(now(),"-1w@d"),"last_week","current_week")
| timechart cont=f count by period
| eval weekday=strftime(_time,"%A")
| stats max(_time) as _time sum(*) as * by weekday
| fields - weekday
| sort _time

2行目のevalでやっているように、条件に応じてラベルをつけてあげれば、あとは集計(stats,chart,timechart)でなんとかなる。

timechart後にstatsはイベントがない期間を0にすることもできていろいろと応用が聞きますね

evalで条件はこんな感じでもかけますので、いろいろと頑張りがいがあります。

timechartは引数が一つ
(index=_audit  earliest=-60m) OR (index=_internal user=* earliest=-10m)
| eval header=index.":".user
| timechart cont=f span=1m count by header
| rename VALUE_* as "*"

timechartは引数が一つなので、最初にくっつけてしまえば大丈夫です。

まとめ

個人的な感想では
join << stats < dedup なので、sortして一番上の値になるのであれば、dedupが一番速いです。

coalesceを使えば、どっちか片方にしかないフィールドもまとめられます。

joinは検索時間が倍になるので、検索範囲が多い場合は

  1. 一括検索
  2. eval等で条件分離
  3. stats等で集計

を頑張りましょう。

リクエストがありましたら、twitter、Qiita、Splunk>Answersでどうぞ。