[Master Joining Datasets
Without Using Join])https://conf.splunk.com/files/2019/slides/FNC2751.pdf)
や
About event grouping and correlation
に書いてあることを改めてまとめてみたいと思います。
でも書いてなかったか〜
解説
- データの1つのサブセットは静的なままか、ほとんど変化しないですか?
-
lookupを使ってください
-
- 検索条件を単純な分離として書けますか?
- 条件付き eval 式でグループ化を定義できますか?
- 一定時間以上の大きなグループを分割しますか?
-
transactionを使ってください
-
- IDなどのフィールド値でグループ化を定義できますか?
- このフィールドは再利用されますか?(そうでなければ、それらは一意です)
- グループ化されたイベントの全文を見る必要がありますか?
-
transactionを使ってください
-
- 開始や終了などのパターンでグループ化を定義できますか?
-
transactionを使ってください
-
-
statsを使ってください - コマンド一つでは無理です。
- 一定時間以上の大きなグループを分割しますか?
-
joinかappendを使ってください。
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で条件はこんな感じでもかけますので、いろいろと頑張りがいがあります。
(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は検索時間が倍になるので、検索範囲が多い場合は
- 一括検索
-
eval等で条件分離 -
stats等で集計
を頑張りましょう。
リクエストがありましたら、twitter、Qiita、Splunk>Answersでどうぞ。
