このプラグイン(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してくれるコマンドで
$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(後述しますが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}
How to Install
Case of Using pip
pip でさくっと!
pip install blackbird-blockdevice
Case of Using RPM
-
/etc/yum.repo.d/blackbird.repo
を用意します。
[blackbird]
name=blackbird package repository
baseurl=https://vagrants.github.io/blackbird/repo/yum/6/x86_64
enabled=0
gpgcheck=0
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!