[comment]: # ({731aa9c5-510ac9cc})
# 3 トリガーの式

[comment]: # ({/731aa9c5-510ac9cc})

[comment]: # ({3a919b3c-473bcd5e})
#### 概要

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

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

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

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

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

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

例：

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

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

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

関連情報:

-   [トリガーの例](/manual/config/triggers/trigger_examples)
-   [トリガーによる障害検知](/manual/config/triggers)（一般的な紹介）

[comment]: # ({/3a919b3c-473bcd5e})

[comment]: # ({856cad55-d4e5ef03})
#### 関数

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

それぞれの関数グループをクリックすると、詳細を表示できます。

|関数グループ|<|関数|
|-|----------|----------------------------------------|
|[集計関数](/manual/config/triggers/expression/aggregate/)|<|avg, bucket\_percentile, count, histogram\_quantile, item\_count, kurtosis, mad, max, min, skewness, stddevpop, stddevsamp, sum, sumofsquares, varpop, varsamp|
| |[Foreach 関数](/manual/config/triggers/expression/aggregate/foreach)|avg\_foreach, bucket\_rate\_foreach, count\_foreach, exists\_foreach, last\_foreach, max\_foreach, min\_foreach, sum\_foreach|
|[ビット演算関数](/manual/config/triggers/expression/bitwise)|<|bitand, bitlshift, bitnot, bitor, bitrshift, bitxor|
|[日付と時刻の関数](/manual/config/triggers/expression/time)|<|date, dayofmonth, dayofweek, now, time|
|[履歴関数](/manual/config/triggers/expression/history)|<|change, changecount, count, countunique, find, first, firstclock, fuzzytime, last, lastclock, logeventid, logseverity, logsource, logtimestamp, monodec, monoinc, nodata, percentile, rate|
|[トレンド関数](/manual/config/triggers/expression/trends)|<|baselinedev, baselinewma, trendavg, trendcount, trendmax, trendmin, trendstl, trendsum|
|[数学関数](/manual/config/triggers/expression/math)|<|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|
|[演算子関数](/manual/config/triggers/expression/operator)|<|between, in|
|[予測関数](/manual/config/triggers/expression/predictive)|<|forecast, timeleft|
|[文字列関数](/manual/config/triggers/expression/string)|<|ascii, bitlength, bytelength, char, concat, insert, jsonpath, left, length, ltrim, mid, repeat, replace, right, rtrim, trim, xmlxpath|

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

-   [トリガー式](/manual/config/triggers/expression)
-   [計算アイテム](/manual/config/items/itemtypes/calculated)
-   [式マクロ](/manual/config/macros/expression_macros)

Foreach 関数は、[集計計算](/manual/config/items/itemtypes/calculated/aggregate)でのみサポートされています。

