Posted at

Splunkコマンド集 その2

More than 1 year has passed since last update.

前回に続いて、Splunkコマンドの紹介です。


コマンド紹介


transaction

一番好きなコマンド。

IPアドレスやユーザー名、ID等をキーとして、関連するイベント(ログ行)をまとめるコマンド。

複数のソースタイプもまとめられるので、トラブルシューティングに便利。

ただ、実際はマシンパワーを食うので、 maxspan maxpause startswith endswith といったオプションの指定は必須。

例)

sourcetype=apache:access OR sourcetype=tomcat:access:log 

| transaction maxspan=3s clientip

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Transaction

ちなみに、maxspanは1トランザクション内での最大時間、maxpauseはトランザクション間の間隔。

セキュリティ用途でも 「3秒間に同一IPアドレスで1,000件以上のアクセス」 を抽出するときにこれをつかうと便利。

語りだすと長くなるので、また別途。


eventstats

イベントをまたいでの統計を追加するもの。

例えば、statsコマンドでIPアドレスごとの件数を取得して、その件数の全体の平均値を計算してその差分をとるときとか。

例)

sourcetype=apache:access 

| stats count by clientip
| eventstats avg(count) as avg_count
| eval delta = abs(count - avg_count)
| sort - delta

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Eventstats


streamstats

2番目に好きなコマンド。

eventstats と似ているけど、スライディングウィンドウで累積したり計算したりするもの。

例) 時系列データから標準偏差±2範囲外の異常値を見つける。

sourcetype=apache:access 

| timechart span=1h count
| streamstats window=12 avg(count) as avg stdev(count) as stdev
| eval lower_bound = avg - stdev * 2
| eval upper_bound = avg + stdev * 2
| eval isOutlier = if(count>upper_bound OR count<lower_bound, 1, 0)
| fields - avg stdev

この場合、12時間(1hスパンが12個)のスライディングウィンドウで平均値と標準偏差を計算して、isOutlierの値が1になっているものは異常値とみなす。

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Streamstats


bin

範囲にまとめるコマンド。

例えば、HTTPステータスコードを100単位で集計したい時に使ったり、機械学習用にカテゴリ分類するような用途。

bucketコマンドと同じ。

例) ステータスコードを200-300、300-400という具合に分類

sourcetype=apache:access 

| bin span=100 status
| stats count by status

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Bin


autoregress

直前のイベントのフィールドの値をそのイベントに入れる。

streamstatsでも同じことはできる。

例)

sourcetype=apache:access 

| autoregress src_ip as last_src_ip

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Autoregress


concurrency

マイブームなコマンド。

同時実行を累積していく。 同時アクセスを見るのに便利かも。

例)

sourcetype=apache:access 

| transaction maxpause=10m user
| concurrency duration=duration start=_time

この場合、Apacheアクセスログから(1行目)、10分間ログ出力されていない場合はアクティブではないとみなしてトランザクションにまとめ(2行目)、transactionコマンドで出力されるdurationフィールドの間に積み重ねてカウントしていったものがconcurrencyというフィールドに出力される(3行目)。

これを折れ線グラフか棒グラフにするとわかりやすいかも。

ただ、実際ログに吐き出される時間はマチマチなので、間に空白の時間がある場合にはgentimesコマンドで埋める必要あるかも。

それはまた別途。


最後に

何となく思いつくまま自分の好きなコマンドを紹介しました。

実用的に使えるかどうかはアイデア次第でしょう。

実際の出力イメージ含めた詳細な説明は、気が向いたときにでも。


リンク集

Splunkコマンド集 その1

http://qiita.com/kikeyama/items/3a423de39a02ac2380ed