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

やあ、みんな　:koala:だよ

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

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

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

#今回使うもの
<img width="1392" alt="スクリーンショット 2020-05-11 20.31.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/3592e332-a36f-139b-ab44-b1e2c997f313.png">
:koala:今回は、この起動した時のそのままの画面を使用するよ。
真っ黒い背景にSPL（エス・ピー・エル）を書いていくので、それを<font color="red">**赤枠**</font>の中、`ここにサーチを入力．．．`と書いているところにコピー＆ペーストしてもらって、🔍をクリックすると動くよ

:koala:時間:`過去２４時間`やモード:`スマートモード`は変更しないでね
#サブサーチとは
:koala:サブサーチは[Splunk>docs](https://docs.splunk.com/Documentation/Splunk/latest/Search/Aboutsubsearches)に書いている通り、別な検索結果を元に検索できるんだ。便利だよ。

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

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

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

#サブサーチの値をevalで入力する
```sql:result_to_eval.spl
|makeresults
| eval subsearch=[|makeresults | eval search=_time|fields search]
```

##結果
| _time | subsearch |
|:--|--:|
| 2020/05/30 21:10:37 | 1590840637 |

##解説
:koala:でもこんな例文をだしてくるのが・・・

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

:koala:https://answers.splunk.com/answers/7472/subsearch-fields-query-search-how-do-i-know-which-to-use.html に細かい話は書いてあるから読んでね
#format
:koala:https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/format に書いている通りで、`search`フィールドを作ってくれるコマンドなんだ。

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

:koala:以前の[Splunkサブサーチで検索期間を変化させる](https://qiita.com/toshikawa/items/38e57c6f2b0514db109b)に細かい動作とか載っているから読んでね。

#limits.conf
:koala:[Subsearch_performance_considerations](https://docs.splunk.com/Documentation/Splunk/latest/Search/Aboutsubsearches#Subsearch_performance_considerations)に書いてある通り、サブサーチの検索結果には限界があるよ。

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

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

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

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

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

```sql: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 |
:koala:思ってたのと違うかも

```sql: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 |

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

#複数フィールドの場合

```sql: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") | fields keepcolorder=t "*" "_bkt" "_cd" "_si" "host" "index" "linecount" "source" "sourcetype" "splunk_server" |
##解説
:koala:サブサーチの結果がどうなっているかは、サーチジョブ調査からわかるよ

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

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


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

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

:koala:じゃ、またね〜

:koala:リクエストまってま〜す