Splunk: Splunk入門(SPL編 3/6) - よく使用する統計関数11選


###### 実施環境： Splunk Cloud 8.2.2104.1

### 0. 前置き

 SPL の統計コマンド( stats , chart 等)では、統計関数と呼ばれる関数が使用できます。
以下の一覧を見ると、コマンド同様関数も豊富であり、全部見ていくのはなかなか大変です。

[ SPL 統計関数一覧(英語)](https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/CommonStatsFunctions)

そこで、よく使用する統計関数11個を独断と偏見で絞り込みました。
ひとまずこれらの関数を知っておけば、大抵の SPL 文は作れると思います。

### 1. 数え上げ

###### 1.1. count

シンプルにデータ数を数える関数です。
引数の指定も可能ですが、ほとんどの場合は引数なしで記載します。

基本的な文法は以下の通りです。

 count

以下の例では、検索でヒットしたデータ数を数え上げています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats count
```

![スクリーンショット 2022-02-16 21.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d647f9ed-7007-2bbf-0881-117875e60694.png "count")

省略して「 c 」のみでも同じ動作となります。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats c
```

![スクリーンショット 2022-02-16 21.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/5c5b40a0-33d2-fa75-cf05-374c6bf2f1ab.png "c")

:::note info
厳密に言えば、 count が数え上げているのはデータの個数ではなく「項目の個数」となります。
この違いを意識することはほとんどありませんが、マルチバリューという形式の値が絡む場合など非常に特殊なケースではこの違いが結果に影響を与える場合があります。
:::

###### 1.2. distinct_count

引数に指定した項目が何種類の値を持っているかを数える関数です。
例えば指定の項目の値が 1, 0, 1, 1, 0 の場合、値の種類は0と1の2種類なので、この関数の結果は「2」となります。

基本的な文法は以下の通りです。

 distinct_count(項目)

以下の例では、項目「 log_level 」の値が何種類あるかを数え上げています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats distinct_count(log_level)
```

![スクリーンショット 2022-02-16 21.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d5037237-04de-28e6-bc78-0fe5f44c6031.png "distinct_count")

省略して「 dc 」のみでも同じ動作となります。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats dc(log_level)
```

![スクリーンショット 2022-02-16 21.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/fcef43a7-43ed-ec9b-ee8d-0d574511404a.png "dc")

### 2. 数値

###### 2.1. max / min

引数に指定した項目の最大値/最小値を返す関数です。

基本的な文法は以下の通りです。

 max(項目)

 min(項目)

以下の例では、項目「 kbps 」の最大値と最小値を取得しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| stats max(kbps), min(kbps) BY series
```

![スクリーンショット 2022-02-16 21.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/44de9603-bf1c-eed8-6b27-a307528b89b2.png "max_min")

###### 2.2. avg / median

引数に指定した項目の平均値/中央値を返す関数です。

基本的な文法は以下の通りです。

 avg(項目)

 median(項目)

以下の例では、項目「 kbps 」の平均値と中央値を取得しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| stats avg(kbps), median(kbps) BY series
```

![スクリーンショット 2022-02-16 21.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3d6a90f7-a3dc-e478-2cba-b5399665e452.png "avg_median")

:::note info
中央値はあまり聞き慣れない言葉かもしれませんが、データを順番に並べた際に真ん中に出てくる値のことです。

例えば、以下のような5つの値があるとします。

1, 100, 6, 1, 2

これらの値の平均値は、 ( 1 + 100 + 6 + 1 + 2 ) / 5 = 22 となります。

一方中央値は、これらの値を以下のように順番に並べた際、真ん中=3番目に出てくる値なので、 2 となります。

1, 1, __2__, 6, 100

他の値と比較して極端に異なる値が含まれるような場合は、平均値よりもこちらの中央値のほうがデータ全体の傾向をよく表していることがあります。
:::

###### 2.3. sum

引数に指定した項目の合計値を返す関数です。

基本的な文法は以下の通りです。

 sum(項目)

以下の例では、項目「 kb 」の合計値を取得しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| stats sum(kb) BY series
```

![スクリーンショット 2022-02-16 21.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e9b7f4eb-91a1-4726-03f6-d1503fc48b15.png "sum")

### 3. 時系列、前後関係

###### 3.1. first / last

引数に指定した項目について、データ順で最初/最後の値を返す関数です。

基本的な文法は以下の通りです。

 first(項目)

 last(項目)

以下の例では、項目「 _raw 」の最初/最後の値を取得しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats first(_raw), last(_raw)
```

![スクリーンショット 2022-02-16 21.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6b6dd72b-23cc-0027-0a19-cdd835729ff5.png "first_last")

###### 3.2. earliest / latest

引数に指定した項目について、時系列順で最初/最後の値を返す関数です。

基本的な文法は以下の通りです。

 earliest(項目)

 latest(項目)

以下の例では、項目「 _raw 」の最初/最後の値を取得しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats earliest(_raw), latest(_raw)
```

![スクリーンショット 2022-02-16 21.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/bd4da569-6e81-0c0f-ef98-67f913da92f9.png "earliest_latest")

###### 3.3. データ順と時系列順の違い

 first / last は「データ順」、 earliest / latest は「時系列順」で最初/最後を取得します。
両者はよく似ていますが、正確には異なる処理となります。
以下の SPL 文の結果を見てみましょう。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| sort - _time
| stats first(_time), last(_time), earliest(_time), latest(_time)
```

![スクリーンショット 2022-02-16 21.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1e299e79-840a-0118-45ad-c8596a1b39b9.png "time")

この SPL 文において、データはそのタイムスタンプ( _time の値)が新しいデータが最初に、古いデータが最後になるように並んでいます。
 first / last は「データ順」に見るので

* first : 最も新しいデータ

* last : 最も古いデータ

となります。
一方、 earliest / latest はデータの並び順とは関係なくあくまで「時系列順」に見るので、 first / last とは逆に

* earliest : 最も古いデータ

* latest : 最も新しいデータ

となります。
 SPL 文の結果は多くの場合古いデータが最初に、新しいデータが最後になるように並べるので earliest / latest と first / last は同じになることが多いのですが、動きとしては異なることに注意しましょう。

:::note info
上記の例では _time の値として長い数列が返ってきていますが、これは UNIX 時間と呼ばれる形式で表記された日付時刻の値です。
 UNIX 時間とは1970年1月1日から経過した秒数で日付時刻を表す形式で、 _time の内部的な値はこの形式で格納されています。
 _time という項目名で扱う限りは何月何日といったわかりやすい形式で表示されますが、 _time の項目名を変更する際や、 _time の統計値を求める際などには自動的な形式変換は行われないので注意が必要です。
:::

以上、よく使用する統計関数11個を紹介しました。
次回は、 eval コマンドや where コマンドで使用される評価関数を紹介します。

[戻る](https://qiita.com/frozencatpisces/items/fb8dcaf0094abe9e5bd3)