Splunkのサーチコマンドである、stats、chart、timechartは、覚えておくと非常に便利なコマンドです(特にstats)。Splunkのサーチコマンドを学び始めた頃は、各コマンドのメリットをよく理解できませんでした。特にBY句がサーチ出力にどのように影響するかがわかりませんでした。そこで、試行錯誤を繰り返して出力を比較し、ついにこれらのコマンドの違いを理解することができました。
これら3つのコマンドは変換コマンドです。変換コマンドは、イベントデータを受け取り整形された結果テーブルに変換します。この3つのコマンドでは、カウント、合計、平均などの統計を計算できます。
注:以下の例とSplunkドキュメントでは、読みやすさを考慮してキーワード「BY」をすべて大文字で表記しています。実際のサーチでBYキーワードを指定するときは、大文字と小文字のどちらでもかまいません。
まずは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コマンドの結果と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コマンドを実行すると、イベントデータが結果テーブルに変換され、[Statistics] (統計)タブに表示されます。[Visualization] (視覚化)タブをクリックすると、結果からグラフが生成されます。statsコマンドの結果のグラフがこちらです。
statusフィールドがX軸になり、hostフィールドとcountフィールドがデータシリーズになります。また、カウントの値の範囲がY軸になります。
このグラフには問題点がいくつかあります。
このような問題により、グラフはわかりづらく、結果テーブルの情報が正確に反映されていません。
ただし、statsコマンドでも、BY句でフィールドを1つだけ指定した場合は、有効なグラフを作成できます。BY句のフィールドが複数ある場合は、chartコマンドでグラフを作成するのが効果的です。
statusフィールドがX軸になり、hostの値がデータシリーズになります。また、カウントの値の範囲がY軸になります。
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句とともに使用するときは注意が必要です。
SPLで目的を達成できることを願っています - Laura
ブログ:
Splunkドキュメント:
このブログはこちらの英語ブログの翻訳です。
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。