search
LoginSignup
1

More than 5 years have passed since last update.

posted at

updated at

[blackbird-blockdevice] Low Level Discovery Block Device

このプラグイン(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}

スクリーンショット_2014-12-08_0_52_15.png

How to Install

Case of Using pip

pip でさくっと!

pip install blackbird-blockdevice

Case of Using RPM

  1. /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
  1. 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!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1