例として、翌月の第1火曜日から3日を過ぎても値が更新されない場合、トリガーを発火させる方法を示す。
item の作成
発火状態なら 1
に、未発火状態なら 0
になる item を作成する。この item の Type は、External check で作成する。
項目名 | 設定値 |
---|---|
Description | test.fire |
Type | External check |
Key | fire.sh[monitor-key] |
Type of information | Numeric(unsigned) |
Data type | Decimal |
monitor-key
には、値の更新を監視したいキーを設定する。
external script
ディレクトリ /etc/zabbix/externalscripts
に、次のような fire.sh
を作成する。
fire.sh
# !/bin/bash
TARGET_IP=$1
TARGET_KEY=$2
# zabbix server の設定を読み込み、DB 接続情報を利用する
. /etc/zabbix/zabbix_server.conf
# hostid を取得する。
HOSTID=$(echo "SELECT hostid FROM hosts WHERE ip='$TARGET_IP' OR host='$TARGET_IP';" \
| mysql -N -u $DBUser --password=$DBPassword $DBName)
# itemid を取得する
ITEMID=$(echo "SELECT itemid FROM items WHERE hostid=$HOSTID AND key_='$TARGET_KEY';" \
| mysql -N -u $DBUser --password=$DBPassword $DBName)
# item の更新時刻を取得する
CLOCK=$(echo "SELECT clock FROM history_uint WHERE itemid=$ITEMID ORDER BY clock DESC LIMIT 1;" \
| mysql -N -u $DBUser --password=$DBPassword $DBName)
# 翌月の1日になるまで、1日ずつ加算していく
THISMONTH=$(date -d "@$CLOCK" +%m)
NEXT_UNIXTIME=$(expr $CLOCK + 86400)
while [ $THISMONTH -eq $(date -d "@$NEXT_UNIXTIME" +%m) ];
do
NEXT_UNIXTIME=$(expr $NEXT_UNIXTIME + 86400)
done
# 第1火曜日になるまで、1日ずつ加算していく
while [ $(date -d "@$NEXT_UNIXTIME" +%w) -ne 2 ];
do
NEXT_UNIXTIME=$(expr $NEXT_UNIXTIME + 86400)
done
# 時刻を 0 時にする
NEXT_UNIXTIME=$(date -d "$(date -d @$NEXT_UNIXTIME +%Y-%m-%d)" +%s)
# $NEXT_UNIXTIME には、翌月の第一火曜日午前0時が設定された。
# 3 日後を求める。
LIMIT_UNIXTIME=$(expr $NEXT_UNIXTIME + 259200)
if [ $LIMIT_UNIXTIME -lt $(date +%s) ]; then
# 値が更新されていない
echo "1"
exit 1
else
# 正常
echo "0"
exit 0
fi
トリガーの作成
次のようにキー fire.sh[monitor-key]
が 0 以外の時に発火するトリガーを作成すれば完成である。
項目名 | 設定値 |
---|---|
Name | does not running even after the specific date. |
Expression | {monitored-host:fire.sh[key].last(0)}#0 |
Severity | Average |
Comment | 期限を過ぎても item が更新されていません。 |