TIPS & TRICKS

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

先日お客様に、最新データと履歴データを1つのレポートで表示する方法を尋ねられました。 下の図のように、今日のデータを示すグラフと昨日のデータを示すグラフを1つにまとめたレポートです。 こうすれば、2つの時間範囲のデータの関係を簡単に確認できます。
1つのレポートにまとめられた2つの時間範囲のグラフ
今日と昨日のように、2つの時間範囲を調べるサーチの基本構造は次のとおりです。

<昨日のデータのサーチ> | eval ReportKey=”Yesterday” | modify the “_time” field | append [<今日のデータのサブサーチ> | eval ReportKey=”Today”] | timechart

このサーチで使用している「eval」、「timechart」、「append」コマンドの使い方と、サブサーチの構文について詳しく知るには、次のリンクからSplunkのオンラインドキュメントに移動し、各コマンドと関連する関数の説明を参照してください。

evalコマンド      timechartコマンド    appendコマンド
eval関数               timechart関数             サブサーチ

1つのレポートに2つの時間範囲を表示する鍵は、Splunkの「_time」フィールドです。 先に進む前に、時間に関するSplunkドキュメントをご確認ください。

メインページ:サーチの時間修飾子

基本をご存じの場合はこちらの例をご参照ください:相対時間修飾子の例

ではサーチを作っていきましょう。 例として、システムのCPU使用率について昨日の5分平均と今日の5分平均を直接比較します。 ここでは、「*nix」Appで収集したCPUデータを使用します。このAppはSplunkbaseからダウンロードできます。

まずは、1つの時間範囲のデータを表示するサーチを作成します。 タイムピッカーを使って時間範囲を選択することも、サーチバーに相対時間修飾子を直接入力することもできます。 以下のサーチをSplunkにコピー&ペーストした場合、このブログ記事で使っている2重引用符文字が原因で機能しない可能性があるのでご注意ください。

次のサーチでは、今日のすべてのCPU pctIdleイベントが表示されます。 pctIdleを使用しているのは、私のシステムではCPU使用率が低すぎてグラフでうまく表示できないためです。また、このCPUデータはカラム形式であるため、「multikv」コマンドを追加してカラム名をフィールド名に変換しています。 「latest」を指定しない場合は「latest=now」がデフォルトとなるため、実際はこの指定は不要ですが、「now」以外で終わる時間範囲を指定する場合は「latest」フィールドの指定が必要です。

index=”os” sourcetype=”cpu” earliest=-0d@d latest=now | multikv

次に、昨日のすべてのCPU pctIdleイベントを表示します。サーチは次のようになります。

index=”os” sourcetype=”cpu” earliest=-1d@d latest=-0d@d | multikv

Splunkで複数のサーチを1つにまとめる方法の1つとして、「append」コマンドとサブサーチがあります。 その構文は次のようになります。

search1 | append [search2]

実際のサーチは次のようになります。

index=”os” sourcetype=”cpu” earliest=-0d@d latest=now | multikv | append [search index=”os” sourcetype=”cpu” earliest=-1d@d latest=-0d@d | multikv ]

 

