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
対象のフィールド(とその値)は次のようになります。
STATS
上のスクリーンショットでは、結果領域にRawログイベントが表示され、左側のリストにはbytesとclientipを含む多数のフィールドが表示されていますが、今必要なのはclientipごとのバイト数だけです。clientipごとのバイト数の合計を計算するには、statsコマンドとsum関数を使用します。ついでに、結果の名前を「ASimpleSumOfBytes」に変更しましょう。これにより、わかりやすくするなるだけでなく、先頭に「A」を付けることでアルファベット順のリストで見付けやすくもなります。
sourcetype=access_combined* | head 5 | stats sum(bytes) as ASimpleSumOfBytes by clientip
上記のサーチの意味については、Splunkドキュメントのサーチマニュアルで「search pipeline」セクションと各種のサーチコマンドの説明を参照してください。作成された中間テーブルの内容も参考になるでしょう。
上記のサーチでは、統計この例ではsumが計算され、その結果がクライアントIPアドレスとともにテーブル表示されます。非常に簡単で便利ですが、もしここで、このサーチで元のバイト数(またはいずれかの関連フィールド)をテーブルに追加したくなったらどうすればよいでしょうか。とりあえず次のようにしてみましょう。
sourcetype=access_combined* | head 5 | stats sum(bytes) as ASimpleSumOfBytes by clientip | table bytes, ASimpleSumOfBytes, clientip
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
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
STREAMSTATS
統計と元のイベントを集約できるのはすばらしいことですが、もしここで、同じことをストリーミング形式で、つまりイベントが検出された時間順に結果を見たい場合はどうすればよいでしょうか。そのときに使用するのがstreamstatsコマンドです。わかりやすくするために、まずイベントを時間順に並べ替えます。そのため、内部フィールドの「_time」を使用してから、streamstatsを実行します。
sourcetype=access_combined* | head 5 |sort _time | streamstats sum(bytes) as ASimpleSumOfBytes by clientip | table _time, clientip, bytes, ASimpleSumOfBytes
eventstatsと同様に、streamstatsでも統計と元のデータが集約されます。元のすべてのデータを後続の計算で使用できる点も同じです。下のテーブルでは、日時と元のバイト数を追加したため、streamstatsコマンドの機能がよくわかります。
sourcetype=access_combined* | head 5 |sort _time | streamstats sum(bytes) as ASimpleSumOfBytes by clientip | table _time, clientip, bytes, ASimpleSumOfBytes
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プラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。