Splunkサーチコマンド > stats、eventstats、streamstats

Tips & Tricks Splunk

Splunkサーチコマンド stats、eventstats、streamstats入門

Splunkに入社した当初は、多くの新入社員と同様に、何から始めればよいかわかりませんでした。そのとき誰かがすばらしいアドバイスをくれました。

「statsコマンドとevalコマンドを学びなさい」

evalコマンドについては別のブログ記事で取り上げることにして、この記事ではstatsコマンドについて説明します。正直なところ、まだ「super grep」しか使えないSplunk社員の多さに驚かずにはいられません。Splunkで大量のマシンデータソースを検索するのは良いとして、相当数の社員がキーワードやフレーズで検索しているのは残念なことです。願わくは、この記事が「super grep」卒業のきっかけになるとともに、statsコマンドの使い方をマスターでき、Splunk初心者の助けになってくれればよいと思います。

Splunkの優秀なドキュメントをのぞいてみると、statsコマンドにはeventstatsとstreamstatsという兄弟コマンドがあることがわかります。このブログ記事では、シンプルなWebログを例に使って、eventstatsとstreamstatsのコマンドの機能と違いについて説明します。statsは一般的に幅広い用途に利用できますが、ここでは、用途がやや限定されたeventstatsとstreamstatsを説明するためのお膳立てとして使用します。記事の最後では、参照ドキュメントのリンクを紹介します。まずはstatsコマンドの動作について順を追って説明し、その後、その例を使ってstatsとeventstatsおよびstreamstatsの違いを説明します。わかりやすくするために、例として使用するイベントデータ数はheadコマンドで5つに限定しています。statsをよく理解している場合は、eventstatsやstreamstatsの説明から読み始めていただいてもかまいません。

その名のとおり、Splunkサーチコマンドのstatsは統計(statistics)のためのコマンドです。Splunkドキュメントには次のようにあります。

説明:
SQLの集計関数と同様に、データセットの集計を計算します。by句を指定せずに呼び出すと、受け取った結果セット全体の集計を示す行が1つだけ生成されます。by句でフィールドを指定すると、そのフィールドの値ごとに行が生成されます。

利用できる統計関数は、avg()、count()、distinct_count()、median()、perc()、stdev()、sum()、sumsq()など、数多くあります。では、いくつかのWebログのデータからIPアドレスごとにバイト数を合計する簡単なサーチコマンドを見てみましょう。

まずは、Splunk内のWebログに対してシンプルなサーチを実行して、5つのイベントを取得し、クライアントIP (clientip)フィールドの2つのIPアドレスについてバイト数を確認します。

sourcetype=access_combined* | head 5

SplunkサーチによるWebログのbytesとclientip

対象のフィールド(とその値)は次のようになります。

ses8

STATS

上のスクリーンショットでは、結果領域にRawログイベントが表示され、左側のリストにはbytesとclientipを含む多数のフィールドが表示されていますが、今必要なのはclientipごとのバイト数だけです。clientipごとのバイト数の合計を計算するには、statsコマンドとsum関数を使用します。ついでに、結果の名前を「ASimpleSumOfBytes」に変更しましょう。これにより、わかりやすくするなるだけでなく、先頭に「A」を付けることでアルファベット順のリストで見付けやすくもなります。

sourcetype=access_combined* | head 5 | stats sum(bytes) as ASimpleSumOfBytes by clientip

ses2

上記のサーチの意味については、Splunkドキュメントのサーチマニュアルで「search pipeline」セクションと各種のサーチコマンドの説明を参照してください。作成された中間テーブルの内容も参考になるでしょう。

上記のサーチでは、統計この例ではsumが計算され、その結果がクライアントIPアドレスとともにテーブル表示されます。非常に簡単で便利ですが、もしここで、このサーチで元のバイト数(またはいずれかの関連フィールド)をテーブルに追加したくなったらどうすればよいでしょうか。とりあえず次のようにしてみましょう。

sourcetype=access_combined* | head 5 | stats sum(bytes) as ASimpleSumOfBytes by clientip | table bytes, ASimpleSumOfBytes, clientip
ses3

bytesフィールドに何も表示されていません。ドキュメントでも説明されているとおり、これはサーチの構造の問題です。Splunkコマンドや条件ではそれぞれ、ユーザーがテーブルを割り当てるコマンドを発行しなくても中間テーブルが生成されます。bytesのような元のフィールドを追加したい場合や、元のフィールドに追加の計算を行いたい場合は、それらをstatsコマンドの前に置かなければなりません。そのため、サーチコマンド文字列の末尾にbytesフィールドを追加すると、上のスクリーンショットのような結果になってしまいます。ここで登場するのがeventstatsです。

EVENTSTATS

