トリガー式と関数

概要

このページでは、トリガー式の構文と評価の詳細について説明します。

単純な式の構文は次のとおりです。

function(/host/item,time_period)<operator><constant>

この式では、演算子の左側の最初のオペランドは、括弧内にパラメータ(通常はデータアイテムと期間)を持つ関数です。

関数は、設定された期間中に受信したデータを分析するために使用され、計算値が得られます。

この値は、演算子を使用して2番目のオペランドと比較されます。この例では2番目のオペランドは定数ですが、別の関数にすることもできます。

例:

min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K

このトリガーは、過去5分間にeth0で受信したバイト数が常に100キロバイトを超えていた場合に発生します。この場合、式は真となり、障害が作成されます。

トリガー式は非常に柔軟です。より複雑な式では、複数の関数、演算子、定数を組み合わせることができます。

関連情報:

関数

関数を使用すると、収集した値を分析できます。たとえば、平均値の計算や特定の文字列の検索などが可能です。

詳細を表示するには、該当する関数グループをクリックしてください。

関数グループ 関数
集計関数 avg, bucket_percentile, count, histogram_quantile, item_count, kurtosis, mad, max, min, skewness, stddevpop, stddevsamp, sum, sumofsquares, varpop, varsamp
Foreach関数 avg_foreach, bucket_rate_foreach, count_foreach, exists_foreach, last_foreach, max_foreach, min_foreach, sum_foreach
ビット演算関数 bitand, bitlshift, bitnot, bitor, bitrshift, bitxor
日付と時刻の関数 date, dayofmonth, dayofweek, now, time
履歴関数 change, changecount, count, countunique, find, first, firstclock, fuzzytime, jsonpath, last, lastclock, logeventid, logseverity, logsource, logtimestamp, monodec, monoinc, nodata, percentile, rate, xmlxpath
トレンド関数 baselinedev, baselinewma, trendavg, trendcount, trendmax, trendmin, trendstl, trendsum
数学関数 abs, acos, asin, atan, atan2, avg, cbrt, ceil, cos, cosh, cot, degrees, e, exp, expm1, floor, log, log10, max, min, mod, pi, power, radians, rand, round, signum, sin, sinh, sqrt, sum, tan, truncate
演算子関数 between, in
予測関数 forecast, timeleft
文字列関数 ascii, bitlength, bytelength, char, concat, contains, insert, jsonpath, left, length, ltrim, mid, repeat, replace, right, rtrim, substring, trim, xmlxpath

特に記載がない限り、これらの関数は以下でサポートされています。

Foreach関数は、集計計算でのみサポートされています。

通常、関数は比較用の数値を返します。 文字列を返す場合は、= 演算子および <> 演算子を使用して比較できます(異なるホスト上の一致しないソフトウェアを検出する例を参照)。

関数パラメータ

関数パラメータでは、次の項目を指定できます。

  • ホストのアイテム履歴を参照する関数のアイテムキー(/host/key として指定)
  • 期間(および関数固有のその他のパラメータ)
  • その他の式
アイテムのキー

参照されるアイテムは、サポートされている状態でなければなりません(ただし、nodata()関数はサポートされていないアイテムにも計算されます)。

