Zabbix 3.0の新機能：アイテム取得タイミングの柔軟化

**注意事項**
この記事は、Zabbix 3.0が正式リリースされる前の情報ですので、正式にリリースされた際には、詳細が変更されている場合があります。ご注意ください。

# はじめに
Zabbix Advent Calendar 2015の12日目です。
Zabbix 3.0では、アイテムの値の取得タイミングを、より詳細にコントロールできるようになります。

# これまでの課題
アイテムの値を取得する際、値を取得する時間間隔は指定できますが、どのタイミングから値の取得を開始するかに関しては、ユーザーがWebインターフェースから指定したり変更することはできませんでした。

例えば、1日1回朝にサービスが正常に稼働できているかチェックするためにアイテムの値を取得しようと思っても、1日1回というのは指定できるのですが、それが1日のうち、どの時刻に値の取得処理が実行されるかを明示的に指定することができませんでした。朝9時かもしれませんし、夜の10時かもしれません。

そうすると、1日に複数回チェックするようにするか、cronなどを利用して特定の時刻に値の取得処理をスクリプトで行って、結果をzabbix_senderコマンドでZabbixサーバーに通知するというような方法をとるなどして対応してきたと思います。

しかし、特定の時刻に実行できるのであれば、cronなど他の仕組みと組み合わせるよりも、Zabbixで集中管理できた方が望ましい場合も多いでしょう。

# 新機能概要
デフォルトのアイテムの値取得処理は、アイテム自体に設定した更新間隔で実行されます。
例外として、特定の時間帯を指定して、指定した時間帯のみ更新間隔を違う長さに変更することができていたと思います。
これが、Flexible intervalsと英語のマニュアルに表記されているものです。つまり、これまでの例外設定はそのまま利用することができます。

Zabbix 3.0では、さらにScheduling intervalsと呼ばれる設定ができるようになります。
これを利用すると、日付、曜日、時分秒などを指定してアイテムの値を取得するタイミングを指定することができます。

2015/12/02現在のWebインターフェース上では、「Flexible intervals」「Scheduling intervals」をそれぞれ、「例外設定」「定期設定」という表記にしてみました。
alpha4時点では「個別設定」「定期設定」という翻訳にしていましたが、前のバージョンでの「例外の更新間隔」という表現を引き継ぐイメージに変更しました。

アイテムの作成画面は、以下のようになっています。

