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"(「障害」状態を示す)に展開されます。
関数
関数を使用すると、収集した値の計算(平均、最小、最大、合計)、文字列の検索、現在時刻やその他の要素の参照ができます。
完全な一覧は、サポートされている関数で確認できます。
通常、関数は比較のために数値を返します。
文字列を返す場合は、= および <> 演算子で比較できます(例を参照)。
関数パラメータ
関数パラメータでは、以下を指定できます。
- ホストとアイテムキー(ホストのアイテム履歴のみを参照する関数)
- 関数固有のパラメータ
- その他の式(ホストのアイテム履歴を参照する関数では使用不可。例についてはその他の式を参照してください)
ホストとアイテムキーは /host/key として指定できます。
最初のパラメータでホスト名を省略すること(つまり function(//key,parameter,...) の形式)は、特定のコンテキストでのみサポートされています。
これらのコンテキストでは、{HOST.HOST} マクロも使用できます。
{HOST.HOST<1-9>} は、イベント名 フィールドおよび「トリガー」マップ要素で、トリガー式内の特定のアイテムを参照する場合に使用できます。
これらのコンテキストでホスト名が省略されている場合、または {HOST.HOST} に置き換えられている場合、参照先はトリガー式内の最初のアイテム、またはグラフ内の最初のアイテムになります。
これらのサポート対象コンテキスト以外でトリガー式内のホスト名を省略すると、エラーになります。
イベント名マクロでのダブルスラッシュの使用例については、例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' を返します
タイムシフト
関数パラメータとして時間または値の件数を指定する場合、オプションのタイムシフトをサポートしています。 このパラメータを使用すると、過去の一定期間のデータを参照できます。
タイムシフトは、現在時刻を指定する 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)
演算子
トリガーでサポートされている演算子は以下のとおりです (実行優先順位の高い順):
| 優先順位 | 演算子 | 定義 | 不明な値 に関する注記 | オペランドを強制的に float にキャスト 1 |
|---|---|---|---|---|
| 1 | - | 単項マイナス | -Unknown → Unknown | はい |
| 2 | not | 論理 NOT | not Unknown → Unknown | はい |
| 3 | * | 乗算 | 0 * Unknown → Unknown (算術演算で Unknown を失わないため、 0 ではなく Unknown になります) 1.2 * Unknown → Unknown |
はい |
| / | 除算 | Unknown / 0 → error Unknown / 1.2 → Unknown 0.0 / Unknown → Unknown |
はい | |
| 4 | + | 算術加算 | 1.2 + Unknown → Unknown | はい |
| - | 算術減算 | 1.2 - Unknown → Unknown | はい | |
| 5 | < | より小さい。演算子は次のように定義されます: A<B ⇔ (A<B-0.000001) |
1.2 < Unknown → Unknown | はい |
| <= | 以下。演算子は次のように定義されます: A<=B ⇔ (A≤B+0.000001) |
Unknown <= Unknown → Unknown | はい | |
| > | より大きい。演算子は次のように定義されます: A>B ⇔ (A>B+0.000001) |
はい | ||
| >= | 以上。演算子は次のように定義されます: A>=B ⇔ (A≥B-0.000001) |
はい | ||
| 6 | = | 等しい。演算子は次のように定義されます: A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
いいえ 1 | |
| <> | 等しくない。演算子は次のように定義されます: A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
いいえ 1 | ||
| 7 | and | 論理 AND | 0 and Unknown → 0 1 and Unknown → Unknown Unknown and Unknown → Unknown |
はい |
| 8 | or | 論理 OR | 1 or Unknown → 1 0 or Unknown → Unknown Unknown or Unknown → Unknown |
はい |
1 文字列オペランドも、次の場合は数値にキャストされます:
- もう一方のオペランドが数値である
- = または <> 以外の演算子がオペランドに使用されている
関係演算子(<、<=、>、>=)では、キャストに失敗した場合(たとえば "" の場合)、式の結果は Unknown になります(文字列比較へのフォールバックはありません)。
等価演算子(=、<>)では、キャストに失敗した場合、オペランドは生の文字列として比較されます。
not、and、or 演算子は大文字と小文字を区別し、小文字でなければなりません。 また、これらはスペースまたは括弧で囲まれている必要があります。
単項 - と not を除くすべての演算子は、左から右への結合性を持ちます。 単項 - と not は非結合です(つまり、--1 や not not 1 の代わりに -(-1) および not (not 1) を使用する必要があります)。
評価結果:
- <、<=、>、>=、=、<> 演算子は、指定された関係が真であればトリガー式で '1' を返し、偽であれば '0' を返します。 少なくとも1つのオペランドが Unknown の場合、結果は Unknown になります。
- and は、既知のオペランドに対しては、両方のオペランドが '0' と等しくない場合に '1' を返し、それ以外の場合は '0' を返します。未知のオペランドに対しては、and は一方のオペランドが '0' と等しい場合にのみ '0' を返し、それ以外の場合は 'Unknown' を返します。
- or は、既知のオペランドに対しては、いずれかのオペランドが '0' と等しくない場合に '1' を返し、それ以外の場合は '0' を返します。未知のオペランドに対しては、or は一方のオペランドが '0' と等しくない場合にのみ '1' を返し、それ以外の場合は 'Unknown' を返します。
- 論理否定演算子 not の結果は、既知のオペランドに対しては、そのオペランドの値が '0' と等しくない場合は '0'、'0' と等しい場合は '1' になります。 未知のオペランドに対しては、not は 'Unknown' を返します。
値キャッシュ
トリガーの評価に必要な値は、Zabbixサーバーによってキャッシュされます。
このため、サーバーの再起動後しばらくの間は、トリガーの評価によってデータベース負荷が高くなります。
アイテムの履歴値が削除されても(手動またはhousekeeperによる場合のいずれでも)、値キャッシュはクリアされません。そのため、トリガー関数で定義された期間より古くなるか、サーバーが再起動されるまで、サーバーはキャッシュされた値を使用します。
キャッシュ内に最近のデータがなく、かつ関数内で問い合わせ期間が定義されていない場合、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.0,{$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.0,{$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
未知のオペランドを持つ式
通常、未知のオペランド (サポートされていないアイテムなど) は、トリガー値をすぐに'不明’にレンダリングします。
ただし、未知のオペランド (サポートされていないアイテム、関数エラー等) が式の評価に認められる場合があります。
nodata()関数は、参照された項目がサポートされているかどうかに関係なく評価されます。- OR および AND を使用した論理式は、未知のオペランドに関係なく、次の 2 つのケースで既知の値に評価できます。
- ケース 1: "
1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." は既知の結果 ('1' または "障害") に評価できます。 - ケース 2: "
0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." は、既知の結果 ('0' または "OK") に評価できます。
Zabbix は、サポートされていないアイテムを未知のオペランドとして取得することで、論理式を評価しようとします。 上記の 2 つのケースでは、既知の値が生成されます (それぞれ "障害" または "OK")が、その他すべてのケースでは、トリガーは'不明'と評価されます。
- ケース 1: "
- サポートされているアイテムの関数評価でエラーが発生した場合、関数の値は
不明になり、以降の式の評価で不明なオペランドとして使用されます。
上記のように、未知のオペランドは論理式でのみ「消える」場合があることに注意してください。 算術式では、未知のオペランドの結果は常に 不明 になります (0 による除算を除く)。
不明になる式は、トリガーの状態 ("障害/OK") を変更しません。
したがって、状態が"障害" (ケース 1 を参照) であった場合、既知の部分が解決されても ('1'が'0'になる)、トリガー状態を変更せず同じ障害状態のままになります。
サポートされていないアイテムがいくつかあるトリガー式が不明と評価される場合、フロントエンドのエラー メッセージは、最後に評価されたサポートされていないアイテムを参照します。