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 (はい、0 ではなく Unknown です。算術演算で 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' です。
Unknown オペランドに対して not は 'Unknown' を返します。
値キャッシュ
トリガーの評価に必要な値は、Zabbixサーバーによってキャッシュされます。
このため、サーバーの再起動後しばらくの間は、トリガーの評価によってデータベース負荷が高くなります。
アイテムの履歴値が削除されても(手動またはhousekeeperによる削除のいずれでも)、値キャッシュはクリアされません。そのため、トリガー関数で定義された期間より古くなるか、サーバーが再起動されるまで、サーバーはキャッシュされた値を使用します。
キャッシュ内に最近のデータがなく、かつ関数に問い合わせ期間が定義されていない場合、Zabbixはデフォルトで最大1週間前までさかのぼって、履歴値をデータベースに問い合わせます。
trigger の例
例1
Zabbixサーバーのプロセッサー負荷が高すぎます。
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サーバーから取得した最新のプロセッサー負荷の測定値が 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 を超えていた場合に真になります。
例 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
この式は、直近 5 分間に eth0 で受信したバイト数が 100 KB を超えた場合に真になります。
例 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エージェントをアップグレードする必要があります。
関数 find() の使用:
find(/example.example.com/agent.version,,"like","beta8")=1
この式は、Zabbixエージェントのバージョンが beta8 の場合に真となります。
例 7
サーバーに到達できません。
count(/example.example.com/icmpping,30m,,"0")>5
この式は、ホスト "example.example.com" に過去30分間で5回を超えて到達できなかった場合に真となります。
例 8
直近3分以内にハートビートがありません。
関数 nodata() の使用:
nodata(/example.example.com/tick,3m)=1
このトリガーを使用するには、'tick' をZabbixの trapper アイテムとして定義する必要があります。
ホストは、zabbix_sender を使用してこのアイテムのデータを定期的に送信する必要があります。
180秒以内にデータを受信しない場合、トリガーの値はPROBLEMになります。
注:'nodata' は任意のアイテムタイプで使用できます。
例 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)
このトリガーは、週の切り替わり時(日曜日 23:00 ~ 月曜日 01:00)の2時間を除き、任意の時点で障害状態に変化する可能性があります。
例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
しきい値を超えるトリガーの数を取得するために、評価結果を使用します。
(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サーバーの負荷が 10% を超えて増加した
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
また、トリガー設定の イベント名 フィールドを使用して、意味のあるアラートメッセージを作成することもできます。たとえば、次のようなメッセージを受け取るためです。
"Exchangeサーバーの負荷が、6月 (0.56) と比較して 7月 に 24% 増加しました (0.69)"
イベント名は次のように定義する必要があります。
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)})
この種の問題では、トリガー設定で手動クローズを許可することも有用です。
他の方に役立つトリガー式の例をお持ちですか?設定例の提案フォームを使用して、Zabbix開発者に送信してください。
ヒステリシス
単純なしきい値ではなく、障害状態と復旧状態の間に一定の間隔が必要になる場合があります。
例えば、サーバールームの温度が20°Cを超えたときに障害を報告するトリガーを定義し、温度が15°Cを下回るまで障害状態を維持したい場合、20°Cの単純なトリガーしきい値だけでは不十分です。
その代わりに、まず障害イベント用のトリガー条件式(温度が20°Cを超える)を定義する必要があります。
次に、追加の復旧条件(温度が15°C未満)を定義する必要があります。
これは、トリガーを定義する際に、追加の復旧条件式パラメータを定義することで実現します。
この場合、障害の復旧は次の2段階で行われます。
- まず、障害条件式(温度が20°Cを超える)がFALSEと評価される必要があります
- 次に、復旧条件式(温度が15°C未満)が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インターフェースのエラーメッセージでは、最後に評価された未サポートのアイテムが参照されます。