splunk

Splunkコマンド 「streamstats」でフィールド(カラム)毎に値を累計

更新日:

フィールド毎に値を累計したい場合は、「streamstats」を使います。「accum」コマンドでも累計可能ですが、累計単位を指定した累計ができないので「streamstats」を使います。
eventstats」と似ていますが、「streamstats」は累計に使えます。

サンプルデータ

累計するデータです。
このあと、「Date + Item」単位に累計します。

| makeresults | eval Date = strftime(now() -(3600*24*0),"%Y-%m-%d"),Col_A = 1,Col_B = 10,Item = "AAA" | fields - _time
| append [| makeresults | eval Date = strftime(now() -(3600*24*3),"%Y-%m-%d"),Col_A = 8,Col_B = 80,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*1),"%Y-%m-%d"),Col_A = 5,Col_B = 30,Item = "AAA"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*1),"%Y-%m-%d"),Col_A = 2,Col_B = 20,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*0),"%Y-%m-%d"),Col_A = 6,Col_B = 20,Item = "AAA"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*3),"%Y-%m-%d"),Col_A = 4,Col_B = 20,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*2),"%Y-%m-%d"),Col_A = 3,Col_B = 40,Item = "BBB"   | fields - _time]
| fields Date Item Col_A Col_B

結果

コード

「Col_A」と「Col_B」を累計しています。

| makeresults | eval Date = strftime(now() -(3600*24*0),"%Y-%m-%d"),Col_A = 1,Col_B = 10,Item = "AAA" | fields - _time
| append [| makeresults | eval Date = strftime(now() -(3600*24*3),"%Y-%m-%d"),Col_A = 8,Col_B = 80,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*1),"%Y-%m-%d"),Col_A = 5,Col_B = 30,Item = "AAA"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*1),"%Y-%m-%d"),Col_A = 2,Col_B = 20,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*0),"%Y-%m-%d"),Col_A = 6,Col_B = 20,Item = "AAA"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*3),"%Y-%m-%d"),Col_A = 4,Col_B = 20,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*2),"%Y-%m-%d"),Col_A = 3,Col_B = 40,Item = "BBB"   | fields - _time]
| fields Date Item Col_A Col_B
| sort by - Date Item
| streamstats sum(Col_A) sum(Col_B) by Date Item

結果

ポイント

並び替え(sort)する

集計したいフィールドをソートします。
Date(降順)、Item(昇順)でソートしています。

| sort by - Date Item

累計する単位をbyで指定する

DateとItemを累計単位に指定しています。

| streamstats sum(Col_A) sum(Col_B) by Date Item

eventstatsと組み合わせる

eventstatsと組み合わせて、累計と合計を計算します。

| makeresults | eval Date = strftime(now() -(3600*24*0),"%Y-%m-%d"),Col_A = 1,Col_B = 10,Item = "AAA" | fields - _time
| append [| makeresults | eval Date = strftime(now() -(3600*24*3),"%Y-%m-%d"),Col_A = 8,Col_B = 80,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*1),"%Y-%m-%d"),Col_A = 5,Col_B = 30,Item = "AAA"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*1),"%Y-%m-%d"),Col_A = 2,Col_B = 20,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*0),"%Y-%m-%d"),Col_A = 6,Col_B = 20,Item = "AAA"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*3),"%Y-%m-%d"),Col_A = 4,Col_B = 20,Item = "BBB"   | fields - _time]
| append [| makeresults | eval Date = strftime(now() -(3600*24*2),"%Y-%m-%d"),Col_A = 3,Col_B = 40,Item = "BBB"   | fields - _time]
| fields Date Item Col_A Col_B
| sort by - Date Item
| streamstats sum(Col_A) by Date Item
| eventstats sum(Col_A) as totalCol_A by Date Item

結果

streamstatsで計算した「sum(Col_A)」は累計、eventstatsで計算した「totalCol_A」は合計になっています。(便利ですねー)

まとめ

累計はaccumコマンドが用意されていて、お手軽に使えるのですが、複雑な累計には対応していないので、streamstatsコマンドを覚えておくと便利です。
公式サイトにはtime windowを指定したstatsなど、さらに詳しく掲載されているので、興味がある方はご確認ください。







-splunk
-

Copyright© Tech Log , 2020 All Rights Reserved Powered by STINGER.