通常、関数は比較用の数値を返します。
文字列を返す場合は、**=** および **<>** 演算子で比較できます（例: [異なるホスト上の一致しないソフトウェアを検出する](/manual/config/triggers/trigger_examples#detect-non-matching-software-on-different-hosts) を参照）。

[comment]: # ({/856cad55-d4e5ef03})

[comment]: # ({f1c0b59d-b255de16})
#### 関数パラメータ

関数パラメータでは、以下を指定できます。

-   ホストのアイテム履歴を参照する関数のアイテムキー（`/host/key` として）
-   期間（およびその他の関数固有のパラメータ）
-   [その他の式](#other-expressions)

[comment]: # ({/f1c0b59d-b255de16})

[comment]: # ({c59d025d-7ea76dfe})
##### アイテムのキー

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

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

-   計算アイテムの式内
-   式マクロ内（以下の場所で使用可能）:
    -   [*イベント名*](/manual/config/triggers/trigger#configuration)フィールド
    -   グラフ名
    -   "ホスト"および"トリガー"の[マップ要素](/manual/config/visualization/maps/map#adding-elements)のラベル

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

[comment]: # ({/c59d025d-7ea76dfe})

[comment]: # ({85352379-cf9e09bb})
##### 時間期間

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

数値関数のほとんどは、パラメーターとして**時間期間**を受け付けます。  
これにより、対象とする間隔を指定できます。  
時間期間（30s、10m、1h）または値の範囲（\#5 - 直近5件の値）として指定できます。

秒数、または [time suffixes](/manual/appendix/suffixes) を使って時間期間を示すことができます。  
先頭にハッシュ記号を付けた場合、パラメーターの意味は異なります。

|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" までを基準に測定されます。"now" とは、トリガーの最新の再計算時刻です（[Calculation frequency](/manual/config/triggers#calculation-frequency) を参照）。"now" はサーバーの "now" 時刻ではありません。

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

-   "now - time period" から "now" までのすべての値（time shift を適用する場合は、"now - time shift - time period" から "now - time shift" まで）。
-   過去から "now" までの、指定された件数の値。

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

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

-   トリガーで単一の関数（データ履歴を参照するもの）のみを使用している場合、"now" は常に最新の受信値になります。たとえば、最後の値が1時間前に受信された場合、時間期間は1時間前の最新値までと見なされます。
-   新しいトリガーは、最初の値を受信するとすぐに計算されます（履歴関数）。[date and time](/manual/config/triggers/expression/time) および [nodata()](/manual/config/triggers/expression/history#nodata) 関数については、30秒以内に計算されます。そのため、たとえば設定した時間期間（1時間など）がトリガー作成後まだ経過していなくても、トリガーは計算されます。また、時間範囲がたとえば直近10件の値に設定されている場合でも、最初の値の受信後にトリガーは計算されます。

[comment]: # ({/85352379-cf9e09bb})

[comment]: # ({da3613bd-6699e631})
##### 時間シフト

関数パラメータとして時間または値のカウントを指定する場合、オプションで時間シフトがサポートされています。
このパラメータを使用すると、過去の特定の期間のデータを参照できます。

時間シフトは `now` で始まり（現在時刻を指定）、`+N<時間単位>` または `-N<時間単位>`（N個の時間単位を加算または減算）を続けて指定します。

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

::: noteimportant
月（M）および年（y）単位で指定した時間シフトは、[トレンド関数](/manual/config/triggers/expression/trends)でのみサポートされます。他の関数では、秒（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|今週|

[comment]: # ({/da3613bd-6699e631})

[comment]: # ({7fc33108-c5d3ec54})
##### その他の式

関数のパラメータには、次の構文のように他の式を含めることができます。

```default
min(min(/host/key,1h),min(/host2/key2,1h)*10)
```

関数がアイテムの履歴を参照する場合、他の式は使用できませんのでご注意ください。
たとえば、次の構文は**許可されません**:

~~`min(/host/key,#5*10)`~~

関数パラメータとしての他のトリガー式は、トリガー内の非履歴関数に限定されますが、この制限は[計算アイテム](/manual/config/items/itemtypes/calculated)には適用されません。

[comment]: # ({/7fc33108-c5d3ec54})

[comment]: # ({2ef1f03c-10bc91a2})
#### 演算子

**（実行優先度の降順で）** トリガーでサポートされている演算子は次のとおりです。

|優先度|演算子|定義|[不明な値](/manual/config/triggers/expression#unknown-expression-state)に関する注意|オペランドをfloat型に強制変換 ^**1**^|
|-|-|----|----------------|--|
|**1**|**-**|単項マイナス|**-**Unknown → Unknown|はい|
|**2**|**not**|論理NOT|**not** Unknown → Unknown|はい|
|**3**|**\***|乗算|0 **\*** Unknown → Unknown<br>(はい、Unknown、0以外 - 算術演算でUnknownを失わないため)<br>1.2 **\*** Unknown → Unknown|はい|
|<|**/**|除算|Unknown **/** 0 → エラー<br>Unknown **/** 1.2 → Unknown<br>0.0 **/** Unknown → Unknown|はい|
|**4**|**+**|算術加算|1.2 **+** Unknown → Unknown|はい|
|<|**-**|算術減算|1.2 **-** Unknown → Unknown|はい|
|**5**|**\<**|より小さい。演算子は次のように定義されます:<br><br>A<B ⇔ (A<B-0.000001)|1.2 **<** Unknown → Unknown|はい|
|<|**<=**|以下。演算子は次のように定義されます:<br><br>A<=B ⇔ (A≤B+0.000001)|Unknown **<=** Unknown → Unknown|はい|
|<|**>**|より大きい。演算子は次のように定義されます:<br><br>A>B ⇔ (A>B+0.000001)| |はい|
|<|**>=**|以上。演算子は次のように定義されます:<br><br>A>=B ⇔ (A≥B-0.000001)| |はい|
|**6**|**=**|等しい。演算子は次のように定義されます:<br><br>A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001)| |いいえ ^**1**^|
|<|**<>**|等しくない。演算子は次のように定義されます:<br><br>A<>B ⇔ (A<B-0.000001) or (A>B+0.000001)| |いいえ ^**1**^|
|**7**|**and**|論理AND|0 **and** Unknown → 0<br>1 **and** Unknown → Unknown<br>Unknown **and** Unknown → Unknown|はい|
|**8**|**or**|論理OR|1 **or** Unknown → 1<br>0 **or** Unknown → Unknown<br>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」を返します。

[comment]: # ({/2ef1f03c-10bc91a2})

[comment]: # ({a5181770-cad1df72})
#### 不明な式の状態

トリガー式に不明なオペランドが現れる可能性があるのは、以下の場合です。

-   サポートされていないアイテムが使用されている場合
-   サポートされているアイテムに対する関数の評価がエラーになる場合

この場合、トリガー式は一般的に`不明`(評価できないため)となります。

不明なトリガーについて[通知を受け取る](/manual/config/events/sources#internal-events)ことができます。

**例外**

不明なオペランドがあっても、以下のような場合にはトリガー式が既知の結果(障害/正常)に評価されることがあります。

-   [`nodata()`](/manual/config/triggers/trigger/expression/history#nodata)関数は、参照されるアイテムがサポートされているかどうかに関係なく評価されます。
-   AND/ORを含む式は、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'または"正常")に評価されます。
-   サポートされているアイテムに対する関数の評価がエラーになる場合、関数値は`不明`となり、以降の式評価で不明なオペランドとして扱われます。

不明なオペランドは、上記のような論理式の場合のみ"消える"ことがあります。
算術式の場合、不明なオペランドは常に`不明`となります(0による除算を除く)。

::: noteimportant
不明な式の状態は、トリガーの状態(障害/正常)を変更しません。
したがって、トリガーの状態が"障害"(ケース1参照)だった場合、既知の部分が解決されても('1'が'0'になっても)、式が`不明`に評価されるため、トリガーの状態は変更されません。
:::

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

[comment]: # ({/a5181770-cad1df72})

[comment]: # ({0e2466bf-195c3f4f})
#### 値のキャッシュ

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

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

[comment]: # ({/0e2466bf-195c3f4f})
