TIPS & TRICKS

Splunkサーチコマンド > stats、chart、timechart

Splunkのサーチコマンドである、statscharttimechartは、覚えておくと非常に便利なコマンドです(特にstats)。Splunkのサーチコマンドを学び始めた頃は、各コマンドのメリットをよく理解できませんでした。特にBY句がサーチ出力にどのように影響するかがわかりませんでした。そこで、試行錯誤を繰り返して出力を比較し、ついにこれらのコマンドの違いを理解することができました。

これら3つのコマンドは変換コマンドです。変換コマンドは、イベントデータを受け取り整形された結果テーブルに変換します。この3つのコマンドでは、カウント、合計、平均などの統計を計算できます。

注:以下の例とSplunkドキュメントでは、読みやすさを考慮してキーワード「BY」をすべて大文字で表記しています。実際のサーチでBYキーワードを指定するときは、大文字と小文字のどちらでもかまいません。

statsコマンドの結果テーブル

まずはstatsコマンドから見ていきましょう。HTTPステータスコードごとにイベント数をカウントします。

... | stats count BY status

[Statistics] (統計)タブにテーブルが表示され、各行にステータスコードごとのイベント数が示されます。

ステータス カウント
200 34282
400 701
403 228
404 690


結果として出力されるテーブルでは基本的に、フィールド値(200、400、403、404)が行ラベルになります。

statsコマンドでは、BY句でフィールドを指定すると、そのフィールドに基づいて結果がグループ化されます。たとえば、www1、www2、www3の3つのホストからイベントを受け取る場合、BY句にhostフィールドを追加すると、結果がさらに細かくグループ化されます。

... | stats count BY status, host

ステータスとホストの組み合わせごとに、テーブルの各行にイベント数が表示されます。

ステータス ホスト カウント
200 www1 11835
200 www2 11186
200 www3 11261
400 www1 233
400 www2 257
400 www3 211
403 www2 228
404 www1 244
404 www2 209
404 www3

237

BY句で指定する各フィールドは、結果テーブルでは個別の列になります。この例では、行をまずステータスごとに分けてから、ホストごとに分けています。statsコマンドのBY句で指定するフィールドは、行分割フィールドと呼ばれます。

この例では、Webサイトでユーザーが、addtocart (カートに追加)、changequantity (数量を変更)、purchase (購入)、remove (削除)、view (表示)の5つのアクション(action)を実行できます。

サーチにアクションを追加してみましょう。

... | stats count BY status, host, action

今度は、行がまずステータスごと、次にホストごと、さらにアクションごとに分けられます。by句にactionフィールドを追加したときの結果テーブルの一部を次に示します。

ステータス ホスト アクション カウント
200 www1 addtocart 1837
200 www1 changequantity 428
200 www1 purchase 1860
200 www1 remove 432
200 www1 view 1523
200 www2 addtocart 1743
200 www2 changequantity 365
200 www2 purchase 1742

statsコマンドを使用する大きなメリットの1つは、BY句に複数のフィールドを指定して、詳細な統計を示す結果テーブルを作成できる点です。

chartコマンドの結果テーブル

同じ基本サーチで、chartコマンドの結果とstatsコマンドの結果を比べてみましょう。

BYフィールドを1つだけ指定したときは、statsコマンドとchartコマンドの結果は同じです。しかし、BYフィールドを2つ指定すると、chartコマンドの結果は明らかに異なります。

statsコマンドでBYフィールドを2つ指定した結果は次のようになりました。

ステータス ホスト カウント
200 www1 11835
200 www2 11186
200 www3 11261
400 www1 233
400 www2 257
400 www3 211
403 www2 228
404 www1 244
404 www2 209
404 www3 237

では、statsコマンドの代わりにchartコマンドを使ってサーチを実行してみましょう。

... | chart count BY status, host

結果は次のようになります。

ステータス www1 www2 www3
200 11835 11186 11261
400 233 257 211
403 0 288 0
404 244 209 237

 

chartコマンドでは、1つ目のBYフィールドであるstatusによって結果がグループ化されます。statusフィールドの値ごとに、結果が個別の行に表示されます。この1つ目のBYフィールドが行分割フィールドになります。そしてchartコマンドでは、2つ目のBYフィールドであるhostによって、結果が個別の列に分けられます。この2つ目のBYフィールドは列分割フィールドと呼ばれます。この場合、hostフィールドの値が列ラベルになります。

2つの結果テーブルでステータスコード403の結果を比べてみてください。statsコマンドでは、ステータスコード403にホストwww1とwww3の結果はありません。一方、chartコマンドでは、列分割フィールドに対応するイベントがない場合、値0が返されます。

statsコマンドとchartコマンドの重要な違いの1つは、BY句で指定できるフィールド数です。statsコマンドでは、BY句でフィールドのリストを指定でき、そのすべてが行分割フィールドになります。statsコマンドのBY句の構文は次のとおりです。

BY <field-list>

一方chartコマンドでは、指定できるフィールドは2つまでで、1つが行分割フィールド、もう1つが列分割フィールドになります。

chartコマンドでは、次のように、BY句のフィールドを2つの方法で指定できます。

 

... | chart count BY status, host

... | chart count OVER status BY host

chartコマンドのBY句の構文は次のとおりです。

[ BY 行分割 列分割 ] [ OVER 行分割] [BY 列分割]

chartコマンドを使用するメリットは、グラフの作成に適した統合的な結果テーブルを作成できる点です。それがどういうことか次に説明しましょう。

statsコマンドとchartコマンドの視覚化