![item-setting.png](https://qiita-image-store.s3.amazonaws.com/0/101989/adde6357-b305-495f-eca8-d872bc281efc.png)



# 設定例
例外設定に関しては、これまでのバージョンと同様ですので、今回は定期設定の部分でどのようなことができるか、いくつかのパターンをご紹介しましょう。

デフォルトのアイテム自体の更新間隔を0にしておくと、この定期設定で指定したタイミングだけで実行されるようになります。

## 特定分での値取得
例として、複数のサーバーを利用しているサービスで、1時間間隔でアイテムの値を収集するようにしていたとします。

これらの値を比較して、特定のサーバーへの処理の偏りがないか比較してみたときに、それぞれのサーバー毎には1時間間隔で取得できていたとしても、アイテムAが、10:01 -> 11:01 -> 12:01 というようなタイミングで取得していたとして、もう1つのアイテムBが、10:29 -> 11:29 -> 12:29 というタイミングで値を取得しているかもしれません。
そうすると、その約30分間の間に大きな変動があると、取得するタイミングによっては瞬間的な値の違いとなって特定のサーバーへの偏りに見えてしまう場合が考えられます。
また、アイテムAとアイテムBとを足すと100になるような場合であれば、アイテムの値の取得タイミングのずれのせいで、足し合わせて100にならなくなる場合もあるので、その結果を見て違和感を感じるかもしれません。


そこで、例えば、10時0分、11時0分とそれぞれの時刻の特定の分で値を取得するように設定するわけです。
0分だけだとつまらないので、0分と30分に値を取得するように指定してみましょう。

具体的には、定期設定で、

```
m0,30
```

と指定します。
「m」は分単位で指定するための文字で、その後ろの数値の分を利用します。
今回は、「0,30」とカンマ区切りなので、時計の「0分」と「30分」のタイミングで実行することを指定したことになります。

Webインターフェース上は以下のように入力します。

![item-sche2.png](https://qiita-image-store.s3.amazonaws.com/0/101989/7631c3a6-dfc1-db30-af94-7543d76e1071.png)


これで、10:00 -> 10:30 -> 11:00 -> 11:30 -> ... というタイミングで値の取得が行われるようになります。
「更新間隔カスタマイズ」の欄の2行目は、入力のフォームで何も入力していない状態です。

同じ意味で、

```
m/30
```

という指定方法もあります。
これは、「30分毎に」という意味になるようです。


## 特定時の値取得
次に、時分秒の時を指定した値の取得をやってみましょう。
先にも挙げた例として、1日1回、毎朝サービスが稼働できているかをチェックすることとします。

毎朝9時に値を取得するのであれば、定期設定で、

```
h9
```

と指定します。
「h」は時単位で指定するための文字です。


## 曜日を加味した値取得タイミング変更
今度は、営業日のみ朝9時に値を取得することとします。

その場合は、

```
wd1-5h9
```

と指定します。
「wd」は曜日を示すので、さらに1-5と指定しているので、月曜日から金曜日までという指定になります。
そして、その後ろにh9とあるので、営業日(月曜日から金曜日)の9時という意味になるわけです。


# 応用例
alpha版でテストをしていて、こういう機能が動いたよとつぶやいたところ「バッチの制御に使えるんじゃね」とのコメントを頂きました。

確かに厳密なジョブ制御が必要ないのであれば、特定の時刻に、UserParameterやリモートコマンドを実行できるわけですから、

- ジョブのキック
- ジョブ終了ステータスのチェック

みたいなことはできると思います。

ジョブのキックと書かせて頂いたのは、アイテムの値の取得処理には時間制限があるからです。
デフォルトでは3秒しか待たないので、それ以上の時間がかかる処理は中断されてしまいます。Timeoutの値を30秒まで伸ばせますが、それ以上は設定することができません。

ですので、ジョブの処理を開始する切っ掛けを実行するだけで、ジョブの処理自体はバックグラウンドで実行させる必要があります。

今回、検証までしていないので、こんなこともできそうということでここまで。


# まとめ
特定時刻での値の取得や複数のメトリクスをより近いタイミングで取得することが簡単に実現できるようになります。

マニュアルを参照して頂くと、他にも色々な組み合わせで指定できることがわかると思いますので、マニュアルも参照してみてください。


# 注意事項
同じタイミングで取得しなければならないアイテムが集中してしまった場合、Zabbixは複数のプロセスでアイテムの値取得処理を分散させてはいるものの、同時に取得したいアイテム数がプロセス数を超えるような状態になってしまうと、結局キューに溜まってしまって、処理できないアイテムは後回しになってしまいます。

Zabbixサーバーを稼働させるサーバー自体に性能やリソースの余裕があるのであれば、Pollerと呼ばれるプロセスの数を増やすことである程度までは対応することができます。

取得するアイテムの取得方法に依存しますので、それぞれの取得方法に合わせたチューニングを行うことが必要であることにご注意ください。

あと、以前、アイテム設定の画面にボタンが用意されて、そのボタンを押すとリアルタイムでそのアイテムの値を取得できるようになるという情報があったかと思いますが、Zabbix 3.0.0では実装が見送られたようです。

- [ロードマップ](http://www.zabbix.org/wiki/Docs/roadmap)
- [改善要望: ZBXNEXT-473 Ability to Check Now a specific passive item](https://support.zabbix.com/browse/ZBXNEXT-473)
- [仕様検討: ZBXNEXT-473](http://www.zabbix.org/wiki/Docs/specs/ZBXNEXT-473)

# 参考
[Zabbix 3.0マニュアル：2 Custom intervals](https://www.zabbix.com/documentation/3.0/manual/config/items/item/custom_intervals)

Webインターフェースの日本語翻訳に関して、改善や修正などのご要望があれば随時ご連絡ください。

次は、sewata100さんですね。
よろしくお願いします。