Splunk: statsとchartの使い分け


時々よくわからなくなるのでメモ。

実施環境: Splunk Free 8.2.2

Splunk の SPL コマンドには、 stats コマンドと chart コマンドという2つの統計コマンドが存在します。
この2つは与える式によっては同じような結果を出力するため、しばしばどのように使い分けるべきか迷うことがあります。
実際のところ、どのように使い分ければよいのでしょうか。

結論から言えば、「2つのグループで分割される統計値」なら chart コマンド、それ以外であれば stats コマンドが適当です。

実際に動作を確認してみましょう。

まずは、グループで分割しない場合。

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number)

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number)

グループで分割しない場合、 stats コマンドと chart コマンドは同様の結果を出力します。

次に、1つのグループで分割する場合。

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number) BY Flag1

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number) BY Flag1

1つのグループで分割する場合も、結果は同じです。

結果に違いが出てくるのは、グループが2つとなった場合です。

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number) BY Flag1, Flag2

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number) BY Flag1, Flag2

stats コマンドの場合はグループ1とグループ2がそれぞれ列に入れられ2つの列の組み合わせで分割されますが、 chart コマンドの場合はグループ1は列に、グループ2は行になり、行と列の組み合わせで値が配置されます。

なお、上記の例では統計値を3つ計算していますが、統計値は1つに絞ったほうが見やすいかと思います。

さらにグループが3つ以上となった場合、 chart コマンドは使用できなくなります。

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number) BY Flag1, Flag2, Flag3

Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number) BY Flag1, Flag2, Flag3