statsコマンドとchartコマンドを実行すると、イベントデータが結果テーブルに変換され、[Statistics] (統計)タブに表示されます。[Visualization] (視覚化)タブをクリックすると、結果からグラフが生成されます。statsコマンドの結果のグラフがこちらです。

statusフィールドがX軸になり、hostフィールドとcountフィールドがデータシリーズになります。また、カウントの値の範囲がY軸になります。

このグラフには問題点がいくつかあります。

  1. X軸のステータスコード1つに対して複数の値がある。
  2. hostの値(www1、www2、www3)は文字列値であるためグラフ化できない。凡例にはhostと表示されているが、グラフの棒に青い部分がない。

このような問題により、グラフはわかりづらく、結果テーブルの情報が正確に反映されていません。

ただし、statsコマンドでも、BY句でフィールドを1つだけ指定した場合は、有効なグラフを作成できます。BY句のフィールドが複数ある場合は、chartコマンドでグラフを作成するのが効果的です。

statusフィールドがX軸になり、hostの値がデータシリーズになります。また、カウントの値の範囲がY軸になります。

timechartコマンドとは

timechartコマンドを使用すると、結果テーブルでは常にイベントがそのタイムスタンプ(_timeフィールド)によってグループ化されます。結果テーブルでは、タイムスタンプ値が行分割フィールドになります。そのため、BY句で指定できるのは1つの列分割フィールドのみです。たとえば次のサーチでは、statusフィールドを列分割フィールドとして指定してカウントを生成しています。

... | timechart count BY status

結果テーブルは次のようになります。

_time 200 400 403 404
2018-07-05 1038 27 7 19
2018-07-06 4981 111 35 98
2018-07-07 5123 99 45 105
2018-07-08 5016 112 22 105
2018-07-09 4732 86 34 84
2018-07-10 4791 102 23 107
2018-07-11 4783 85 39 98
2018-07-12 3818 79 23 74

代わりにhostフィールドを指定すると、結果テーブルは次のようになります。

_time

www1

www2

www3

2018-07-05 372 429 419
2018-07-06 2111 1837 1836
2018-07-07 1887 2046 1935
2018-07-08 1927 1869 2005
2018-07-09 1937 1654 1792
2018-07-10 1980 1832 1733
2018-07-11 1855 1847 1836
2018-07-12 1559 1398 1436

_time列のタイムスタンプの間隔は、サーチの時間範囲、またはtimechartコマンドで指定する引数によって決まります。前の例では、時間範囲はAll time (過去すべて)に設定され、この例では数週間分のデータが対象になっています。間隔は、spanを指定していないため、デフォルトの間隔が使用されます。この場合、デフォルトの間隔は1日です。

Last 24 hours (過去24時間)のような時間範囲を指定した場合、デフォルトの間隔は30分です。よく使われる時間範囲のデフォルトの間隔は、timechartのドキュメントの「Usage」セクションで確認できます。デフォルトの30分間隔の結果テーブルは次のようになります。

_time www1 www2 www3
2018-07-12 15:00:00 44 22 73
2018-07-12 15:30:00 34 53 31
2018-07-12 16:00:00 14 33 36
2018-07-12 16:30:00 46 21 54
2018-07-12 17:00:00 75 26 38
2018-07-12 17:30:00 38 51 14
2018-07-12 18:00:00 62 24 15

timechartコマンドには、statsコマンドやchartコマンドにはないさまざまなオプションがあります。たとえば、次のように間隔を指定できます。

... | timechart span=12h count BY host

_time www1 www2 www3
2018-07-04 17:00 801 783 819
2018-07-05 05:00 795 847 723
2018-07-05 17:00 1926 1661 1642
2018-07-06 05:00 1501 1774 1542
2018-07-06 17:00 2033 1909 1857
2018-07-07 05:00 1482 1671 1594
2018-07-07 17:00 2027 1818 2036

この例では、サーチを実行した時刻(ロカール時刻)とUNIX時間(エポックタイムとも呼ばれます)との調整に基づいて、12時間間隔で結果が表示されます。

注:timechartコマンドで指定できるオプションはほかにもたくさんあります。これらについては別のブログでご紹介します。

次に、これらの結果のグラフを見てみましょう。[Visualization]タブでは、_timeがX軸になります。X軸では、各日の午後12時と午前12時の間隔で目盛りが刻まれます。ただし、この例ではデータが各日の17時から翌日5時の間に表示されます。

BY句で指定したフィールドがデータシリーズになります。また、カウントの値の範囲がY軸になります。

まとめ

stats、chart、timechartの各コマンドは似ていますが、BY句とともに使用するときは注意が必要です。

  • 詳細な統計を示す結果テーブルを作成したいときは、statsコマンドを使用します。
  • BY句に3つ以上のフィールドを指定したいときも、statsコマンドを使用します。
  • 概要がわかる統合的な状況を示す結果テーブルを作成したいときは、chartコマンドを使用します。
  • 結果テーブルのデータからグラフを作成したいときも、chartコマンドを使用します。
  • 日時に基づく結果テーブルとグラフを作成したいときは、timechartコマンドを使用します。

SPLで目的を達成できることを願っています - Laura

参照資料

ブログ:

Splunkドキュメント:

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

Laura Stewart
Posted by

Laura Stewart

Laura unravels the SPL maze, bringing clarity to the murky. She has been a software instructor, wrote books on Excel, PowerPoint, and Project, and spent some very interesting time working at the Defense Intelligence Agency in DC. Laura is a Principal Technical Writer at Splunk, with a focus on the Splunk SPL documentation.