1
Help us understand the problem. What are the problem?

posted at

updated at

Organization

【Splunk】1サーチで複数の時間範囲のサーチ結果を比較する

Splunkは様々なデータに対応した統合ログプラットフォームです。
SPLというサーチ言語を利用してログから自分の見たい情報を抽出、Commnadsを活要して集計処理やデータの加工など様々なことが可能です。

Splunkは以下の図のようにlinechartをはじめpiechartやareachartなど様々な視覚エフェクトが提供されており、サーチ結果に対する可視化にも優れています。
image.png

本記事ではSplunkそのものや様々なCommandsの深堀はしないためSplunkをより詳しく知りたい方はチートシートや公式ドキュメントを参照いただければと思います。日本語マニュアルも充実しています。

やりたいこと

1サーチで複数の時間範囲のサーチ結果を比較したい!

例えば以下のSPLではhost名hogeの1分毎のデータ量を得ることができます。

index=main sourcetype=ms:iis:auto host=hoge | timechart span=1m

上記のSPLでサーチした場合取得できる結果はあくまでGUIから指定している時間範囲の結果のみです。
image.png

複数の時間範囲、例えば①2021/12/01 AM09:00~AM09:15と②2021/12/02 AM09:00~AM09:15をサーチし視覚エフェクトを使ってビジュアル化して比較したいと思うシーンがありました。

  • 素直に2回サーチ
  • ダッシュボード機能を活用して2つの検索結果を横に並べて表示する

上記のような方法でも比較はできるのですが、グラフを重ねて(できるだけ綺麗に)表示する方法がないかと模索しておりました。

image.png

調べたら簡単にできたので実現方法について記載したいと思います。

実現方法

Splunkのブログに記載されていた方法を参考に以下のようなサーチ文にすることで欲しいデータを取得することができました。

index=main sourcetype=ms:iis:auto host=hoge
| eval ReportKey="期間①"
| append [search index=main sourcetype=ms:iis:auto host=hoge earliest=1638403200 latest=1638404100
| eval ReportKey="期間②"
| eval _time=_time-86400]
| timechart span=1m count by ReportKey

何をしているか

ベースサーチ

index=main sourcetype=ms:iis:auto host=hoge

GUIで指定を行なった時間範囲内からマッチするイベントのみを抽出しています。

eval

| eval ReportKey="期間①"

1行目の検索結果をパイプで繋いでevalコマンドを利用しています。
evalコマンドは計算などに利用できるコマンドで、計算結果を元に新規のFieldとValueを作ることができます。
今回の場合はSearchTermで抽出したイベント全てにReportKeyというFieldを追加し、Valueとして期間①を入れています。

ここまでの処理結果をtableコマンドで見てみます。

index=main sourcetype=ms:iis:auto host=hoge
| eval ReportKey="期間①"
| table _time ReportKey _raw 

tableコマンドは引数で指定したField名のみのテーブルを応答してくれるコマンドです。
今回引数としてfield: _timeと作成したfield: ReportKey、さらにfield: _rawを指定しています。_rawはデータ取り込み時に内部的に作成されるfieldで一言で言えば各イベントをKeyValueの形に分解する前の生データが格納されています(パフォーマンス低下の恐れがあるため_rawは可能な限り避けた方が良いです)、_timeも内部的に作成されるfieldで_raw内にタイムスタンプがあればその値が入ります。

サーチ結果では以下のように抽出したイベントにfield: ReportKeyが作成され、Valueに期間①が入っていることが確認できます。

image.png

appendとsub search

| append [search index=main sourcetype=ms:iis:auto host=hoge earliest=1638403200 latest=1638404100
| eval ReportKey="期間②"
| eval _time=_time-86400]

appendコマンドを利用し行を追加して
追加する行に入るデータをsub searchで抽出します。[search ]で囲われた範囲がsub searchとなります。

sub search内でやっていること

①sub search内のベースサーチ内で明示的にfield: earliestとfield: latestを指定してsub searchの抽出対象とする期間を指定しています(今回の例では2021/12/2 09:00~2021/12/2 09:15)。
②抽出結果にさらにevalでfield: ReportKeyを作成し期間②という値を入れています。
③さらにevalコマンドを利用しsub search結果のfield: _timeの全ての値を-86400(秒)した値に書き換えます。86400秒は1日(24時間)なのでこのサーチでは12/2のデータを1日前の12/1として扱う状態にしました。

timechart

| timechart span=1m count by ReportKey

sub searchとevalを使って同じ時間軸のデータとすることができたので最後にtimechartコマンドで比較します。by句で集計する対象をReportKeyの値とすることで以下のような可視化ができました。

image.png

最後に

異なる2つの時間範囲を1つのサーチで抽出し、視覚エフェクトを活用し分かりやすく比較する方法を記載しました。
今後もSplunkの小技等を見つけたら投稿していきたいと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?