[blackbird-blockdevice] Low Level Discovery Block Device

この[プラグイン](https://github.com/Vagrants/blackbird-blockdevice)(githubのURLです)は超シンプルで、ZabbixのLow Level Discoveryをblackbirdにおしゃべりさせることで、/dev/xvdaとか/dev/sdbとかのblockdeviceを取得してきます。っで、IOPSを監視しましょうってやつです。

Low Level Discovery
-------------------

ZabbixのLow Level Discoveryは変動する値(今回のケースならblock deviceですが、Network Interfaceとか、mountされてるFile Systemとかもその部類にはいるんじゃないでしょうか)をなんらかのルールでdiscoveryしてzabbix server側に自動的に追加する仕組みです。

実はやってることはそんな難しくなくて、sender protocolを使ってprogramagableにデータを送信することもできます。(Low Level Discoveryをsender protocolを使って実装する部分はこのAdvent Calenderの中の違う日程で詳しく説明したいなと考えています。)

Implementation
--------------

このプラグインは内部的には`lsblk`コマンドにがっつり依存しています。`lsblk`は(偉そうに言ってますが僕は大先輩に教えていただきました)その名の通りblock deviceをlsしてくれるコマンドで

```bash
$lsblk --raw
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 301G 0 disk
xvda1 202:1 0 301G 0 part /
```

こんな出力が出ます。これはとある、EC2 Instanceなのですが、この出力から、TYPEがdisk([後述](http://qiita.com/JumpeiArashi/items/7a37bfd84ce343770c32#configuration-your-blackbird)しますがTYPEがdiskというのはconfigのdefault値なので、ここをpartに変えればpartitionをzabbix側に登録させることも可能です。)のものを取得してLow Level Discoveryしています。

今回なら`xvda 202:0 0 301G 0 disk`のxvdaを取得しています。そのため`lsblk`コマンドがある環境ならどこでも動作します。しかし、逆に考えるとlocalのlsblkを叩いているのでリモートホストのblockdeviceを取得することができないのもこのプラグインの特徴です(ここはどうやって取って来るべきか、そもそもremote hostでできるようにするべきか正直悩んでいます)。

Zabbix Template
---------------

### Macros

| Key | Default | Detail |
|---|---|---|
| {$ZBX_DEV_TYPE} | ops | block device のreadとwriteのうち、どの操作のCountを取得するか |

### Items

| Name | Key | Detail |
|---|---|---|
| Block Device - Total block devices read ops | vfs.dev.read[,{$ZBX_DEV_TYPE}] | すべてのblock deviceのRead IO operations |
| Block Device - Total block devices write ops | vfs.dev.write[,{$ZBX_DEV_TYPE}] | すべてのblock deviceのWrite IO operations |

### Discovery Items (ProtoType Items)

ここのItemをLow Level Discoveryで見つけてくるのがこのプラグインです。やってることはすごい少ないんですが、各Block DeviceのIOPSが欲しいという要望はあるはずです！(ぼくはありました)

| Name | Key | Detail |
|---|---|---|
| Block Device - {#BLK_DEV} read ops | vfs.dev.read[{#BLK_DEV},{$ZBX_DEV_TYPE}] | 指定された(LLDで見つけてきた)block deviceのRead IO operations |
| Block Device - {#BLK_DEV} write ops | vfs.dev.write[{#BLK_DEV},{$ZBX_DEV_TYPE}] | 指定された(LLDで見つけてきた)block deviceのWrite IO operations |

### Graphs

Prototypeなグラフとして、各Block DeviceのRead IOPS, Write IOPS, それぞれを合わせたIOPSを定義してあります。ReadとWriteを分けて定義したのは、サーバの用途によっては、明らかにReadによるものWriteによるものがあって、合わせたグラフだけだと値が乖離しすぎてグラフとしての意味をなさなくなるからです。

#### Block Device - {#BLK_DEV} read {$ZBX_TYPE}

マクロが展開されると`xvda read ops`みたいなグラフ名になります。

単純な棒グラフのためry


#### Block Device - {#BLK_DEV} write {$ZBX_TYPE}

単純な棒グラフのためry

#### Block Device - {#BLK_DEV} I/O {$ZBX_TYPE}

![スクリーンショット_2014-12-08_0_52_15.png](https://qiita-image-store.s3.amazonaws.com/0/26256/42e6a60b-5ae1-d6f3-7109-7a6fd4250bc3.png)

How to Install
--------------

### Case of Using pip

pip でさくっと！

```bash
pip install blackbird-blockdevice
```

### Case of Using RPM

1. `/etc/yum.repo.d/blackbird.repo`を用意します。

```ini
[blackbird]
name=blackbird package repository
baseurl=https://vagrants.github.io/blackbird/repo/yum/6/x86_64
enabled=0
gpgcheck=0
```

2. `yum install blackbird-blockdevice --enablerepo=blackbird`

### Configuration your blackbird

blockdeviceのconfigですが、Linuxのコマンド`lsblk`に依存しているため、ちょっといつもと違う項目があります。

```
# section名はなんでも大丈夫です。内部的にはThread名になるので、かぶらないほうが吉です。
[ANYTHING_OK]
# 取得してくる周期です。Low Level Discoveryなので、結構まったりな時間でもいいと思います。1時間とか。
interval = 600

# Zabbix上のhostnameです。指定しなければ、`socket.getfqdn()`をcallし、さらになければ`socket.gethostname()`をcallします。
hostname = hogehoge001.example.com

# module名は必須で、どのpluginを使うかです。なのでここは固定です。
module = blockdevice

# lsblk_pathはlsblkのフルパスです。もし/bin/lsblkじゃなかったら指定してね。
lsblk_path = /bin/lsblk

# type_colmun_positionはちょっとわかりにくいんですが、defaultだと5で、lsblkの結果の一行分のうち、左から何番目のカラムを取ってくるかです。このパラメータは出力結果が変わったときのための保険です。
# たとえばdefaultなら
# xvda1 202:1 0 8G 0 disk /
# 5なので(カウントアップは0から始まります)diskをblock deviceのtypeであるとみなします
type_column_position = 5

# device_typeは上記で取得した値のうち、どれをLow Level Discoveryとして送信するかです。defaultはdiskなので、partitionを取得したければpartと指定してください
device_type = disk
```

ではHave a nice Monday!