2 トリガー式
概要
トリガーで使用される式は非常に柔軟です。 これらを使用して、監視対象の統計に関する複雑な論理テストを作成できます。
単純な式では、いくつかのパラメータとともにアイテムに適用される 関数 を使用します。 関数は結果を返し、その結果は演算子と定数を使ってしきい値と比較されます。
単純で実用的な式の構文は function(/host/key,parameter)<operator><constant> です。
例:
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
これは、直近5分間に受信したバイト数が常に100キロバイトを超えていた場合に障害を発生させます。
構文はまったく同じですが、機能的な観点ではトリガー式には2種類あります。
- 障害式 - 障害の条件を定義します
- 復旧式(任意) - 障害解消の追加条件を定義します
障害式のみを定義した場合、この式は障害しきい値と障害復旧しきい値の両方として使用されます。 障害式が TRUE と評価されると、障害が発生します。 障害式が FALSE と評価されると、障害は解消されます。
障害式と補助的な復旧式の両方を定義した場合、障害の解消はより複雑になります。障害式が FALSE であるだけでなく、復旧式も TRUE でなければなりません。 これは ヒステリシス を作成し、トリガーのフラッピングを回避するのに役立ちます。
復旧式で {TRIGGER.VALUE} マクロを使用するのは非効率です。というのも、この式はトリガーが「障害」状態のときにのみ評価されるためです。その結果、式の評価時には {TRIGGER.VALUE} は常に「1」(「障害」状態を示す)に解決されます。
関数
関数を使用すると、収集した値の計算(平均、最小、最大、合計)、文字列の検索、現在時刻やその他の要素の参照ができます。
supported functions の完全な一覧を利用できます。
通常、関数は比較用の数値を返します。 文字列を返す場合は、= および <> 演算子を使用して比較できます(example を参照)。
関数パラメーター
関数パラメーターでは、次を指定できます。
- ホストとアイテムキー(ホストのアイテム履歴のみを参照する関数)
- 関数固有のパラメーター
- その他の式(ホストのアイテム履歴を参照する関数では使用できません。例についてはその他の式を参照してください)
ホストとアイテムキーは /host/key として指定できます。
最初のパラメーターでホスト名を省略する場合(つまり function(//key,parameter,...) のように記述する場合)は、特定のコンテキストでのみサポートされます。
- 計算アイテムの式
- 式マクロ。これは次の場所で使用できます。
- Event name フィールド
- グラフ名
- "Host" および "Trigger" マップ要素 のラベル
これらのコンテキストでは、{HOST.HOST} マクロも使用できます。
{HOST.HOST<1-9>} は、Event name フィールドおよび "Trigger" マップ要素で、トリガー式内の特定のアイテムを参照するために使用できます。
これらのコンテキストでホスト名を省略するか {HOST.HOST} に置き換えると、参照先はトリガー式内の最初のアイテム、またはグラフ内の最初のアイテムになります。
サポートされているこれらのコンテキスト以外でトリガー式のホスト名を省略すると、エラーになります。
Event name マクロでのダブルスラッシュの使用例については、例 18 を参照してください。
参照されるアイテムは、サポートされている状態である必要があります(ただし、nodata() 関数は例外で、サポートされていないアイテムに対しても計算されます)。
関数パラメーターとしての他のトリガー式は、トリガー内の非履歴関数に限定されますが、この制限は計算アイテムには適用されません。
関数固有のパラメーター
関数固有のパラメーターはアイテムキーの後に配置され、アイテムキーとはカンマで区切られます。これらのパラメーターの完全な一覧については、サポートされている関数を参照してください。
数値関数の多くは、時間をパラメーターとして受け入れます。時間を指定するには、秒または時間サフィックスを使用できます。先頭にハッシュ記号を付けると、パラメーターの意味が変わります。
| Expression | Description |
|---|---|
| sum(/host/key,10m) | 直近10分間の値の合計。 |
| sum(/host/key,#10) | 直近10個の値の合計。 |
ハッシュ記号付きのパラメーターは、関数 last では別の意味を持ちます。これは N 番目の直前の値を示します。たとえば、次の値 30, 70, 20, 60, 50(最新から最古の順)の場合:
last(/host/key,#2)は '70' を返しますlast(/host/key,#5)は '50' を返します
時間シフト
オプションの時間シフトは、関数パラメータとして time または value count を指定した場合にサポートされます。
このパラメータを使用すると、過去のある期間のデータを参照できます。
時間シフトは now から始まり、現在時刻を指定します。その後に +N<time unit> または -N<time unit> を続けて、N 個の時間単位を加算または減算します。
たとえば、avg(/host/key,1h:now-1d) は 1 日前の 1 時間分の平均値を返します。
月 (M) と年 (y) で指定された時間シフトは、trend functions でのみサポートされます。その他の関数では、秒 (s)、分 (m)、時間 (h)、日 (d)、週 (w) がサポートされます。
絶対時間期間を使用した時間シフト
絶対時間期間は、時間シフトパラメータでサポートされています。たとえば、1 日の 0 時から 0 時まで、1 週間の月曜日から日曜日まで、1 か月の月初から月末までです。
絶対時間期間の時間シフトは now から始まり、現在時刻を指定します。その後に任意の数の時間操作を続けます。/<time unit> は時間単位の開始と終了を定義します。たとえば、1 日の 0 時から 0 時までです。+N<time unit> または -N<time unit> は、N 個の時間単位を加算または減算します。
時間シフトの値は 0 以上にできますが、時間期間の最小値は 1 です。
| Parameter | Description |
|---|---|
| 1d:now/d | 昨日 |
| 1d:now/d+1d | 今日 |
| 2d:now/d+1d | 直近 2 日 |
| 1w:now/w | 先週 |
| 1w:now/w+1w | 今週 |
その他の式
関数パラメーターには、次の構文のように他の式を含めることができます。
min(min(/host/key,1h),min(/host2/key2,1h)*10)
関数がアイテム履歴を参照する場合は、他の式を使用できないことに注意してください。 たとえば、次の構文は使用できません。
min(/host/key,#5*10)
演算子
トリガーでサポートされる演算子は次のとおりです (実行優先度の高い順):
| 優先度 | 演算子 | 定義 | unknown values に関する注意 | オペランドを float に強制キャスト 1 |
|---|---|---|---|---|
| 1 | - | 単項マイナス | -Unknown → Unknown | Yes |
| 2 | not | 論理 NOT | not Unknown → Unknown | Yes |
| 3 | * | 乗算 | 0 * Unknown → Unknown (yes, Unknown, not 0 - to not lose Unknown in arithmetic operations) 1.2 * Unknown → Unknown |
Yes |
| / | 除算 | Unknown / 0 → error Unknown / 1.2 → Unknown 0.0 / Unknown → Unknown |
Yes | |
| 4 | + | 算術加算 | 1.2 + Unknown → Unknown | Yes |
| - | 算術減算 | 1.2 - Unknown → Unknown | Yes | |
| 5 | < | より小さい。演算子は次のように定義されます: A<B ⇔ (A<B-0.000001) |
1.2 < Unknown → Unknown | Yes |
| <= | 以下。演算子は次のように定義されます: A<=B ⇔ (A≤B+0.000001) |
Unknown <= Unknown → Unknown | Yes | |
| > | より大きい。演算子は次のように定義されます: A>B ⇔ (A>B+0.000001) |
Yes | ||
| >= | 以上。演算子は次のように定義されます: A>=B ⇔ (A≥B-0.000001) |
Yes | ||
| 6 | = | 等しい。演算子は次のように定義されます: A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
No 1 | |
| <> | 等しくない。演算子は次のように定義されます: A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
No 1 | ||
| 7 | and | 論理 AND | 0 and Unknown → 0 1 and Unknown → Unknown Unknown and Unknown → Unknown |
Yes |
| 8 | or | 論理 OR | 1 or Unknown → 1 0 or Unknown → Unknown Unknown or Unknown → Unknown |
Yes |
1 文字列オペランドは、次の場合でも数値にキャストされます:
- もう一方のオペランドが数値である
- オペランドに = または <> 以外の演算子が使用されている
関係演算子 (<, <=, >, >=) では、キャストに失敗した場合(たとえば "" の場合)、式の結果は Unknown になります(文字列比較へのフォールバックはありません)。
等価演算子 (=, <>) では、キャストに失敗した場合、オペランドはそのままの文字列として比較されます。
not、and、or 演算子は大文字小文字を区別し、必ず小文字で記述する必要があります。 また、前後をスペースまたは括弧で囲む必要があります。
単項 - と not を除くすべての演算子は、左から右へ結合します。 単項 - と not は非結合です(つまり、--1 や not not 1 の代わりに -(-1) や not (not 1) を使用する必要があります)。
評価結果:
- <, <=, >, >=, =, <> 演算子は、指定された関係が真の場合はトリガー式で '1' を返し、偽の場合は '0' を返します。 少なくとも1つのオペランドが Unknown の場合、結果は Unknown になります。
- and は、既知のオペランドに対して、両方のオペランドが '0' と等しくない場合に '1' を返し、それ以外は '0' を返します。未知のオペランドに対しては、どちらか一方のオペランドが '0' と等しい場合にのみ '0' を返し、それ以外は 'Unknown' を返します。
- or は、既知のオペランドに対して、いずれかのオペランドが '0' と等しくない場合に '1' を返し、それ以外は '0' を返します。未知のオペランドに対しては、どちらか一方のオペランドが '0' と等しくない場合にのみ '1' を返し、それ以外は 'Unknown' を返します。
- 論理否定演算子 not の既知のオペランドに対する結果は、オペランドの値が '0' と等しくない場合は '0'、オペランドの値が '0' と等しい場合は '1' です。 未知のオペランドに対して not は 'Unknown' を返します。
値のキャッシュ
トリガーの評価に必要な値は、Zabbixサーバーによってキャッシュされます。 このため、サーバーの再起動後しばらくの間、トリガーの評価によってデータベースの負荷が高くなります。 アイテムの履歴値が削除された場合(手動またはハウスキーパーによる)、値のキャッシュはクリアされません。そのため、サーバーはトリガー関数で定義された期間より古い値になるか、サーバーが再起動されるまでキャッシュされた値を使用します。
キャッシュに最近のデータがなく、関数でクエリ期間が定義されていない場合、Zabbixはデフォルトで過去1週間までさかのぼってデータベースから履歴値を取得します。
trigger の例
例1
Zabbix server のプロセッサの負荷が高すぎます。
last(/Zabbix server/system.cpu.load[all,avg1])>5
関数 'last()' を使用することで、最新の値を参照することができます。
/Zabbix server/system.cpu.load[all,avg1] には監視するパラメータのショートネームが入ります。
ホストが Zabbix server で、監視するキーが system.cpu.load[all,avg1] であることを指定します。最後に、>5 は、Zabbix server からの
最新のプロセッサ負荷測定値が 5 より大きい場合、トリガーが PROBLEM 状態になることを意味します。
例2
www.example.com は、過負荷になっています。
last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2
この式は、現在のプロセッサ負荷が5以上であるか、過去10分間のプロセッサ負荷が2以上であった場合に "TRUE" となります。
例 3
/etc/passwd が変更されました。
last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)
この式は、/etc/passwd のチェックサムの直前の値が最新の値と異なる場合に真となります。
同様の式は、/etc/passwd、/etc/inetd.conf、/kernel などの重要なファイルの変更を監視するのに役立ちます。
例4
誰かがインターネットから大きなファイルをダウンロードしている。
min 関数を使って:
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
eth0の受信バイト数が過去5分以内に100KB以上であれば,この式は "TRUE" となります。
例5
クラスタ化されたSMTPサーバの両ノードがダウン
1つの式に2つの異なるホストが使用されていることに注意してください。
last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0
smtp1.example.comとsmtp2.example.comの両方でSMTPサーバがダウンしている場合、この式は成立します。
例6
Zabbix agent のアップグレードが必要
関数find()を使用して:
find(/example.example.com/agent.version,,"like","beta8")=1
この式は、Zabbix agent のバージョンがbeta8である場合に "TRUE" となります。
例7
サーバにアクセスできない
count(/example.example.com/icmpping,30m,,"0")>5
この式は、ホスト "example.example.com "が過去30分間に5回以上到達不能になった場合に "TRUE" となる。
例8
過去3分以内に heartbeats がない。
関数nodata()を使用して:
nodata(/example.example.com/tick,3m)=1
この trigger を使用するには、Zabbix trapper item として'tick'を定義する必要があります。
ホストはこの item のデータを zabbix_sender を使用して定期的に送信する必要があります。180 秒以内にデータが受信されないと、
trigger の値が PROBLEM になります。
注意 'nodata' は任意の item タイプに使用できることに注意してください。
例 9
夜間のCPUアクティビティ。
time() 関数の使用:
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
このトリガーは、夜間(00:00 ~ 06:00)にのみ状態が障害へ変化する可能性があります。
例 10
例外を除く任意の時点でのCPUアクティビティ。
関数 time() と not 演算子の使用:
min(/zabbix/system.cpu.load[all,avg1],5m)>2
and not (dayofweek()=7 and time()>230000)
and not (dayofweek()=1 and time()<010000)
このトリガーは、週の切り替わり時の2時間(日曜日 23:00 ~ 月曜日 01:00)を除き、任意の時点で障害状態に変化する可能性があります。
例11
クライアントのローカル時刻がZabbixサーバー時刻と同期しているかを確認します。
関数 fuzzytime() の使用:
fuzzytime(/MySQL_DB/system.localtime,10s)=0
サーバー MySQL_DB 上のローカル時刻とZabbixサーバーの時刻との差が10秒を超えると、このトリガーは障害状態に変わります。
なお、'system.localtime' はZabbixエージェントではパッシブチェックとして設定する必要があります。Zabbixエージェント2では、アクティブチェックとして設定することもできます。
例 12
本日の平均負荷を昨日の同時刻の平均負荷と比較します(タイムシフトとして now-1d を使用)。
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
直近1時間の平均負荷が、昨日の同じ1時間帯の平均負荷の2倍を超えた場合、このトリガーが発生します。
例 13
別のアイテムの値を使用して、トリガーのしきい値を取得します。
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
空き容量が 10% を下回ると、トリガーが起動します。
例14
しきい値を超えるトリガーの数を取得するためにevaluation resultを使用します:
(last(/server1/system.cpu.load[all,avg1])>5) + (last(/server2/system.cpu.load[all,avg1])>5) + (last(/server3/system.cpu.load[all,avg1])>5)>=2
このトリガーは、式内のトリガーのうち少なくとも2つが障害状態にある場合に発生します。
例 15
2 つのアイテムの文字列値の比較 - ここでのオペランドは、文字列を返す関数です。
問題: ホストによって Ubuntu のバージョンが異なる場合にアラートを作成する
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
例16
2つの文字列値を比較します。オペランドは次のとおりです。
- 文字列を返す関数
- マクロと文字列の組み合わせ
障害: DNSクエリの変更を検出する
アイテムキーは次のとおりです。
net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
マクロは次のように定義されています。
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
通常は次を返します。
example.com MX 0 mail.example.com
したがって、DNSクエリの結果が期待値から逸脱したかどうかを検出するトリガー式は次のとおりです。
last(/Zabbix server/net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME} {$DNS_RESOURCE_RECORD_TYPE} 0 mail.{$WEBSITE_NAME}"
2つ目のオペランドを引用符で囲んでいる点に注意してください。
例 17
2 つの文字列値の比較 - オペランドは次のとおりです。
- 文字列を返す関数
- 特殊文字 \ および " を含む文字列定数
問題: /tmp/hello ファイルの内容が次と等しいかどうかを検出します。
\" //hello ?\"
オプション 1. 文字列を直接記述する:
last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""
文字列を直接比較する場合、\ および " 文字がエスケープされることに注意してください。
オプション 2. マクロを使用する
{$HELLO_MACRO} = \" //hello ?\"
これを式内で使用します。
last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
例 18
長期間の比較
問題:先月、Exchange server の負荷が10%以上増加した。
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
trigger 設定のEvent nameフィールドを使って、例えば次のようなものを受け取るために、意味のある警告メッセージを構築することも可能です。
"Load of Exchange server increased by 24% in July (0.69) comparing to June (0.56)"
以下のようにイベント名を定義する必要があります:
Load of {HOST.HOST} server increased by {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(0)}% in {{TIME}.fmttime(%B,-1M)} ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) comparing to {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})
また、このような問題のために、trigger 設定において手動で閉じることができるようにすることも有効です。
他のユーザーにも役立つ可能性のあるトリガー式の例をお持ちですか? 例の提案フォームを使用して、Zabbix開発者に送信してください。
ヒステリシス(Hysteresis)
問題状態と回復状態の間に単純な閾値ではなく、インターバルが必要な場合があります。
例えば、サーバルームの温度が20℃以上になったときに問題を報告する trigger を定義し、温度が15℃以下に下がるまで
問題状態を維持したい場合、20℃の単純な trigger 閾値では十分ではありません。
その代わりに、最初に問題が発生した問題事象(温度が20℃以上)に対する trigger 式を定義する必要があります。
次に、回復条件(温度15℃以下)を追加で定義する必要があります。
これは、次のように定義することで行われます。Recovery expression パラメータを定義し、defining trigger
を定義します。
この場合、問題の回復は2つのステップで行われます。
- まず、問題式(20℃以上の温度)は、"FALSE" に評価されなければなりません。
- 次に、リカバリー式(温度15℃以下)を "TRUE" に評価します。
回復式は、問題事象が先に解決された場合にのみ評価されます。
リカバリー式が "TRUE" であることだけでは、問題式がまだ "TRUE" である場合に問題を解決することができません!
例1
サーバールームの温度が高すぎる
問題式:
last(/server/temp)>20
回復式:
last(/server/temp)<=15
例2
空きディスク容量が少なすぎる
問題式: 直近5分間の空きディスク容量が10GB以下
max(/server/vfs.fs.size[/,free],5m)<10G
回復式: 問題式: 直近10分間の空きディスク容量が40GB以上
min(/server/vfs.fs.size[/,free],10m)>40G
未知のオペランドを含む式
一般に、式内に未知のオペランド(サポートされていないアイテムなど)があると、トリガーの値は直ちに Unknown になります。
ただし、場合によっては未知のオペランド(サポートされていないアイテム、関数エラー)が式の評価に含まれることがあります。
nodata()関数は、参照先のアイテムがサポートされているかどうかに関係なく評価されます。- OR および AND を含む論理式は、未知のオペランドがあっても、次の 2 つの場合には既知の値として評価できます。
- ケース 1: "
1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." は、既知の結果('1' または "Problem")として評価できます。 - ケース 2: "
0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." は、既知の結果('0' または "OK")として評価できます。
Zabbix は、サポートされていないアイテムを未知のオペランドとして扱い、このような論理式の評価を試みます。 上記 2 つのケースでは既知の値(それぞれ "Problem" または "OK")が生成されますが、それ以外のすべて のケースではトリガーはUnknownと評価されます。
- ケース 1: "
- サポートされているアイテムに対する関数の評価がエラーになると、その関数の値は
Unknownになり、以降の式の評価では未知のオペランドとして扱われます。
未知のオペランドが「消える」のは、上記のとおり論理式の場合のみであることに注意してください。
算術式では、未知のオペランドは常に結果を Unknown にします(0 での除算を除く)。
Unknown となる式は、トリガーの状態("Problem/OK")を変更しません。
そのため、式が "Problem" だった場合(ケース 1 を参照)、既知の部分が解消されて('1' が '0' になって)も、式は Unknown と評価されるだけであり、トリガーの状態は同じ障害状態のまま維持されます。
複数のサポートされていないアイテムを含むトリガー式が Unknown と評価された場合、Webインターフェースのエラーメッセージは、最後に評価されたサポートされていないアイテムを参照します。