2 Auslöser-Ausdruck
Übersicht
Die in Auslösern verwendeten Ausdrücke sind sehr flexibel. Sie können damit komplexe logische Tests zu überwachten Statistiken erstellen.
Ein einfacher Ausdruck verwendet eine Funktion, die auf den Datenpunkt mit bestimmten Parametern angewendet wird. Die Funktion gibt ein Ergebnis zurück, das mithilfe eines Operators und einer Konstante mit dem Schwellenwert verglichen wird.
Die Syntax eines einfachen, nützlichen Ausdrucks lautet function(/host/key,parameter)<operator><constant>.
Zum Beispiel:
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
löst einen Auslöser aus, wenn die Anzahl der empfangenen Bytes in den letzten fünf Minuten immer über 100 Kilobyte lag.
Obwohl die Syntax exakt gleich ist, gibt es aus funktionaler Sicht zwei Arten von Auslöser-Ausdrücken:
- Problem-Ausdruck - definiert die Bedingungen des Problems
- Wiederherstellungs-Ausdruck (optional) - definiert zusätzliche Bedingungen für die Problembehebung
Wenn nur ein Problem-Ausdruck definiert wird, wird dieser Ausdruck sowohl als Problemschwellenwert als auch als Wiederherstellungsschwellenwert verwendet. Sobald der Problem-Ausdruck TRUE ergibt, liegt ein Problem vor. Sobald der Problem-Ausdruck FALSE ergibt, ist das Problem behoben.
Wenn sowohl ein Problem-Ausdruck als auch der ergänzende Wiederherstellungs-Ausdruck definiert sind, wird die Problembehebung komplexer: Der Problem-Ausdruck muss nicht nur FALSE ergeben, sondern auch der Wiederherstellungs-Ausdruck TRUE. Dies ist nützlich, um Hysterese zu erstellen und Trigger-Flapping zu vermeiden.
Es ist unproduktiv, das Makro {TRIGGER.VALUE} in einem Wiederherstellungs-Ausdruck zu verwenden, da dieser Ausdruck nur ausgewertet wird, wenn sich der Auslöser im Zustand "Problem" befindet. Folglich wird {TRIGGER.VALUE} bei der Auswertung des Ausdrucks immer zu "1" aufgelöst (was einen Zustand "Problem" kennzeichnet).
Funktionen
Funktionen ermöglichen es, die gesammelten Werte zu berechnen (Durchschnitt, Minimum, Maximum, Summe), Zeichenfolgen zu suchen, auf die aktuelle Zeit und andere Faktoren zu verweisen.
Eine vollständige Liste der unterstützten Funktionen ist verfügbar.
Typischerweise geben Funktionen numerische Werte für Vergleiche zurück. Beim Zurückgeben von Zeichenfolgen ist ein Vergleich mit den Operatoren = und <> möglich (siehe Beispiel).
Funktionsparameter
Funktionsparameter ermöglichen die Angabe von:
- Host- und Datenpunkt-Schlüssel (nur Funktionen, die sich auf die Historie des Host-Datenpunkts beziehen)
- funktionsspezifischen Parametern
- anderen Ausdrücken (für Funktionen, die sich auf die Historie des Host-Datenpunkts beziehen, nicht verfügbar; siehe andere Ausdrücke für Beispiele)
Der Host- und Datenpunkt-Schlüssel kann als /host/key angegeben werden.
Das Weglassen des Hostnamens im ersten Parameter (d. h. wie in function(//key,parameter,...)) wird nur in bestimmten Kontexten unterstützt:
- In der Formel von berechneten Datenpunkten
- In Ausdrucksmakros, die verwendet werden können in:
- Dem Feld Ereignisname
- Dem Graphennamen
- Dem Label der Map-Elemente "Host" und "Trigger"
In diesen Kontexten können Sie auch das Makro {HOST.HOST} verwenden.
{HOST.HOST<1-9>} kann im Fall des Felds Ereignisname und des Map-Elements "Trigger" verwendet werden, um auf ein bestimmtes Element im Auslöser-Ausdruck zu verweisen.
Wenn der Hostname in diesen Kontexten weggelassen oder durch {HOST.HOST} ersetzt wird, verweist die Referenz auf das erste Element im Auslöser-Ausdruck oder auf das erste Element im Graphen.
Außerhalb dieser unterstützten Kontexte führt das Weglassen des Hostnamens in Auslöser-Ausdrücken zu einem Fehler.
Siehe Beispiel 18 für eine Veranschaulichung der Verwendung von Doppelschrägstrichen in Makros für Ereignisnamen.
Der referenzierte Datenpunkt muss sich in einem unterstützten Zustand befinden (mit Ausnahme der Funktion nodata(), die auch für nicht unterstützte Datenpunkte berechnet wird).
Während andere Auslöser-Ausdrücke als Funktionsparameter in Auslösern auf Nicht-Historien-Funktionen beschränkt sind, gilt diese Einschränkung in berechneten Datenpunkten nicht.
Funktionsspezifische Parameter
Funktionsspezifische Parameter werden nach dem Datenpunkt-Schlüssel platziert und durch ein Komma vom Datenpunkt-Schlüssel getrennt. Eine vollständige Liste dieser Parameter finden Sie unter den unterstützten Funktionen.
Die meisten numerischen Funktionen akzeptieren Zeit als Parameter. Sie können Sekunden oder Zeitsuffixe verwenden, um die Zeit anzugeben. Wird dem Parameter ein Hash-Zeichen vorangestellt, hat er eine andere Bedeutung:
| Expression | Description |
|---|---|
| sum(/host/key,10m) | Summe der Werte in den letzten 10 Minuten. |
| sum(/host/key,#10) | Summe der letzten zehn Werte. |
Parameter mit einem Hash-Zeichen haben bei der Funktion last eine andere Bedeutung - sie bezeichnen den N-ten vorherigen Wert. Bei den Werten 30, 70, 20, 60, 50 (vom aktuellsten zum ältesten) gilt daher:
last(/host/key,#2)würde '70' zurückgebenlast(/host/key,#5)würde '50' zurückgeben
Zeitverschiebung
Eine optionale Zeitverschiebung wird mit Zeit oder Wertanzahl als Funktionsparameter unterstützt. Dieser Parameter ermöglicht es, Daten aus einem Zeitraum in der Vergangenheit zu referenzieren.
Die Zeitverschiebung beginnt mit now - der Angabe der aktuellen Zeit, und wird gefolgt von +N<time unit> oder -N<time unit> - um N Zeiteinheiten hinzuzufügen oder zu subtrahieren.
Zum Beispiel gibt avg(/host/key,1h:now-1d) den Durchschnittswert für eine Stunde vor einem Tag zurück.
Eine in Monaten (M) und Jahren (y) angegebene Zeitverschiebung wird nur für Trendfunktionen unterstützt. Andere Funktionen unterstützen Sekunden (s), Minuten (m), Stunden (h), Tage (d) und Wochen (w).
Zeitverschiebung mit absoluten Zeiträumen
Absolute Zeiträume werden im Zeitverschiebungsparameter unterstützt, zum Beispiel Mitternacht bis Mitternacht für einen Tag, Montag bis Sonntag für eine Woche, erster Tag bis letzter Tag des Monats für einen Monat.
Die Zeitverschiebung für absolute Zeiträume beginnt mit now - der Angabe der aktuellen Zeit, und wird gefolgt von beliebig vielen Zeitoperationen: /<time unit> - definiert den Beginn und das Ende der Zeiteinheit, zum Beispiel Mitternacht bis Mitternacht für einen Tag, +N<time unit> oder -N<time unit> - um N Zeiteinheiten hinzuzufügen oder zu subtrahieren.
Bitte beachten Sie, dass der Wert der Zeitverschiebung größer oder gleich 0 sein kann, während der minimale Wert des Zeitraums 1 ist.
| Parameter | Beschreibung |
|---|---|
| 1d:now/d | Gestern |
| 1d:now/d+1d | Heute |
| 2d:now/d+1d | Letzte 2 Tage |
| 1w:now/w | Letzte Woche |
| 1w:now/w+1w | Diese Woche |
Andere Ausdrücke
Funktionsparameter können andere Ausdrücke enthalten, wie in der folgenden Syntax:
min(min(/host/key,1h),min(/host2/key2,1h)*10)
Beachten Sie, dass andere Ausdrücke nicht verwendet werden dürfen, wenn die Funktion auf die Historie eines Datenpunkts verweist. Zum Beispiel ist die folgende Syntax nicht zulässig:
min(/host/key,#5*10)
Operatoren
Die folgenden Operatoren werden für Auslöser unterstützt (in absteigender Priorität der Ausführung):
| Priorität | Operator | Definition | Hinweise für unbekannte Werte | Operand zwangsweise in float umwandeln 1 |
|---|---|---|---|---|
| 1 | - | Unäres Minus | -Unbekannt → Unbekannt | Ja |
| 2 | not | Logisches NICHT | not Unbekannt → Unbekannt | Ja |
| 3 | * | Multiplikation | 0 * Unbekannt → Unbekannt (ja, Unbekannt, nicht 0 - damit Unbekannt bei arithmetischen Operationen nicht verloren geht) 1.2 * Unbekannt → Unbekannt |
Ja |
| / | Division | Unbekannt / 0 → Fehler Unbekannt / 1.2 → Unbekannt 0.0 / Unbekannt → Unbekannt |
Ja | |
| 4 | + | Arithmetisches Plus | 1.2 + Unbekannt → Unbekannt | Ja |
| - | Arithmetisches Minus | 1.2 - Unbekannt → Unbekannt | Ja | |
| 5 | < | Kleiner als. Der Operator ist definiert als: A<B ⇔ (A<B-0.000001) |
1.2 < Unbekannt → Unbekannt | Ja |
| <= | Kleiner als oder gleich. Der Operator ist definiert als: A<=B ⇔ (A≤B+0.000001) |
Unbekannt <= Unbekannt → Unbekannt | Ja | |
| > | Größer als. Der Operator ist definiert als: A>B ⇔ (A>B+0.000001) |
Ja | ||
| >= | Größer als oder gleich. Der Operator ist definiert als: A>=B ⇔ (A≥B-0.000001) |
Ja | ||
| 6 | = | Gleich. Der Operator ist definiert als: A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
Nein 1 | |
| <> | Ungleich. Der Operator ist definiert als: A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
Nein 1 | ||
| 7 | and | Logisches UND | 0 and Unbekannt → 0 1 and Unbekannt → Unbekannt Unbekannt and Unbekannt → Unbekannt |
Ja |
| 8 | or | Logisches ODER | 1 or Unbekannt → 1 0 or Unbekannt → Unbekannt Unbekannt or Unbekannt → Unbekannt |
Ja |
1 Ein String-Operand wird dennoch in einen numerischen Wert umgewandelt, wenn:
- der andere Operand numerisch ist
- ein anderer Operator als = oder <> auf einen Operand angewendet wird
Bei relationalen Operatoren (<, <=, >, >=): Wenn die Umwandlung fehlschlägt (z. B. bei ""), ergibt der Ausdruck Unbekannt (kein Fallback auf String-Vergleich).
Bei Gleichheitsoperatoren (=, <>): Wenn die Umwandlung fehlschlägt, werden die Operanden als rohe Strings verglichen.
Die Operatoren not, and und or sind case-sensitiv und müssen kleingeschrieben sein. Außerdem müssen sie von Leerzeichen oder Klammern umgeben sein.
Alle Operatoren außer dem unären - und not sind linksassoziativ. Der unäre - und not sind nicht assoziativ (das heißt, es sollte -(-1) und not (not 1) statt --1 und not not 1 verwendet werden).
Ergebnis der Auswertung:
- Die Operatoren <, <=, >, >=, =, <> liefern im Auslöserausdruck '1', wenn die angegebene Relation wahr ist, und '0', wenn sie falsch ist. Wenn mindestens ein Operand Unbekannt ist, ist das Ergebnis Unbekannt;
- and liefert für bekannte Operanden '1', wenn beide Operanden ungleich '0' sind; andernfalls '0'; für unbekannte Operanden liefert and nur dann '0', wenn ein Operand gleich '0' ist; andernfalls 'Unknown';
- or liefert für bekannte Operanden '1', wenn einer der Operanden ungleich '0' ist; andernfalls '0'; für unbekannte Operanden liefert or nur dann '1', wenn ein Operand ungleich '0' ist; andernfalls 'Unknown';
- Das Ergebnis des logischen Negationsoperators not ist für einen bekannten Operand '0', wenn der Wert seines Operanden ungleich '0' ist; '1', wenn der Wert seines Operanden gleich '0' ist. Für einen unbekannten Operand liefert not 'Unknown'.
Wert-Caching
Die für die Auslöserauswertung erforderlichen Werte werden vom Zabbix Server zwischengespeichert. Daher verursacht die Auswertung von Auslösern für einige Zeit nach einem Neustart des Servers eine höhere Datenbanklast.
Der Wert-Cache wird nicht geleert, wenn Verlaufswerte von Datenpunkten entfernt werden (entweder manuell oder durch den Housekeeper), sodass der Server die zwischengespeicherten Werte verwendet, bis sie älter sind als die in Auslöserfunktionen definierten Zeiträume oder der Server neu gestartet wird.
Wenn sich keine aktuellen Daten im Cache befinden und in der Funktion kein Abfragezeitraum definiert ist, greift Zabbix standardmäßig bis zu eine Woche in die Vergangenheit zurück, um historische Werte aus der Datenbank abzufragen.
Beispiele für Auslöser
Beispiel 1
Die Prozessorlast auf dem Zabbix Server ist zu hoch.
last(/Zabbix server/system.cpu.load[all,avg1])>5
Mit der Funktion 'last()' verweisen wir auf den aktuellsten Wert.
/Zabbix server/system.cpu.load[all,avg1] gibt einen Kurznamen des überwachten Parameters an.
Sie legt fest, dass der Host 'Zabbix server' ist und der überwachte Schlüssel 'system.cpu.load[all,avg1]' lautet.
Schließlich bedeutet >5, dass sich der Auslöser im PROBLEM-Zustand befindet, sobald die aktuellste Messung der Prozessorlast von Zabbix server größer als 5 ist.
Beispiel 2
www.example.com ist überlastet.
last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2
Der Ausdruck ist wahr, wenn entweder die aktuelle Prozessorlast größer als 5 ist oder die Prozessorlast in den letzten 10 Minuten größer als 2 war.
Beispiel 3
/etc/passwd wurde geändert.
last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)
Der Ausdruck ist wahr, wenn sich der vorherige Wert der Prüfsumme von /etc/passwd vom aktuellsten unterscheidet.
Ähnliche Ausdrücke können nützlich sein, um Änderungen an wichtigen Dateien zu überwachen, z. B. /etc/passwd, /etc/inetd.conf, /kernel usw.
Beispiel 4
Jemand lädt eine große Datei aus dem Internet herunter.
Verwendung der Funktion min:
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
Der Ausdruck ist wahr, wenn die Anzahl der empfangenen Bytes auf eth0 in den letzten 5 Minuten mehr als 100 KB beträgt.
Beispiel 5
Beide Knoten des geclusterten SMTP-Servers sind ausgefallen.
Beachten Sie die Verwendung von zwei verschiedenen Hosts in einem Ausdruck:
last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0
Der Ausdruck ist wahr, wenn beide SMTP-Server sowohl auf smtp1.example.com als auch auf smtp2.example.com ausgefallen sind.
Beispiel 6
Der Zabbix Agent muss aktualisiert werden.
Verwendung der Funktion find():
find(/example.example.com/agent.version,,"like","beta8")=1
Der Ausdruck ist wahr, wenn der Zabbix Agent die Version beta8 hat.
Beispiel 7
Server ist nicht erreichbar.
count(/example.example.com/icmpping,30m,,"0")>5
Der Ausdruck ist wahr, wenn der Host "example.example.com" in den letzten 30 Minuten mehr als 5 Mal nicht erreichbar ist.
Beispiel 8
Keine Heartbeats innerhalb der letzten 3 Minuten.
Verwendung der Funktion nodata():
nodata(/example.example.com/tick,3m)=1
Um diesen Auslöser zu verwenden, muss 'tick' als Zabbix trapper-Datenpunkt definiert sein. Der Host sollte regelmäßig Daten für diesen Datenpunkt mit zabbix_sender senden. Wenn innerhalb von 180 Sekunden keine Daten empfangen werden, wird der Wert des Auslösers zu PROBLEM.
Hinweis, dass 'nodata' für jeden Datenpunkttyp verwendet werden kann.
Beispiel 9
CPU-Aktivität in der Nacht.
Verwendung der Funktion time():
min(/Zabbix Server/system.cpu.load[all,avg1],5m)>2 and time()<060000
Der Auslöser kann seinen Status nur nachts (00:00 - 06:00) auf Problem ändern.
Beispiel 10
CPU-Aktivität zu jeder Zeit mit Ausnahme.
Verwendung der Funktion time() und des Operators not:
min(/zabbix/system.cpu.load[all,avg1],5m)>2
and not (dayofweek()=7 and time()>230000)
and not (dayofweek()=1 and time()<010000)
Der Auslöser kann seinen Status jederzeit auf Problem ändern, außer für 2 Stunden bei einem Wochenwechsel (Sonntag, 23:00 - Montag, 01:00).
Beispiel 11
Prüfen, ob die lokale Zeit des Clients mit der Zeit des Zabbix-Servers synchron ist.
Verwendung der Funktion fuzzytime():
fuzzytime(/MySQL_DB/system.localtime,10s)=0
Der Auslöser wechselt in den Problemzustand, wenn sich die lokale Zeit auf dem Server MySQL_DB und die Zeit des Zabbix-Servers um mehr als 10 Sekunden unterscheidet. Beachten Sie, dass 'system.localtime' für den Zabbix Agent als passive Prüfung konfiguriert sein muss; beim Zabbix Agent 2 kann sie als aktive Prüfung konfiguriert werden.
Beispiel 12
Vergleich der durchschnittlichen Auslastung heute mit der durchschnittlichen Auslastung zur gleichen Zeit gestern (unter Verwendung von time shift als now-1d).
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
Der Auslöser wird ausgelöst, wenn die durchschnittliche Auslastung der letzten Stunde die durchschnittliche Auslastung derselben Stunde gestern um mehr als das Zweifache übersteigt.
Beispiel 13
Verwendung des Werts eines anderen Datenpunkts, um einen Auslöser-Schwellenwert zu ermitteln:
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
Der Auslöser wird ausgelöst, wenn der freie Speicher unter 10 Prozent fällt.
Beispiel 14
Verwendung des Auswertungsergebnisses, um die Anzahl der Auslöser über einem Schwellenwert zu ermitteln:
(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
Der Auslöser wird ausgelöst, wenn sich mindestens zwei der Auslöser in der Ausdrucksdefinition in einem Problemzustand befinden.
Beispiel 15
Vergleich von Zeichenfolgenwerten zweier Datenpunkte - die Operanden sind hier Funktionen, die Zeichenfolgen zurückgeben.
Problem: Erstellen Sie einen Alarm, wenn die Ubuntu-Version auf verschiedenen Hosts unterschiedlich ist
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
Beispiel 16
Vergleich zweier Stringwerte - die Operanden sind:
- eine Funktion, die einen String zurückgibt
- eine Kombination aus Makros und Strings
Problem: Änderungen in der DNS-Abfrage erkennen
Der Datenpunkt-Schlüssel lautet:
net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
mit wie folgt definierten Makros:
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
und gibt normalerweise Folgendes zurück:
example.com MX 0 mail.example.com
Der Ausdruck für unseren Auslöser, um zu erkennen, ob das Ergebnis der DNS-Abfrage vom erwarteten Ergebnis abweicht, lautet daher:
last(/Zabbix server/net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME} {$DNS_RESOURCE_RECORD_TYPE} 0 mail.{$WEBSITE_NAME}"
Beachten Sie die Anführungszeichen um den zweiten Operanden.
Beispiel 17
Vergleich zweier Stringwerte - Operanden sind:
- eine Funktion, die einen String zurückgibt
- eine Stringkonstante mit Sonderzeichen \ und "
Problem: Ermitteln, ob der Inhalt der Datei /tmp/hello gleich ist:
\" //hello ?\"
Option 1. Den String direkt schreiben:
last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""
Beachten Sie, wie die Zeichen \ und " maskiert werden, wenn der String direkt verglichen wird.
Option 2. Ein Makro verwenden
{$HELLO_MACRO} = \" //hello ?\"
in der Ausdrucksformel:
last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Beispiel 18
Vergleich langfristiger Zeiträume.
Problem: Die Auslastung des Exchange-Servers ist im letzten Monat um mehr als 10 % gestiegen
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
Sie können auch das Feld Ereignisname in der Auslöser-Konfiguration verwenden, um eine aussagekräftige Alarmmeldung zu erstellen, zum Beispiel um etwas wie Folgendes zu erhalten:
"Load of Exchange server increased by 24% in July (0.69) comparing to June (0.56)"
der Ereignisname muss wie folgt definiert werden:
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)})
Es ist außerdem sinnvoll, das manuelle Schließen in der Auslöser-Konfiguration für diese Art von Problem zuzulassen.
Haben Sie ein Beispiel für Auslöserausdrücke, das für andere nützlich sein könnte? Verwenden Sie das Beispielvorschlagsformular, um es an die Zabbix-Entwickler zu senden.
Hysterese
Manchmal wird zwischen Problem- und Wiederherstellungszustand ein Intervall benötigt, statt nur eines einfachen Schwellwerts. Wenn wir beispielsweise einen Auslöser definieren möchten, der ein Problem meldet, wenn die Temperatur im Serverraum über 20 °C steigt, und der im Problemzustand bleiben soll, bis die Temperatur unter 15 °C fällt, reicht ein einfacher Auslöser-Schwellwert bei 20 °C nicht aus.
Stattdessen müssen wir zuerst einen Auslöserausdruck für das Problemereignis definieren (Temperatur über 20 °C). Dann müssen wir eine zusätzliche Wiederherstellungsbedingung definieren (Temperatur unter 15 °C). Dies geschieht durch die Definition eines zusätzlichen Parameters Recovery expression, wenn ein Auslöser definiert wird.
In diesem Fall erfolgt die Wiederherstellung des Problems in zwei Schritten:
- Zuerst muss der Problemausdruck (Temperatur über 20 °C) zu FALSE ausgewertet werden
- Danach muss der Wiederherstellungsausdruck (Temperatur unter 15 °C) zu TRUE ausgewertet werden
Der Wiederherstellungsausdruck wird nur ausgewertet, wenn das Problemereignis zuerst behoben wurde.
Dass der Wiederherstellungsausdruck allein TRUE ist, behebt kein Problem, wenn der Problemausdruck weiterhin TRUE ist!
Beispiel 1
Die Temperatur im Serverraum ist zu hoch.
Problem-Ausdruck:
last(/server/temp)>20
Wiederherstellungs-Ausdruck:
last(/server/temp)<=15
Beispiel 2
Der freie Speicherplatz auf der Festplatte ist zu gering.
Problem-Ausdruck: Er liegt in den letzten 5 Minuten unter 10 GB
max(/server/vfs.fs.size[/,free],5m)<10G
Wiederherstellungs-Ausdruck: Er liegt in den letzten 10 Minuten über 40 GB
min(/server/vfs.fs.size[/,free],10m)>40G
Ausdrücke mit unbekannten Operanden
Im Allgemeinen führt ein unbekannter Operand (z. B. ein nicht unterstützter Datenpunkt) im Ausdruck dazu, dass der Auslöserwert sofort auf Unknown gesetzt wird.
In einigen Fällen werden unbekannte Operanden (nicht unterstützte Datenpunkte, Funktionsfehler) jedoch in die Auswertung des Ausdrucks einbezogen:
- Die Funktion
nodata()wird unabhängig davon ausgewertet, ob der referenzierte Datenpunkt unterstützt wird oder nicht. - Logische Ausdrücke mit OR und AND können in zwei Fällen unabhängig von unbekannten Operanden zu bekannten Werten ausgewertet werden:
- Fall 1: "
1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." kann zu einem bekannten Ergebnis ausgewertet werden ('1' oder "Problem"), - Fall 2: "
0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." kann zu einem bekannten Ergebnis ausgewertet werden ('0' oder "OK").
Zabbix versucht, solche logischen Ausdrücke auszuwerten, indem nicht unterstützte Datenpunkte als unbekannte Operanden behandelt werden. In den beiden obigen Fällen wird ein bekannter Wert erzeugt ("Problem" bzw. "OK"); in allen anderen Fällen wird der Auslöser zuUnknownausgewertet.
- Fall 1: "
- Wenn die Funktionsauswertung für einen unterstützten Datenpunkt zu einem Fehler führt, wird der Funktionswert zu
Unknownund geht bei der weiteren Auswertung des Ausdrucks als unbekannter Operand ein.
Beachten Sie, dass unbekannte Operanden nur in logischen Ausdrücken wie oben beschrieben "verschwinden" können.
In arithmetischen Ausdrücken führen unbekannte Operanden immer zum Ergebnis Unknown (außer bei Division durch 0).
Ein Ausdruck, der zu Unknown führt, ändert den Zustand des Auslösers nicht ("Problem/OK").
Wenn er also "Problem" war (siehe Fall 1), bleibt er im selben Problemzustand, selbst wenn der bekannte Teil aufgelöst wird ('1' wird zu '0'), da der Ausdruck nun zu Unknown ausgewertet wird und dies den Zustand des Auslösers nicht ändert.
Wenn ein Auslöserausdruck mit mehreren nicht unterstützten Datenpunkten zu Unknown ausgewertet wird, bezieht sich die Fehlermeldung im Frontend auf den zuletzt ausgewerteten nicht unterstützten Datenpunkt.