Zabbix 3.0でログのデータからグラフを作る

## おきまり
こんにちは。
[CYBIRDエンジニア Advent Calendar](http://qiita.com/advent-calendar/2016/cybird)
23日目の @kenchang100kg です。
22日目は2016年度の新卒の @Nate-River56 さんで [ssh_configからわかるSSHの仕組み](LINK) でした。
@Nate-River56 さんは今年の新卒で現在同じチームで一緒にお仕事をしています。というか隣です。
記事読みましたが、普段何気なく使ってるSSHについて改めて理解出来る良い記事でした。
第一弾という事ですが、第二弾はいつくるんでしょうか。
来年のAdvent Calendarですかね。

## はじめに
さて、23日目にもなると業務で使ったこういうナレッジ系は割と書き尽くされ、
何書こうか結構迷います。

あとギリギリまでテーマが決まらなかった事、時間も限られている為、
ですので、多少は理解しているつもりの『ZABBIX』を使って色々と遊んでみようと思います。
今回は主題に書いた通りログ監視で取得した値をグラフに落とし込んでみようと思います。

## これが出来ると何がいいのか
ZABBIXがエージェントから情報を取得する際に下記二つのモードから取得します。

* パッシブチェック
* アクティブチェック

パッシブチェックはZABBIXサーバが各ZABBIXエージェントに対し、
毎回TCPのセッションを張って必要なリクエストを送り、エージェントからリクエストデータを取得します。

これに対しアクティブチェックはエージェントから能動的にサーバ側に対してデータを送り続けます。
またアクティブチェックではパッシブでは実現できない複雑な監視等も行う事ができます。

アクティブチェックを使う事によりサーバ側から問い合わせに行かなくてよくなるので、サーバ側の負荷の軽減が見込まれます。
ただしあまりアクティブばかりを使うようになると今度はエージェント側の負荷が高くなるので注意が必要です。

今回行うログ監視はアクティブチェックでないと取得できないのでアクティブチェックで取得します。

## HTTPサーバログから取得したレスポンスコードをグラフにする
ZABBIXサーバとAgentは構築済みという前提で進めます。

今回はnginxで構築したWEBサーバのログを取得していきます。

まずnginx側で出力されるログの形式と出力場所を確認します。

```
cat /etc/nginx/nginx.conf | grep -A 4 log_format
```

```/etc/nginx/nginx.conf
    log_format  main '[$time_local] "request:$request" "status:$status" "body_bytes_sent:$body_bytes_sent" "http_referer:$http_referer" "resquest_time:$request_time"';

    access_log /var/log/nginx/access.log main;
```
今回は検証の為、ログの出力をシンプルにしています。

実際にアクセスしてアクセスログを確認してみます。

````
[23/Dec/2016:06:10:17 +0000] "request: GET / HTTP/1.1" "status: 200" "body_bytes_sent: 18006" "http_referer: -" "resquest_time: 0.112"
[23/Dec/2016:06:10:17 +0000] "request: GET /favicon.ico HTTP/1.1" "status: 200" "body_bytes_sent: 5" "http_referer: http://xxxxxxxx/" "resquest_time: 0.003"
[23/Dec/2016:06:10:19 +0000] "request: GET / HTTP/1.1" "status: 200" "body_bytes_sent: 18006" "http_referer: -" "resquest_time: 0.112"
[23/Dec/2016:06:10:19 +0000] "request: GET /favicon.ico HTTP/1.1" "status: 200" "body_bytes_sent: 5" "http_referer: http://xxxxxxxx/" "resquest_time: 0.003"
````
URLだけマスクしてます。

ここのステータスを抜き出してZABBIXで取得するアイテムを作成します。

```
名前：HTTP_RESPONSE_CODE_200
タイプ：Zabbixエージェント(アクティブ)
キー：logrt[/var/log/nginx/access.log,"status: (200)",,,,\1]
データ型：数値(整数)
データの形式：10進数
```
更新時間や単位、保持期限等他の値は全てデフォルトにしてあります。
キー最後についている```\1```はlogrt内で指定した抽出正規表現にヒットした物だけを出力させるオプションです。

ついでに他のレスポンスコードの場合も取得したいので200番以外を取得するアイテムを作成します。

```
名前：HTTP_RESPONSE_CODE_etc
タイプ：Zabbixエージェント(アクティブ)
キー：logrt[/var/log/nginx/access.log,"status: ([3-9][0-9][0-9])",,,,\1]
データ型：数値(整数)
データの形式：10進数
```
こいつを監視対象のホストに紐付けておきます。
これで取得し始めますので、登録したアイテムの最新データを確認してみましょう。

![kobito.1482475342.469254.png](https://qiita-image-store.s3.amazonaws.com/0/91346/4640e971-8b96-9b3a-0ba9-8d18ed263011.png "kobito.1482475342.469254.png")

取得できました。
試しに``curl``でひたすらアクセスしにいくスクリプトを作って、監視データを蓄積させてみます。
途中で別のエラーコードもログに出力させてみます。

さぁ、早速グラフを見てみましょう！！

![スクリーンショット 2016-12-23 15.52.47.png](https://qiita-image-store.s3.amazonaws.com/0/91346/66bdb00f-f1d2-d95c-39ed-6dad9e222466.png "スクリーンショット 2016-12-23 15.52.47.png")
積算グラフ

![スクリーンショット 2016-12-23 15.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/91346/a7caac4b-6fc4-4a2d-a7cc-36ea7f3d7112.png "スクリーンショット 2016-12-23 15.53.04.png")
通常のグラフ

これは地味だし微妙ですね。
途中から「あ、これ計算アイテム使って普通にカウントした方が絶対いい」と思いながら書いてました。
でもそれだとログアイテムだけでグラフを作る、という試みからブレるのでやめておきました。
このログから数値だけ取得するっていう機能、うまく使えば色々と楽しそうなんですが中々面白い物が思いつきません。
なんかないかなと検討しています。

--------
明日23日目は@jin_kさんの「」です。
ラズパイいいですよね。私も先日Pi3を買ってLEDチカチカさせて遊んでました。
俺今機械触ってるって感じがたまらないです。
楽しみにしています。