🐨コアラでもわかるSplunkシリーズ サブサーチとは何かを調べる


やあ、みんな だよ

いつもの作者は「の記事もわかりづらいですね」と言われて凹んだので、僕が呼ばれたよ。よろしくね。

今回はちょっと初心に戻って、ログに書いている値で集計してみるよ

Macosxで動かしているので、WindowsやLinuxの人はディレクトリやフォルダを読み替えてね。

今回使うもの


今回は、この起動した時のそのままの画面を使用するよ。
真っ黒い背景にSPL(エス・ピー・エル)を書いていくので、それを赤枠の中、ここにサーチを入力...と書いているところにコピー&ペーストしてもらって、🔍をクリックすると動くよ

時間:過去24時間やモード:スマートモードは変更しないでね

サブサーチとは

サブサーチはSplunk>docsに書いている通り、別な検索結果を元に検索できるんだ。便利だよ。

[search index=]と書くように、メインサーチとは別に検索するんだ。

内でearliset=とか使えるので検索期間も変更できるよ。

だから、2度検索する感じになるので、検索時間は増えてしまうことが多いよ。

サブサーチの値をevalで入力する

result_to_eval.spl
|makeresults
| eval subsearch=[|makeresults | eval search=_time|fields search]

結果

_time subsearch
2020/05/30 21:10:37 1590840637

解説

でもこんな例文をだしてくるのが・・・

サブサーチの結果をsearchqueryフィールドに代入すると、こんな感じでメインサーチに文字列として渡すことができるよ。

https://answers.splunk.com/answers/7472/subsearch-fields-query-search-how-do-i-know-which-to-use.html に細かい話は書いてあるから読んでね

format

https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/format に書いている通りで、searchフィールドを作ってくれるコマンドなんだ。

サブサーチはsearchフィールドの値を文字列として渡すので、フィールド名=値ORで繋いでくれるこのコマンドはとても使えるよ。

以前のSplunkサブサーチで検索期間を変化させるに細かい動作とか載っているから読んでね。

limits.conf

Subsearch_performance_considerationsに書いてある通り、サブサーチの検索結果には限界があるよ。

https://answers.splunk.com/answers/790410/ でも解説があるから確認してみてね。

join、append、appendcols

この二つのコマンドはサブサーチの結果で結合したりjoinただ下にくっつけたりappend横にくっつけたりappendcolsするコマンドなんだ。

使い所がはまると便利だよ

使い所が悪いと遅くなる原因だよね。

appendpipe

このコマンドはさっきのコマンドとは違って、引き続き検索ができるよね

appendpipe.spl
| makeresults
| eval _raw="testA"
| appendpipe [ eval _raw="testB"]
| appendpipe [ eval _raw="testC"]
| appendpipe [ eval _raw="testD"]

結果

_raw _time
testA 2020/05/30 21:46:23
testB 2020/05/30 21:46:23
testC 2020/05/30 21:46:23
testC 2020/05/30 21:46:23
testD 2020/05/30 21:46:23
testD 2020/05/30 21:46:23
testD 2020/05/30 21:46:23
testD 2020/05/30 21:46:23

思ってたのと違うかも

appendpipe_modify.spl
| makeresults
| eval _raw="testA"
| appendpipe [ eval _raw="testB"
| appendpipe [ eval _raw="testC"
| appendpipe [ eval _raw="testD"]]]
_raw _time
testA 2020/05/30 21:48:01
testB 2020/05/30 21:48:01
testC 2020/05/30 21:48:01
testD 2020/05/30 21:48:01

どちらがいいのかは、状況次第だよね。

複数フィールドの場合

subsearch_no_format.spl
index=_internal [search index=_internal sourcetype=splunkd |stats values(sourcetype) as sourcetype values(source) as source]

サーチジョブ調査

job parameter
phase0 litsearch (index=_internal (source="/Applications/Splunk/var/log/splunk/health.log" OR source="/Applications/Splunk/var/log/splunk/license_usage.log" OR source="/Applications/Splunk/var/log/splunk/metrics.log" OR source="/Applications/Splunk/var/log/splunk/metrics.log.1" OR source="/Applications/Splunk/var/log/splunk/splunkd.log") sourcetype="splunkd")

解説

サブサーチの結果がどうなっているかは、サーチジョブ調査からわかるよ

綺麗にORで繋いでくれているよね

この時ORとかANDを変更したいなと思ったらformatを使うんだ。

まとめ

サブサーチはsearchフィールドの中を文字列としてメインサーチに戻すものだよ。

文字列だとわかれば、evalに渡す時(空白)が入っている時は"(ダブルコーテーション)で囲わないといけないとか、いろいろわかるよね。

じゃ、またね〜

リクエストまってま〜す