ホストステータス「無効」とメンテナンス期間の関係【MIRACLE ZBX 1.8, 2.0, 2.2】
メンテナンス期間に、ホストステータスを無効から有効に変更すると、監視を開始してしまいます。
また、通常サポートでは対応していないサービスをコンサルティングサポートで提供しています。
コンサルティングサービスでの問い合わせ
当社コンサルティングサービスに問い合わせを頂いたものです。
内容としては、下記となります。
ホストをステータス「無効」にて作成した後に、メンテナンス期間を設定。その後、時刻がメンテナンス
期間になったことを確認し、ホストステータスを「有効」にしたのだが、監視が開始されてしまった。
また、一連の作業は全てZabbix APIを通じて行っているとのことでした。
当社では、通常サポートではZabbix APIに関する質問は受け付けておりませんが、コンサルティングサービスではこのような、通常サポートで対応していない質問も受け付けていますし、機能拡張等のソースコードの改修も行っています。
「無効」なホストに対してメンテナンス処理を行わない
上記問題ですが、調査していくとメンテナンスに対する処理を行うTimerプロセスが、ホストステータスが「無効」であるホストを対象としていませんでした。
下記は 2.2.8-1 からの抜粋となります。
src/zabbix_server/timer/timer.c
181 static void process_maintenance_hosts(zbx_host_maintenance_t **hm, int *hm_alloc, int *hm_count,
182 time_t maintenance_from, zbx_uint64_t maintenanceid, int maintenance_type)
183 {
...
194 result = DBselect(
195 "select h.hostid,h.host,h.maintenanceid,h.maintenance_status,"
196 "h.maintenance_type,h.maintenance_from"
197 " from maintenances_hosts mh,hosts h"
198 " where mh.hostid=h.hostid"
199 " and h.status=%d"
200 " and mh.maintenanceid=" ZBX_FS_UI64,
201 HOST_STATUS_MONITORED,
202 maintenanceid);
...
218 result = DBselect(
219 "select h.hostid,h.host,h.maintenanceid,h.maintenance_status,"
220 "h.maintenance_type,h.maintenance_from"
221 " from maintenances_groups mg,hosts_groups hg,hosts h"
222 " where mg.groupid=hg.groupid"
223 " and hg.hostid=h.hostid"
224 " and h.status=%d"
225 " and mg.maintenanceid=" ZBX_FS_UI64,
226 HOST_STATUS_MONITORED,
227 maintenanceid);
どちらもSQL文を作成するにあたって、ホストステータスが有効(HOST_STATUS_MONITORED)であるホストに限定しています。
この状況で、ホストステータスを「無効」から「有効」に変更しても、メンテナンスステータスは変わっていません。Timerプロセスが処理を行う間隔は30秒ですので。次の処理が行われるまでの間、監視が行われてしまいます。
ソースコードの改修はどうする?
ソースコードを改修し、「無効」なホストに対してもメインテナンス処理を行うこと自体は容易です。
ですが、それによる影響(単純に負荷の増大は考えられます)を考慮すると簡単に変更することに決定することはできません。
一応、 Zabbix LLCには報告してありますので、そちらの動向も考慮していく予定です。