左角かっこ「[」の直後に「search」コマンドがあることに注意してください。 パイプ「|」またはサブサーチの角かっこ「[」の後に追加のサーチを指定する場合は、常に「search」コマンドを指定します。このコマンドを指定しないとエラーになります。

表示されたイベントのリストを見ると、昨日の午前12時から現在までの2日分のデータが取得されていることがわかります。

次に、レポートに表示する際に2つの時間範囲を分ける方法が必要です。 そこで、「eval」コマンドを使用して、「ReportKey」という新しいフィールドを作成します。 これにより、レポート内で各時間範囲を分けるタイトルを指定します。 フィールド名は自由に決めて構いません。 「ReportKey」はSplunkの特殊フィールド名ではありません。

index=”os” sourcetype=”cpu” earliest=-0d@d latest=now | multikv | eval ReportKey=”today” | append [search index=”os” sourcetype=”cpu” earliest=-1d@d latest=-0d@d | multikv | eval ReportKey=”yesterday”]

データを折れ線グラフで表示するには、「timechart」コマンドを使用します。 CPU pctIdleの5分平均のグラフを表示するサーチは次のようになります。

index=”os” sourcetype=”cpu” earliest=-0d@d latest=now | multikv | eval ReportKey=”today” | append [search index=”os” sourcetype=”cpu” earliest=-1d@d latest=-0d@d | multikv | eval ReportKey=”yesterday”] | timechart span=5m avg(pctIdle) by ReportKey

これで、昨日のデータと今日のデータが別々の折れ線グラフで表示されます。
昨日と今日のデータが別々に表示される折れ線グラフ
2つのグラフを重ね合わせて表示するには、Splunkの特殊フィールドである「_time」を編集する必要があります。 「_time」はイベントのタイムスタンプフィールドで、SplunkタイムラインやSplunkレポートでのイベントデータの表示方法を操作できます。 昨日のイベントの「_time」フィールドに24時間を追加すれば、レポートで昨日のイベントが本日の同時刻上に表示されます。

index=”os” sourcetype=”cpu” earliest=-0d@d latest=now | multikv | eval ReportKey=”today” | append [search index=”os” sourcetype=”cpu” earliest=-1d@d latest=-0d@d | multikv | eval ReportKey=”yesterday” | eval _time=_time+86400] | timechart span=5m avg(pctIdle) by ReportKey

86400は、1日を秒数で表した数字です。 自分で計算する代わりに「eval」コマンドで数式を使うこともできます。 その場合は、「eval _time=_time+60*60*24」(60秒×60分×24時間)と指定します。

これでレポートが完成しました。
1つのレポートにまとめられた2つの時間範囲のグラフ
今日のデータと先週の同じ曜日のデータを比較したい場合は、2つ目のサーチの時間範囲、「ReportKey」、「_time」を次のように変更するだけです。

index=”os” sourcetype=”cpu” earliest=-0d@d latest=now | multikv | eval ReportKey=”today” | append [search index=”os” sourcetype=”cpu” earliest=-7d@d latest=-6d@d | multikv | eval ReportKey=”same day last week” | eval _time=_time+60*60*24*7] | timechart span=5m avg(pctIdle) by ReportKey

注:Splunk 4.3.1より前の一部のバージョンでは、サブサーチの「_time」フィールドを変更すると、サブサーチで返されるはずのイベントの一部が返されないことがあります。その場合は、サブサーチで「_time」の値を入れる新しいフィールドを作成してから、サブサーチの後で「eval」を使って「_time」フィールドを指定するように変更してください。ここで使用している「if」と「isnotnull」関数については、 eval関数のドキュメントを参照してください。上記の最終版サーチからの変更箇所をハイライトで示します。

index=”os” sourcetype=”cpu” earliest=-15d@d latest=-14d@d | multikv | eval ReportKey=”today” | append [search index=”os” sourcetype=”cpu” earliest=-16d@d latest=-15d@d | multikv | eval ReportKey=”yesterday” | eval new_time=_time+86400] | eval _time=if(isnotnull(new_time), new_time, _time) | timechart span=1h avg(pctIdle) by ReportKey

ぜひご活用ください。 

更新:David Carasso氏のすばらしい著書、『Exploring Splunk (Splunkを使ってみよう)』には、このようなサーチを、サブサーチを使わずに実行する優れた例が紹介されています。この方法を使用すれば、Splunkでのサブサーチで返されるイベント数の制限を回避できます。

この本をお持ちの場合は、第6章「監視 (モニター) とアラート」の、「Charting Week Over Week Results」(85ページ)のセクションでサンプルをご覧いただけます。

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

----------------------------------------------------
お読みいただきありがとうございました
Jon Webster

このブログはこちらの英語ブログ(February 19, 2012公開)の翻訳、住吉 章治によるレビューです。

Splunk
Posted by

Splunk

世界の様々な企業が、デジタルシステムの安全性と信頼性を維持するためにSplunkを信頼しご利用いただいています。Splunkのソフトウェアソリューションとサービスは、ビジネスの継続に関わる重大な問題を未然に防ぎ、回復力を高め、イノベーションを加速します。Splunkの機能Splunkが選ばれる理由をご覧ください。