【Splunk】Splunkでapache解析のダッシュボードを作ってみた


##はじめに
Apacheのログからオーバービューを作ることを目的にしています。
Splunkを勉強中で、なんとなくそれっぽいダッシュボードを作ってみたくなったので、作業記録をかねてやり方を書いてみます。
Splunkレベル：初級

##使った環境
マネージャ
　Splunk Enterprise 6.6.6
クライアント
　VMサーバ3台(Windows2012)
　Apache v2.4


##ダッシュボードの作成
ダッシュボードタブの「新しいダッシュボードの作成」をクリックすると新しいダッシュボードの作成ダイアログが出てくるので適当なタイトルを入力して「ダッシュボードの作成」ボタンをクリックします。
![create_dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/248691/bfdb9b18-03f6-b06b-4d49-df93842b7e23.png)

ここでは「apache dashboard」にしています。
![dashborad_title.png](https://qiita-image-store.s3.amazonaws.com/0/248691/40e98b82-a627-6c2e-e745-4c43e181f9e1.png)


##ステータス分布を作る
###やりたいこと
apacheログのレスポンスコード(404 not foundとか）の分布を円グラフで作成する。
レスポンスコード単位だと見づらそうなので400台:Client error,500台:Server errorのように集約する。
PDFレポートにしても見やすいようにカスタマイズする。
###パネルの追加
ダッシュボードの編集メニューで+パネルの追加をクリック
![dashboard_hensyu.png](https://qiita-image-store.s3.amazonaws.com/0/248691/1f658de2-ea76-21e9-154f-673fb2b13d77.png)


パネルの追加ダイアログから円グラフを選択
![add_panel.png](https://qiita-image-store.s3.amazonaws.com/0/248691/343b2932-e45b-4f34-e7c1-44212ba96831.png)
###サーチ設定
サーチ文字列をいれて「ダッシュボードに追加」ボタンをクリック
![new_pie_chart.png](https://qiita-image-store.s3.amazonaws.com/0/248691/3c0e15bd-5459-0058-cf8f-66766b7eced0.png)
サーチ文解説

```
sourcetype="apache:access" 
| bin span=100 status
| stats count by status
```

1行目:`sourcetype`でapacheのアクセスログに絞る
2行目:`bin`でstatusフィールドを100単位で集約する。HTTPのレスポンスコードが100単位でグループ化されているため200-300、300-400のような集約が可能。
3行目:2行目でグループ化したstatusのそれぞれ件数を数える。
###表示結果
結果としてレスポンスコードがグループ化されたグラフが表示されました。
![pie_chart_default.png](https://qiita-image-store.s3.amazonaws.com/0/248691/cbfa5c73-f42f-d389-0583-31a4ef45c96f.png)
###表示の改善
しかしこのままだとレポート化したときにわかりにくい。
マウスを当てれば下記のように件数やパーセンテージがみれるけどもPDF化したときには出力されない。
Status: 200-300っていうのも意味が分かりにくい。
![pie_chart_select.png](https://qiita-image-store.s3.amazonaws.com/0/248691/d416d12b-6e30-d0ef-ddbf-844f0f230439.png)

改善点としてはStatusのグループ名表示と件数の表示が欲しい。
ということでサーチ文を変更

```
sourcetype="apache:access" 
| bin span=100 status
| top 5 status
| eval percent=round(percent, 2)
| eval status=status.", ".count.", ".percent."%"
| eval status=replace(status,"100-200","Info"), status=replace(status,"200-300","Success"),status=replace(status,"300-400","Redirection") ,status=replace(status,"400-500", "Client error"), status=replace(status,"500-600","Server error")
```

1,2行目は前回と同様
3行目:statusをグループ化して上位5件を取得。`stats count`だとpercentが取れないので`top`に変更
4行目:percentカラムの桁数を少数2位で丸める
5行目:statusに件数(count)と率(percent)を連結する
6行目:statusの文字列をレスポンスコードのグループ毎の名前に置換する

![pie_chart_finish.png](https://qiita-image-store.s3.amazonaws.com/0/248691/ebd9179a-b754-2e90-42f7-a57461d51b30.png)

これでステータス分布の円グラフは完成。

##エラー分析を作る
###やりたいこと
ステータス分布でClient errorとServer errorがあるのでどういったエラーがでているのかを分析したい。
###パネルの追加
ダッシュボードの編集メニューで+パネルの追加をクリック
![dashboard_hensyu.png](https://qiita-image-store.s3.amazonaws.com/0/248691/1f658de2-ea76-21e9-154f-673fb2b13d77.png)
パネルの追加ダイアログから統計テーブルを選択
![add_panel_table.png](https://qiita-image-store.s3.amazonaws.com/0/248691/d247af4b-c234-af3e-9067-8d478f9efed6.png)
###サーチ設定
新規統計テーブルにサーチ文字列をいれてダッシュボードに追加をクリック
![table_str.png](https://qiita-image-store.s3.amazonaws.com/0/248691/fbcaf5b9-6fc3-e8bd-1287-61a87e7ed8ac.png)
サーチ文解説

```
sourcetype="apache:access" status>=400
| top limit=10 status src_ip
| eval percent=round(percent, 2)
```
1行目:`sourcetype`でapacheのアクセスログに絞る　statusフィールドの値が400以上(エラー)を取得
2行目:status,ソースIPでグループ化して上位10件を取得
3行目:percentカラムの桁数を少数2位で丸める

###表示結果
![table_finish.png](https://qiita-image-store.s3.amazonaws.com/0/248691/7cc3c923-b252-162c-6694-a14cab6ec7f4.png)

Top10にしていましたが3件だけでした。
エラー分析としては荒いですがダッシュボードなのでこれで良しとします。

##アクセス推移を作る
###やりたいこと
1時間単位のアクセス数の推移を折れ線グラフで表示する
表示範囲を動的に変更できるようにする
###パネルの追加
ダッシュボードの編集メニューで+パネルの追加をクリック
![dashboard_hensyu.png](https://qiita-image-store.s3.amazonaws.com/0/248691/1f658de2-ea76-21e9-154f-673fb2b13d77.png)


パネルの追加ダイアログから折れ線グラフを選択
![add_linechart.png](https://qiita-image-store.s3.amazonaws.com/0/248691/8f89fd53-68bb-0e73-68a1-19a69a6b498b.png)
###サーチ設定
![linechart_str.png](https://qiita-image-store.s3.amazonaws.com/0/248691/e9d33b0c-e6d8-e17a-7212-551c9c9cfe63.png)
サーチ文解説

```
sourcetype="apache:access"
| timechart span=1h count by host
```
2行目:`timechart`は時間単位の集計文。1時間単位でhost単位で集計して表示します。

表示結果
![linechart_default.png](https://qiita-image-store.s3.amazonaws.com/0/248691/4280844b-aec7-4480-94d9-188cd35c7b36.png)

###入力の追加
ダッシュボードの編集メニューで+入力の追加をクリック
![dashboard_hensyu.png](https://qiita-image-store.s3.amazonaws.com/0/248691/1f658de2-ea76-21e9-154f-673fb2b13d77.png)
入力ダイアログから時間を選択
![add_input.png](https://qiita-image-store.s3.amazonaws.com/0/248691/e7fbad4d-bafd-4ac7-3fd1-85aea5431042.png)
ダッシュボードにタイムピッカーのダイアログが出てくるので
アクセス推移のパネルにタイムピッカーをドラック＆ドロップ
![time_panel.png](https://qiita-image-store.s3.amazonaws.com/0/248691/2ebc5135-ff87-dac0-a028-f22cbc4061b0.png)
入力パネルの枠線が表示されますがどこにドロップしても枠線のところに配置されます。
![timepicker_drag.png](https://qiita-image-store.s3.amazonaws.com/0/248691/36dfbf81-cf53-51b6-806d-d637ffaad1a2.png)
タイムピッカーの編集ボタン(鉛筆マーク)をクリックし、デフォルトの期間を過去7日間にします。
またトークンの名前を確認します。
![timepicker_param.png](https://qiita-image-store.s3.amazonaws.com/0/248691/8009abb3-06fd-d5c4-9949-bdef93883063.png)
###グラフのサーチの編集
時間範囲のリストに共有タイムピッカー(field1)が追加されているのでこれを選択し適用
![linechart_timepicher.png](https://qiita-image-store.s3.amazonaws.com/0/248691/c49551b3-f8a1-bbaf-b75c-6748a4791e33.png)
###表示結果
過去7日分表示されています。
タイムピッカーの値を変更すれば連動してグラフも更新されます。
![linechart_finish.png](https://qiita-image-store.s3.amazonaws.com/0/248691/c1328720-ac6c-8649-9b0c-279952447880.png)

##完成
パネルの位置を調整してダッシュボード完成です。
3つくらいパネルがあるとそれっぽく見えますね。
![dashboard_finish.png](https://qiita-image-store.s3.amazonaws.com/0/248691/9382a79e-856d-69ef-5e15-b42639f7d17b.png)

##できなかったこと
できるのかもしれませんがやり方がわからなかったこと
1. 現在時刻、サーチの範囲時間の埋め込み
　　PDF化する際にいつのデータか表示したいが日付を出す方法がわからなかった
2. ステータス円グラフで色の固定
　　ソースにoptionを埋め込めば色固定できそうでしたがうまく行かず。
　　`eval replace`で置換しているせいなのか不明 

このあたりは調べてわかったら追記します。

##資料
[Chart - Splunk Documentation](http://docs.splunk.com/Documentation/Splunk/7.1.2/SearchReference/Chart)
[Chart configuration reference - Splunk Documentation](http://docs.splunk.com/Documentation/Splunk/7.1.2/Viz/ChartConfigurationReference)