トリガーで使用される式は非常に柔軟です。 これらを使用して、監視している統計情報に関する複雑な論理テストを作成できます。
単純な式では、いくつかのパラメータを持つ関数がアイテムに適用されます。 関数は、演算子と定数を使用してしきい値と比較される結果を返します。
単純で有用な式の構文は、function(/host/key,parameter)<operator><constant>です。
例:
これは、過去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()関数のみ、サポートされていないアイテムにも計算されます)。
他のトリガー式を関数パラメータとして使用する場合、トリガー内では履歴関数以外に制限されますが、この制限は計算アイテムには適用されません。
関数固有のパラメータはアイテムキーの後に配置され、アイテムキーとはカンマで区切られます。 これらのパラメータの完全なリストについては、サポートされている関数を参照してください。
ほとんどの数値関数は、パラメータとして時間を受け取ります。 秒または時間のサフィックスを使用して時間を指定できます。 ハッシュマーク(#)を前に付けると、パラメータの意味が異なります。
| 式 | 説明 |
|---|---|
| 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<時間単位> または -N<時間単位> を続けてN単位の時間を加算または減算します。
例えば、avg(/host/key,1h:now-1d) は、1日前の1時間の平均値を返します。
月(M)や年(y)で指定した時間シフトは、トレンド関数でのみサポートされます。他の関数では、秒(s)、分(m)、時間(h)、日(d)、週(w)がサポートされています。
絶対時間期間での時間シフト
絶対時間期間は、時間シフトパラメータでサポートされています。例えば、1日の場合は0時から0時、1週間の場合は月曜日から日曜日、1ヶ月の場合は月初から月末までです。
絶対時間期間での時間シフトは now で始まり(現在時刻を指定)、任意の数の時間操作を続けます。/<時間単位> は時間単位の開始と終了を定義します(例:1日の場合は0時から0時)、+N<時間単位> または -N<時間単位> はN単位の時間を加算または減算します。
時間シフトの値は0以上である必要があり、時間期間の最小値は1であることに注意してください。
| パラメータ | 説明 |
|---|---|
| 1d:now/d | 昨日 |
| 1d:now/d+1d | 今日 |
| 2d:now/d+1d | 直近2日間 |
| 1w:now/w | 先週 |
| 1w:now/w+1w | 今週 |
関数のパラメータには、次の構文のように他の式を含めることができます。
関数がアイテムの履歴を参照する場合、他の式は使用できないことに注意してください。 たとえば、次の構文は許可されていません。
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 → エラー 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 文字列オペランドは、以下の場合でも数値にキャストされます:
(キャストに失敗した場合 - 数値オペランドは文字列オペランドにキャストされ、両方のオペランドが文字列として比較されます。)
not、and、or 演算子は大文字と小文字を区別し、小文字でなければなりません。 また、スペースまたは括弧で囲む必要があります。
単項 - および not を除くすべての演算子は、左から右への結合性を持ちます。 単項 - および not は非結合性です(つまり、--1 や not not 1 の代わりに -(-1) や not (not 1) を使用する必要があります)。
評価結果:
トリガーの評価に必要な値は、Zabbixサーバーによってキャッシュされます。 このため、サーバーの再起動後しばらくの間、トリガーの評価によってデータベースの負荷が高くなります。 アイテムの履歴値が削除された場合(手動またはハウスキーパーによる)、値のキャッシュはクリアされません。そのため、サーバーはトリガー関数で定義された期間より古い値になるか、サーバーが再起動されるまでキャッシュされた値を使用します。
キャッシュに最近のデータがなく、関数でクエリ期間が定義されていない場合、Zabbixはデフォルトで過去1週間までさかのぼってデータベースから履歴値を取得します。
Zabbixサーバーのプロセッサ負荷が高すぎます。
'last()'関数を使用することで、最新の値を参照しています。 /Zabbix server/system.cpu.load[all,avg1]は、監視パラメータの短縮名を示します。 ホストが「Zabbix server」で、監視しているキーが「system.cpu.load[all,avg1]」であることを指定しています。 最後に、>5は、Zabbixサーバーからの最新のプロセッサ負荷測定値が5より大きい場合に、トリガーがPROBLEM状態になることを意味します。
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を超えていた場合に、この式は真となります。
/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などの重要なファイルの変更を監視するのに役立ちます。
誰かがインターネットから大きなファイルをダウンロードしています。
min関数の使用例:
この式は、eth0で受信したバイト数が直近5分間で100KBを超えた場合に真となります。
クラスタ化された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サーバーがダウンしている場合に真となります。
Zabbixエージェントをアップグレードする必要があります。
find()関数の使用例:
Zabbixエージェントのバージョンがbeta8の場合、この式は真となります。
サーバーに到達できません。
この式は、ホスト "example.example.com" が過去30分間に5回以上到達不能であった場合に真となります。
過去3分間にハートビートがありません。
nodata()関数の使用例:
このトリガーを利用するには、'tick'をZabbixのトラッパーアイテムとして定義する必要があります。 ホストはzabbix_senderを使用して、このアイテムのデータを定期的に送信する必要があります。 180秒以内にデータが受信されない場合、トリガー値はPROBLEMになります。
注意 'nodata'は任意のアイテムタイプで使用できます。
夜間のCPUアクティビティ。
time()関数の使用例:
このトリガーは、夜間(00:00 - 06:00)のみ障害状態に変化する可能性があります。
例外を除いて、いつでも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)を除き、いつでも障害状態に変化する可能性があります。
クライアントのローカル時刻がZabbixサーバーの時刻と同期しているかどうかを確認します。
fuzzytime()関数の使用例:
MySQL_DBサーバーとZabbixサーバーのローカル時刻が10秒以上ずれている場合、トリガーは障害状態に変わります。 'system.localtime'は、Zabbixエージェントでパッシブチェックとして設定する必要があります。Zabbix agent 2ではアクティブチェックとして設定することもできます。
今日の平均負荷を昨日の同じ時間の平均負荷と比較します(time shiftとしてnow-1dを使用)。
このトリガーは、直近1時間の平均負荷が昨日の同じ時間の平均負荷の2倍を超えた場合に発生します。
別のアイテムの値を使用してトリガーの閾値を取得する:
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1空きストレージが10パーセント未満になるとトリガーが発生します。
評価結果を使用して、しきい値を超えたトリガーの数を取得します。
(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つが障害状態の場合にトリガーが発生します。
2つのアイテムの文字列値を比較します - ここでのオペランドは文字列を返す関数です。
問題: 異なるホストでUbuntuのバージョンが異なる場合にアラートを作成する
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])2つの文字列値を比較する - オペランドは以下の通りです。
問題: DNSクエリの変更を検出する
アイテムキーは次のとおりです。
マクロは次のように定義されています。
通常は次のように返されます。
したがって、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番目のオペランドの周りに引用符があることに注意してください。
2つの文字列値を比較する - オペランドは以下の通りです:
問題: /tmp/hello ファイルの内容が以下と等しいか検出する:
オプション1) 文字列を直接記述する:
文字列を直接比較する場合、\ および " 文字がエスケープされていることに注意してください。
オプション2) マクロを使用する
式では:
長期的な期間を比較する。
問題: Exchangeサーバーの負荷が先月より10%以上増加した
また、トリガー設定のイベント名フィールドを使用して、意味のあるアラートメッセージを作成することもできます。たとえば、次のようなメッセージを受け取るには
"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)})この種の問題には、トリガー設定で手動クローズを許可することも有用です。
他の人にも役立つトリガー式の例をお持ちですか?例の提案フォームを使用して、Zabbix開発者に送信してください。
単純な閾値ではなく、障害状態と復旧状態の間に間隔が必要な場合があります。 たとえば、サーバールームの温度が20°Cを超えたときに障害を報告し、温度が15°C未満になるまで障害状態を維持したい場合、単純なトリガー閾値を20°Cに設定するだけでは十分ではありません。
代わりに、まず障害イベントのトリガー式(温度が20°Cを超える)を定義する必要があります。 次に、追加の復旧条件(温度が15°C未満)を定義する必要があります。 これは、トリガーを定義する際に追加の復旧式パラメータを定義することで実現します。
この場合、障害の復旧は2段階で行われます。
復旧式は、最初に障害イベントが解決された場合にのみ評価されます。
復旧式がTRUEであっても、障害式がTRUEのままの場合は障害は解決されません!
サーバールームの温度が高すぎます。
障害の式:
復旧の式:
空きディスク容量が少なすぎます。
障害の条件式: 直近5分間で10GB未満
復旧の条件式: 直近10分間で40GBを超える
一般的に、式の中でオペランドが不明(サポートされていないアイテムなど)な場合、トリガー値は即座に Unknown になります。
ただし、場合によっては不明なオペランド(サポートされていないアイテム、関数エラー)が式の評価に認められることがあります。
nodata() 関数は、参照されるアイテムがサポートされているかどうかに関係なく評価されます。1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." は既知の結果('1' または "Problem")に評価できます。0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." は既知の結果('0' または "OK")に評価できます。Unknown に評価されます。Unknown となり、以降の式評価で不明なオペランドとして扱われます。不明なオペランドが「消える」可能性があるのは、上記のような論理式の場合のみです。 算術式では、不明なオペランドは常に結果を Unknown に導きます(0による除算を除く)。
Unknown となる式は、トリガーの状態("Problem/OK")を変更しません。 したがって、"Problem" だった場合(ケース1参照)、既知の部分が解決されても('1' が '0' になっても)、式が Unknown に評価されるため、トリガーの状態は変わりません。
複数のサポートされていないアイテムを含むトリガー式が Unknown に評価された場合、フロントエンドのエラーメッセージは最後に評価されたサポートされていないアイテムを参照します。