最初のパラメータでホスト名を省略する(つまり、function(//key,parameter,...)のように記述する)ことは、特定のコンテキストでのみサポートされています。

  • 計算アイテムの式内
  • 式マクロ内(以下の場所で使用可能):

これらのコンテキストでは、{HOST.HOST}マクロも使用できます。 イベント名フィールドおよび"トリガー"マップ要素の場合、トリガー式内の特定のアイテムを参照するために{HOST.HOST<1-9>}を使用できます。 これらのコンテキストでホスト名を省略したり、{HOST.HOST}に置き換えたりした場合、参照はトリガー式内の最初のアイテムまたはグラフの最初のアイテムを指します。 これらのサポートされているコンテキスト以外でトリガー式内のホスト名を省略すると、エラーになります。 イベント名マクロでのダブルスラッシュの使用例については、長期間のCPU負荷の比較の例を参照してください。

時間期間

関数固有のパラメータはアイテムキーの後に配置し、アイテムキーとはコンマで区切ります。

数値関数の多くは、パラメータとして時間期間を受け取ります。 これにより、対象とする間隔を指定できます。 時間期間(30s、10m、1h)または値の範囲(#5 - 最新の5つの値)として指定できます。

時間期間を示すには、秒または時間のサフィックスを使用できます。 ハッシュ記号を前に付けると、パラメータの意味が変わります。

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」を返します

時間期間は「現在」までの期間として測定されます。ここでいう「現在」とは、トリガーの最新の再計算時刻です(計算頻度を参照)。「現在」はサーバーの現在時刻ではありません。

時間期間は、次のいずれかを指定します。

  • 「現在 - 時間期間」から「現在」までのすべての値(時間シフトを適用した場合は、「現在 - 時間シフト - 時間期間」から「現在」まで)。
  • 過去から「現在」までの、指定された数の値。

指定した評価期間にデータが存在しない場合、この関数を使用するトリガーまたは計算アイテムはサポート対象外になります。

次の点に注意してください。

  • トリガーで(データ履歴を参照する)単一の関数のみを使用している場合、「現在」は常に最後に受信した値になります。たとえば、最後の値を1時間前に受信した場合、時間期間は1時間前の最新の値までとして扱われます。
  • 新しいトリガーは、最初の値を受信するとすぐに計算されます(履歴関数)。日付と時刻およびnodata()関数の場合は、30秒以内に計算されます。そのため、トリガーが作成されてから、設定した時間期間(たとえば1時間)がまだ経過していなくても、トリガーは計算されます。また、時間範囲をたとえば最新10個の値に設定している場合でも、最初の値を受信した後にトリガーは計算されます。
時間シフト

関数パラメータとして、時間または値の件数とともにオプションの時間シフトを指定できます。 このパラメータを使用すると、過去の期間のデータを参照できます。

時間シフトは現在時刻を指定する now で始まり、その後に時間単位を N 個加算または減算する +N<time unit> または -N<time unit> が続きます。

例えば、avg(/host/key,1h:now-1d) は、1日前の1時間の平均値を返します。

月(M)および年(y)で指定する時間シフトは、トレンド関数でのみサポートされます。その他の関数では、秒(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 → エラー
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)を使用する必要があります)。

評価結果:

  • <、<=、>、>=、=、<>演算子は、指定された関係が真の場合はトリガー式で「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」を返します。

不明な式の状態

トリガー式に不明なオペランドが現れるのは、次の場合です。

  • サポートされていないアイテムが使用されている
  • サポートされているアイテムに対する関数の評価でエラーが発生する

この場合、トリガー式は通常 Unknown と評価されます(評価できないためです)。

不明なトリガーについて 通知を受け取る ことができます。

例外

不明なオペランドがあっても、場合によってはトリガー式を既知の結果(Problem/OK)として評価できます。

  • nodata() 関数は、参照先のアイテムがサポートされているかどうかに関係なく評価されます。
  • AND/OR を含む式は、次の 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")として評価される
  • サポートされているアイテムに対する関数の評価でエラーが発生した場合、その関数値は Unknown となり、以降の式の評価では不明なオペランドとして扱われます。

不明なオペランドが「消える」のは、上記のような論理式の場合のみです。 算術式では、不明なオペランドは常に Unknown につながります(0 での除算を除く)。

不明な式の状態は、トリガーの状態(Problem/OK)を変更しません。 そのため、トリガーの状態が "Problem" だった場合(ケース 1 を参照)、既知の部分が解決されて('1' が '0' になって)も、式は Unknown と評価されるため、障害状態のまま維持されます。これはトリガーの状態を変更しないためです。

複数のサポートされていないアイテムを含むトリガー式が Unknown と評価された場合、Webインターフェースのエラーメッセージには、最後に評価されたサポートされていないアイテムが表示されます。

値のキャッシュ

トリガーの評価に必要な値は、Zabbixサーバーによってキャッシュされます。 このため、サーバーの再起動後しばらくの間、トリガーの評価によってデータベースの負荷が高くなります。 アイテムの履歴値が削除された場合(手動またはハウスキーパーによる)、値のキャッシュはクリアされません。そのため、サーバーはトリガー関数で定義された期間より古い値になるか、サーバーが再起動されるまでキャッシュされた値を使用します。

キャッシュに最近のデータがなく、関数でクエリ期間が定義されていない場合、Zabbixはデフォルトで過去1週間までさかのぼってデータベースから履歴値を取得します。