上の例でbytes列が空になったのは、statsコマンドでテーブルを作成した後ではパイプラインの前半にある元のbytesフィールドを認識できないためです。このようなときに役立つのがeventstatsです。Splunkコマンドのeventstatsは、statsと同様に要求された統計を計算しますが、次に示すように、その結果と元のRawデータを集約できる点が異なります。

sourcetype=access_combined* | head 5 | eventstats sum(bytes) as ASimpleSumOfBytes by clientip

Splunk search eventstatsバイト数の合計

statsの結果と同様にASimpleSumOfBytesの値は2つ(各clientipに1つずつ)ありますが、これらはRawイベントと集約されており、後続の計算で使用することができます。ちなみにRawデータは変更されません。eventstatsではデータが表示上でのみ集約されます。

clientipと合計に加えて各イベントのbytesフィールドを表示したい場合、statsでは失敗しましたが、eventstatsでは簡単に追加できます。テーブルでは、clientipごとの合計バイト数が、元の各bytes値と並んで表示されます。サーチは次のようになります。

sourcetype=access_combined* | head 5 | sort _time | streamstats sum(bytes) as ASimpleSumOfBytes by clientip

ses5

STREAMSTATS

統計と元のイベントを集約できるのはすばらしいことですが、もしここで、同じことをストリーミング形式で、つまりイベントが検出された時間順に結果を見たい場合はどうすればよいでしょうか。そのときに使用するのがstreamstatsコマンドです。わかりやすくするために、まずイベントを時間順に並べ替えます。そのため、内部フィールドの「_time」を使用してから、streamstatsを実行します。

sourcetype=access_combined* | head 5 |sort _time | streamstats sum(bytes) as ASimpleSumOfBytes by clientip | table _time, clientip, bytes, ASimpleSumOfBytes

Splunk search streamstatsのバイト数の合計

eventstatsと同様に、streamstatsでも統計と元のデータが集約されます。元のすべてのデータを後続の計算で使用できる点も同じです。下のテーブルでは、日時と元のバイト数を追加したため、streamstatsコマンドの機能がよくわかります。

sourcetype=access_combined* | head 5 |sort _time | streamstats sum(bytes) as ASimpleSumOfBytes by clientip | table _time, clientip, bytes, ASimpleSumOfBytes

ses7

statsやeventstatsでは各clientipの総計が示されましたが、上のスクリーンショットでわかるとおり、streamstatsでは各イベントのバイト数が検出時間に沿って順に合計されます。各clientipの最終的な合計は、statsとeventstatsで計算された総計と一致します。

特徴は、計算済みフィールド「ASimpleSumOfBytes」の値がイベントの検出日時によって変化する点です。その利点は何でしょうか。特定の時点または時間範囲に何が起きたかを知りたい人は多いでしょう。streamstatsはまさにそのためのサーチとレポート生成に役立ちます。

関連するSplunkドキュメントとAnswersコミュニティのリンクを以下に示します。ぜひチェックしてお役に立てください。

Splunkのメリットをどうぞお試しください。

参照資料

Splunkサーチ言語の概要
http://docs.splunk.com/Documentation/Splunk/latest/Search/Aboutthesearchlanguage

streamstatsに関連するSplunkの日時の視覚化の理解に役立つAnswersへの投稿
https://community.splunk.com/t5/Splunk-Search/streamstats-is-reversed/td-p/93431

Splunkドキュメントのstatsページ
http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Stats

statsで使用できる関数
http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonStatsFunctions

このブログはこちらの英語ブログの翻訳です。

関連記事

Splunkテクニカルサポート:問題解決のためのチェックリストとヒント
Tips
4 分程度

Splunkテクニカルサポート:問題解決のためのチェックリストとヒント

Splunkテクニカルサポートへお問い合わせの際、できるだけ早くお客様とスムーズな問題解決をご提供するために、弊社のサポートエンジニア担当者目線で、お問い合わせの際のチェックリストとヒントを紹介させていただきます。是非、ご一読ください。
Splunkに燃料を与える:Universal Forwarderによるリアルタイムでのデータ取込方法とインストール (パート1)
Tips
6 分程度

Splunkに燃料を与える:Universal Forwarderによるリアルタイムでのデータ取込方法とインストール (パート1)

Splunkの使用する際に、「どのようにログ(データ)を取り込むのかわからない」とお悩みの方向け。Splunk Universal Forwarder(ユニバーサル フォワーダー)を使用した様々なデータ取り込み方法・設定と、Universal Forwarderのインストール方法をご紹介します。
1つのレポートで2つの時間範囲を比較する
Tips
6 分程度

1つのレポートで2つの時間範囲を比較する

2つの時間範囲でデータの関係を調べる方法をご紹介します。