Splunk: tstatsコマンド活用によるサーチ所要時間の短縮

## はじめに
Splunkでは、取り込んだデータをIndexer内に保管する際、圧縮されたRawデータ(journal.gz)と索引データ(tsidx)のペアで保管されます。
通常の統計処理を行うサーチ(statsやtimechartコマンド等)では、サーチ処理の中でRawデータ及び索引データの双方を扱いますが、tstatsコマンドは索引データのみを扱うため、通常の統計処理を行うサーチに比べ、サーチの所要時間短縮を見込むことが出来ます。

## tstatsコマンドにて統計処理対象として利用可能なフィールド例
* Splunk取り込み時にデフォルトで付与されるフィールド
  * sourcetype, host等のデフォルトフィールド
  * [About default fields (host, source, sourcetype, and more) - Splunk Documentation](https://docs.splunk.com/Documentation/Splunk/9.3.3/Data/Aboutdefaultfields)
* CSVやJSONフォーマットのデータに含まれるフィールド
  * フォーマットに合わせたINDEXED_EXTRACTIONS設定を行うことが前提
  * [Extract fields from files with structured data - Splunk Documentation](https://docs.splunk.com/Documentation/Splunk/9.3.3/Data/Extractfieldsfromfileswithstructureddata)
* PREFIX()が利用可能なフィールド(データフォーマット) ※v8.0.0以降
  * [Use PREFIX() to aggregate or group by raw tokens in indexed data](https://docs.splunk.com/Documentation/Splunk/9.3.3/SearchReference/Tstats#Use_PREFIX.28.29_to_aggregate_or_group_by_raw_tokens_in_indexed_data) 
* index-time field extraction設定済のフィールド
  * インデックス時のフィールド抽出設定を行うことが前提 
  * [Create custom fields at index time - Splunk Documentation](https://docs.splunk.com/Documentation/Splunk/9.3.3/Data/Configureindex-timefieldextraction)
* 高速化有効済のデータモデルにて定義されたフィールド
  * データモデル定義及び高速化設定を行うことが前提 
  * [Accelerate data models - Splunk Documentation](https://docs.splunk.com/Documentation/Splunk/9.3.3/Knowledge/Acceleratedatamodels)

## 構成
* Splunk Enterpriseバージョン
  * v8.2.2
  * v9.0.4
  * v9.3.3

## tstatsコマンド利用例
### 例1：任意のインデックスにおけるソースタイプ毎のイベント件数検索
Splunk取り込み時にデフォルトで付与されるフィールドを集計対象とします。
* 変更前サーチ文
  ```
  index=_internal
  | stats count by sourcetype
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/1cb49ceb-1d27-8950-3c40-40c98888c814.png)

* tstatsを用いたサーチ文
  ```
  | tstats count WHERE index=_internal by sourcetype
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/6450b257-87dd-162f-fee9-1ae13052e125.png)

### 例2：任意のインデックスにおける時系列イベント件数検索
Splunk取り込み時にデフォルトで付与されるフィールドを集計対象とします。
* 変更前サーチ文
  ```
  index=_internal
  | timechart count span=10m
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/2ace6616-794b-fa76-3328-f7a7898c6173.png)

* tstatsを用いたサーチ文
  ```
  | tstats count WHERE index=_internal by _time span=10m
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/1fffa81f-dc0f-65af-4007-4cc5bb28b75e.png)

### 例3：JSONフォーマットデータを対象とした件数検索
INDEXED_EXTRACTIONS=json設定にて取り込んだJSONフォーマットデータ(sample.json)におけるフィールドを集計対象とします。
* 変更前サーチ文
  ```
  index=customer source=sample.json
  | stats count by gender isActive
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/ba041c2e-990d-582c-6f59-345cedaceb89.png)

* tstatsを用いたサーチ文
  ```
  | tstats count WHERE index=customer source=sample.json by gender isActive
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/1f489f6d-82dd-b823-0750-466d7bca5a28.png)

### 例4：PREFIX()が利用可能なフィールド毎のイベント件数検索
PREFIX()を利用して、key=value形式で記載されたフィールドを集計対象とします。
* 変更前サーチ文
  ```
  index=_audit
  | stats count by user action
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/dded39a9-aac5-de1d-1dea-820d959023d5.png)

* tstatsを用いたサーチ文
  ```
  | tstats count WHERE index=_audit by PREFIX(user=) PREFIX(action=)
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609667/5646b13f-eca1-5aee-f371-1608e6bd9f7d.png)

## 参考 
* [tstats / Search Reference - Splunk Documentation](https://docs.splunk.com/Documentation/Splunk/9.3.3/SearchReference/Tstats)
* [Clara-Fication: More Tstats for Your Buckets - .conf 21](https://conf.splunk.com/files/2021/slides/TRU1133B.pdf)
* [TSTATS and PREFIX - .conf 20](https://conf.splunk.com/files/2020/slides/PLA1089C.pdf)
* [Speed up your search! - .conf 19](https://conf.splunk.com/files/2019/slides/FN2188.pdf)
* [metadataとtstatsを活用した脅威ハンティング](https://www.splunk.com/ja_jp/blog/security/metadata-tstats-threat-hunting.html)