2 Trigger-expressie

Overzicht

De uitdrukkingen die worden gebruikt in triggers zijn zeer flexibel. Je kunt ze gebruiken om complexe logische tests te maken met betrekking tot gemonitorde statistieken.

Een eenvoudige uitdrukking maakt gebruik van een functie die wordt toegepast op het item met enkele parameters. De functie retourneert een resultaat dat wordt vergeleken met de drempelwaarde, met behulp van een operator en een constante.

De syntaxis van een eenvoudige bruikbare uitdrukking is functie(/host/sleutel,parameter)<operator><constante>.

Bijvoorbeeld:

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

zal activeren als het aantal ontvangen bytes gedurende de laatste vijf minuten altijd meer dan 100 kilobytes was.

Hoewel de syntaxis precies hetzelfde is, zijn er vanuit functioneel oogpunt twee soorten triggeruitdrukkingen:

  • probleemuitdrukking - definieert de voorwaarden van het probleem
  • hersteluitdrukking (optioneel) - definieert aanvullende voorwaarden voor de probleemoplossing

Bij het alleen definiëren van een probleemuitdrukking wordt deze uitdrukking zowel gebruikt als de drempelwaarde voor het probleem als voor het herstel van het probleem. Zodra de probleemuitdrukking waar is, is er een probleem. Zodra de probleemuitdrukking onwaar is, wordt het probleem opgelost.

Bij het zowel definiëren van een probleemuitdrukking als een aanvullende hersteluitdrukking wordt de probleemoplossing complexer: niet alleen moet de probleemuitdrukking onwaar zijn, maar ook de hersteluitdrukking moet waar zijn. Dit is handig om hysterese te creëren en triggerfladderen te voorkomen.

Functies

Functies maken het mogelijk om de verzamelde waarden te berekenen (gemiddelde, minimum, maximum, som), strings te vinden, de huidige tijd en andere factoren te refereren.

Een volledige lijst van ondersteunde functies is beschikbaar.

Normaal gesproken retourneren functies numerieke waarden voor vergelijking. Bij het retourneren van strings is vergelijking mogelijk met de = en <> operators (zie voorbeeld).

Functieparameters

Functieparameters maken het mogelijk om te specificeren:

  • host en item sleutel (functies die alleen verwijzen naar de geschiedenis van het host-item)
  • functie-specifieke parameters
  • andere expressies (niet beschikbaar voor functies die verwijzen naar de geschiedenis van het host-item, zie andere expressies voor voorbeelden)

De host en item sleutel kunnen worden gespecificeerd als /host/key. Het aangegeven item moet zich in een ondersteunde status bevinden (behalve voor de nodata() functie, die ook wordt berekend voor niet-ondersteunde items).

Terwijl andere triggerexpressies als functieparameters beperkt zijn tot niet-geschiedenisfuncties in triggers, geldt deze beperking niet voor berekende items.

Functie-specifieke parameters

Functie-specifieke parameters worden na de item-sleutel geplaatst en zijn gescheiden van de item-sleutel door een komma. Zie de ondersteunde functies voor een volledige lijst van deze parameters.

De meeste numerieke functies accepteren tijd als parameter. U kunt seconden of tijd-achtervoegsels gebruiken om de tijd aan te geven. Voorafgegaan door een hash-teken heeft de parameter een andere betekenis:

Expressie Beschrijving
sum(/host/key,10m) Som van waarden in de laatste 10 minuten.
sum(/host/key,#10) Som van de laatste tien waarden.

Parameters met een hash-teken hebben een andere betekenis bij de functie last - ze duiden op de N-de vorige waarde, dus gegeven de waarden 3, 7, 2, 6, 5 (van de meest recente tot de minst recente):

  • last(/host/key,#2) zou '7' retourneren
  • last(/host/key,#5) zou '5' retourneren
Tijdverschuiving

Een optionele tijdverschuiving wordt ondersteund met tijd of een teller voor waarden als de functieparameter. Deze parameter maakt het mogelijk om gegevens van een periode in het verleden te raadplegen.

Tijdverschuiving begint met now - waarbij de huidige tijd wordt gespecificeerd, en wordt gevolgd door +N<eenheid van tijd> of -N<eenheid van tijd> - om N eenheden van tijd toe te voegen of af te trekken.

Bijvoorbeeld, avg(/host/sleutel,1u:now-1d) zal de gemiddelde waarde teruggeven voor een uur een dag geleden.

Tijdverschuiving gespecificeerd in maanden (M) en jaren (y) wordt alleen ondersteund voor trendfuncties. Andere functies ondersteunen seconden (s), minuten (m), uren (h), dagen (d) en weken (w).

Tijdverschuiving met absolute tijdsperioden

Absolute tijdsperioden worden ondersteund in de tijdverschuwingsparameter, bijvoorbeeld van middernacht tot middernacht voor een dag, maandag-zondag voor een week, de eerste dag-laatste dag van de maand voor een maand.

Tijdverschuiving voor absolute tijdsperioden begint met now - waarbij de huidige tijd wordt gespecificeerd, en wordt gevolgd door een willekeurig aantal tijdsoperaties: /<eenheid van tijd> - definieert het begin en einde van de tijdsperiode, bijvoorbeeld van middernacht tot middernacht voor een dag, +N<eenheid van tijd> of -N<eenheid van tijd> - om N eenheden van tijd toe te voegen of af te trekken.

Let op dat de waarde van de tijdverschuiving groter of gelijk aan 0 kan zijn, terwijl de minimale waarde van de tijdsperiode 1 is.

Parameter Beschrijving
1d:now/d Gisteren
1d:now/d+1d Vandaag
2d:now/d+1d Laatste 2 dagen
1w:now/w Vorige week
1w:now/w+1w Deze week
Andere uitdrukkingen

Functieparameters kunnen andere uitdrukkingen bevatten, zoals in de volgende syntax:

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

Let op dat andere uitdrukkingen niet kunnen worden gebruikt als de functie verwijst naar de geschiedenis van het item. Bijvoorbeeld, de volgende syntaxis is niet toegestaan:

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

Operatoren

De volgende operatoren worden ondersteund voor triggers (in aflopende prioriteit van uitvoering):

Prioriteit Operator Definitie Notities voor onbekende waarden Forceer omzetting van operand naar een float 1
1 - Unaire negatie -Onbekend → Onbekend Ja
2 not Logische NOT not Onbekend → Onbekend Ja
3 * Vermenigvuldiging 0 * Onbekend → Onbekend
(ja, Onbekend, niet 0 - om
Onbekend te behouden in rekenkundige bewerkingen)
1,2 * Onbekend → Onbekend
Ja
/ Deling Onbekend / 0 → fout
Onbekend / 1,2 → Onbekend
0,0 / Onbekend → Onbekend
Ja
4 + Rekenkundige optelling 1,2 + Onbekend → Onbekend Ja
- Rekenkundige aftrekking 1,2 - Onbekend → Onbekend Ja
5 < Kleiner dan. De operator is gedefinieerd als:

A<B ⇔ (A<B-0,000001)
1,2 < Onbekend → Onbekend Ja
<= Kleiner dan of gelijk aan. De operator is gedefinieerd als:

A<=B ⇔ (A≤B+0,000001)
Onbekend <= Onbekend → Onbekend Ja
> Groter dan. De operator is gedefinieerd als:

A>B ⇔ (A>B+0,000001)
Ja
>= Groter dan of gelijk aan. De operator is gedefinieerd als:

A>=B ⇔ (A≥B-0,000001)
Ja
6 = Is gelijk aan. De operator is gedefinieerd als:

A=B ⇔ (A≥B-0,000001) en (A≤B+0,000001)
Nee 1
<> Is niet gelijk aan. De operator is gedefinieerd als:

A<>B ⇔ (A<B-0,000001) of (A>B+0,000001)
Nee 1
7 and Logische AND 0 and Onbekend → 0
1 and Onbekend → Onbekend
Onbekend and Onbekend → Onbekend
Ja
8 or Logische OR 1 or Onbekend → 1
0 or Onbekend → Onbekend
Onbekend or Onbekend → Onbekend
Ja

1 Een string operand wordt nog steeds omgezet naar numeriek als:

  • een andere operand numeriek is
  • een operator anders dan = of <> wordt gebruikt op een operand

(Als de omzetting mislukt - wordt een numerieke operand omgezet naar een string operand en worden beide operanden als strings vergeleken.)

not, and en or operatoren zijn hoofdlettergevoelig en moeten worden omgeven door spaties of haakjes.

Alle operatoren, behalve unaire - en not, hebben een associativiteit van links naar rechts. Unaire - en not zijn niet-associatief (wat betekent dat -(-1) en not (not 1) gebruikt moet worden in plaats van --1 en not not 1).

Evaluatieresultaat:

  • <, <=, >, >=, =, <> operatoren geven '1' in de triggerexpressie als de opgegeven relatie waar is en '0' als het onwaar is. Als ten minste één operand is Onbekend is het resultaat Onbekend;
  • and voor bekende operanden geeft '1' als beide operanden ongelijk aan '0'; anders geeft het '0'; voor onbekende operanden geeft and '0' alleen als één operand gelijk is aan '0'; anders geeft het 'Onbekend';
  • or voor bekende operanden geeft '1' als één van de operanden ongelijk aan '0'; anders geeft het '0'; voor onbekende operanden geeft or '1' alleen als één operand ongelijk is aan '0'; anders geeft het 'Onbekend';
  • Het resultaat van de logische negatie operator not voor een bekende operand is '0' als de waarde van zijn operand ongelijk is aan '0'; '1' als de waarde van zijn operand gelijk is aan '0'. Voor een onbekende operand geeft not 'Onbekend'.

Waardes caching

Waardes die nodig zijn voor de evaluatie van triggers worden gecached door de Zabbix-server. Hierdoor zorgt trigger evaluatie voor een hogere belasting van de database gedurende enige tijd na het herstarten van de server. De waardecache wordt niet gewist wanneer itemgeschiedeniswaarden worden verwijderd (zowel handmatig als door housekeeper), dus de server zal de gecachte waarden gebruiken totdat ze ouder zijn dan de tijdsperiodes die zijn gedefinieerd in triggerfuncties of de server wordt herstart.

Voorbeelden van triggers

Voorbeeld 1

De processorbelasting is te hoog op de Zabbix-server.

last(/Zabbix server/system.cpu.load[all,avg1])>5

Door de functie 'last()' te gebruiken, verwijzen we naar de meest recente waarde. /Zabbix server/system.cpu.load[all,avg1] geeft een korte naam van de gemonitorde parameter. Het geeft aan dat de host 'Zabbix server' is en de sleutel die wordt gemonitord is 'system.cpu.load[all,avg1]'. Tot slot betekent >5 dat de trigger in de PROBLEM-toestand is wanneer de meest recente meting van de processorbelasting van de Zabbix-server groter is dan 5.

Voorbeeld 2

www.example.com is overbelast.

last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2 

De expressie is waar wanneer ofwel de huidige processorbelasting meer is dan 5 of de processorbelasting gedurende de laatste 10 minuten meer dan 2 was.

Voorbeeld 3

/etc/passwd is gewijzigd.

last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)

De expressie is waar wanneer de vorige waarde van de checksum van /etc/passwd verschilt van de meest recente waarde.

Vergelijkbare expressies kunnen nuttig zijn om wijzigingen in belangrijke bestanden te monitoren, zoals /etc/passwd, /etc/inetd.conf, /kernel, enz.

Voorbeeld 4

Iemand downloadt een groot bestand van internet.

Gebruik van de functie min:

min(/www.example.com/net.if.in[eth0,bytes],5m)>100K

De expressie is waar wanneer het aantal ontvangen bytes op eth0 meer is dan 100 KB in de afgelopen 5 minuten.

Voorbeeld 5

Beide nodes van de geclusterde SMTP-server zijn niet beschikbaar.

Merk op dat er twee verschillende hosts worden gebruikt in één expressie:

last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0

De expressie is waar wanneer beide SMTP-servers niet beschikbaar zijn op zowel smtp1.example.com als smtp2.example.com.

Voorbeeld 6

De Zabbix-agent moet worden bijgewerkt.

Gebruik van de functie find():

find(/example.example.com/agent.version,,"like","beta8")=1

De expressie is waar als de Zabbix-agent de versie beta8 heeft.

Voorbeeld 7

De server is niet bereikbaar.

count(/example.example.com/icmpping,30m,,"0")>5

De expressie is waar als de host "example.example.com" meer dan 5 keer onbereikbaar is geweest in de afgelopen 30 minuten.

Voorbeeld 8

Geen hartslagen binnen de laatste 3 minuten.

Gebruik van de functie 'nodata()':

nodata(/example.example.com/tick,3m)=1

Om gebruik te kunnen maken van deze trigger, moet 'tick' worden gedefinieerd als een Zabbix trapper item. De host moet periodiek gegevens voor dit item verzenden met behulp van zabbix_sender. Als er gedurende 180 seconden geen gegevens worden ontvangen, wordt de triggerwaarde PROBLEEM.

Let op dat 'nodata' kan worden gebruikt voor elk type item.

Voorbeeld 9

CPU-activiteit 's nachts.

Gebruik van de functie 'time()':

min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000

De trigger kan alleen van status veranderen naar 'probleem' gedurende de nachtelijke uren (00:00 - 06:00 uur).

Voorbeeld 10

CPU-activiteit op elk moment, met uitzondering.

Gebruik van de functie 'time()' en de not operator:

min(/zabbix/system.cpu.load[all,avg1],5m)>2
       and not (dayofweek()=7 and time()>230000)
       and not (dayofweek()=1 and time()<010000)

De trigger kan op elk moment van status veranderen naar 'probleem', met uitzondering van 2 uur bij een overgang van week (zondag, 23:00 uur - maandag, 01:00 uur).

Voorbeeld 11

Controleer of de lokale tijd van de client overeenkomt met de tijd van de Zabbix-server.

Gebruik van de functie 'fuzzytime()':

fuzzytime(/MySQL_DB/system.localtime,10s)=0

De trigger zal naar de probleemstatus veranderen in het geval dat de lokale tijd op server MySQL_DB meer dan 10 seconden afwijkt van de tijd van de Zabbix-server. Houd er rekening mee dat 'system.localtime' geconfigureerd moet zijn als een passieve check.

Voorbeeld 12

Vergelijking van de gemiddelde belasting vandaag met de gemiddelde belasting van dezelfde tijd gisteren (met behulp van tijdsverschuiving als now-1d).

avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2

Deze trigger zal afgaan als de gemiddelde belasting van het afgelopen uur de gemiddelde belasting van hetzelfde uur gisteren met meer dan twee keer overschrijdt.

Voorbeeld 13

Gebruik van de waarde van een ander item om een triggerdrempel te krijgen:

last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1

De trigger zal afgaan als de vrije opslagruimte onder de 10 procent zakt.

Voorbeeld 14

Gebruik van evaluatie resultaat om het aantal triggers boven een drempelwaarde te krijgen:

(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

De trigger zal afgaan als ten minste twee van de triggers in de expressie in een probleemstaat zijn.

Voorbeeld 15

Het vergelijken van tekenreekswaarden van twee items - operanden hier zijn functies die tekenreeksen retourneren.

Probleem: een melding maken als de Ubuntu-versie verschilt op verschillende hosts.

last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
Voorbeeld 16

Het vergelijken van twee tekenreekswaarden - operanden zijn:

  • een functie die een tekenreeks retourneert
  • een combinatie van macro's en tekenreeksen

Probleem: wijzigingen in de DNS-query detecteren

De item-sleutel is:

net.dns.record[8.8.8.8,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]

met macro's gedefinieerd als

{$WEBSITE_NAME} = example.com
       {$DNS_RESOURCE_RECORD_TYPE} = MX

en normaal gesproken retourneert het:

example.com           MX       0 mail.example.com

Dus onze triggervoorwaarde om te detecteren of het resultaat van de DNS-query afwijkt van het verwachte resultaat is:

last(/Zabbix server/net.dns.record[8.8.8.8,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME}           {$DNS_RESOURCE_RECORD_TYPE}       0 mail.{$WEBSITE_NAME}"

Let op de aanhalingstekens rond de tweede operand.

Voorbeeld 17

Het vergelijken van twee tekenreekswaarden - operanden zijn:

  • een functie die een tekenreeks retourneert
  • een tekenreeksconstante met speciale tekens \ en "

Probleem: detecteren of de inhoud van het bestand /tmp/hello gelijk is aan:

\" //hello ?\"

Optie 1) schrijf de tekenreeks rechtstreeks

last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""

Let op hoe \ en " tekens worden ontsnapt wanneer de tekenreeks rechtstreeks wordt vergeleken.

Optie 2) gebruik een macro

{$HELLO_MACRO} = \" //hello ?\"

in de uitdrukking:

last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Voorbeeld 18

Lange-termijnperioden vergelijken.

Probleem: De belasting van de Exchange-server is de afgelopen maand met meer dan 10% gestegen

trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)

U kunt ook het veld Gebeurtenisnaam in de triggerconfiguratie gebruiken om een zinvolle waarschuwingsmelding op te bouwen, bijvoorbeeld om iets te ontvangen als

"Belasting van de Exchange-server is in juli met 24% gestegen (0,69) in vergelijking met juni (0,56)"

de gebeurtenisnaam moet als volgt worden gedefinieerd:

Belasting van {HOST.HOST} server is in {{TIME}.fmttime(%B,-1M)} met {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(0)}% gestegen ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) in vergelijking met {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})

Het is ook nuttig om in de triggerconfiguratie handmatig sluiten toe te staan voor dit soort problemen.

Heb je een voorbeeld van triggerexpressies dat handig kan zijn voor anderen? Gebruik het Formulier voor suggesties van voorbeelden om het naar de Zabbix-ontwikkelaars te sturen.

Hysterese

Soms is er een interval nodig tussen probleem- en herstelstaten, in plaats van een eenvoudige drempelwaarde. Bijvoorbeeld, als we een trigger willen definiëren die een probleem rapporteert wanneer de temperatuur in de serverruimte boven de 20°C komt, en we willen dat het in de probleemstaat blijft totdat de temperatuur onder de 15°C daalt, dan is een eenvoudige drempelwaarde van 20°C niet voldoende.

In plaats daarvan moeten we eerst een triggerexpressie definiëren voor het probleemgeval (temperatuur boven 20°C). Vervolgens moeten we een aanvullende herstelvoorwaarde definiëren (temperatuur onder 15°C). Dit wordt gedaan door een aanvullende parameter Herstel expressie te definiëren bij het definiëren van een trigger.

In dit geval zal het herstel van het probleem in twee stappen plaatsvinden:

  • Eerst moet de probleemexpressie (temperatuur boven 20°C) worden geëvalueerd als ONWAAR
  • Ten tweede moet de herstel expressie (temperatuur onder 15°C) worden geëvalueerd als WAAR

De herstel expressie wordt alleen geëvalueerd wanneer het probleemgeval eerst is opgelost.

Alleen de waarheid van de herstel expressie op zich lost het probleem niet op als de probleemexpressie nog steeds WAAR is!

Voorbeeld 1

De temperatuur in de serverruimte is te hoog.

Probleemuitdrukking:

last(/server/temp)>20

Hersteluitdrukking:

last(/server/temp)<=15

In dit voorbeeld wordt de trigger geactiveerd wanneer de temperatuur in de serverruimte hoger is dan 20°C. De trigger blijft in de probleemstatus totdat de temperatuur weer daalt naar 15°C of lager, zoals aangegeven in de hersteluitdrukking. Pas als de temperatuur onder de 15°C zakt en de hersteluitdrukking waar is, wordt het probleem opgelost.

Voorbeeld 2

Er is te weinig vrije schijfruimte.

Probleemuitdrukking: het is minder dan 10 GB gedurende de laatste 5 minuten.

max(/server/vfs.fs.size[/,free],5m)<10G

Hersteluitdrukking: het is meer dan 40 GB gedurende de laatste 10 minuten.

min(/server/vfs.fs.size[/,free],10m)>40G

Uitdrukkingen met onbekende operanden

Over het algemeen zal een onbekende operand (zoals een niet-ondersteund item) in de uitdrukking de triggerwaarde onmiddellijk op Onbekend zetten.

Echter, in sommige gevallen worden onbekende operanden (niet-ondersteunde items, functiefouten) toegelaten in de evaluatie van de uitdrukking:

  • De nodata()-functie wordt geëvalueerd ongeacht of het gerefereerde item wordt ondersteund of niet.
  • Logische uitdrukkingen met OF en EN kunnen in twee gevallen worden geëvalueerd naar bekende waarden, ongeacht onbekende operanden:
    • Geval 1: "1 of some_function(niet_ondersteund_item1) of some_function(niet_ondersteund_item2) of ..." kan worden geëvalueerd naar een bekend resultaat ('1' of "Probleem"),
    • Geval 2: "0 en some_function(niet_ondersteund_item1) en some_function(niet_ondersteund_item2) en ..." kan worden geëvalueerd naar een bekend resultaat ('0' of "OK").
      Zabbix probeert dergelijke logische uitdrukkingen te evalueren door niet-ondersteunde items als onbekende operanden te beschouwen. In de twee bovengenoemde gevallen wordt een bekende waarde geproduceerd ("Probleem" of "OK"); in alle andere gevallen wordt de trigger geëvalueerd naar Onbekend.
  • Als de functie-evaluatie voor een ondersteund item resulteert in een fout, wordt de functiewaarde Onbekend en neemt deze deel als onbekende operand in verdere uitdrukkingsevaluatie.

Merk op dat onbekende operanden alleen kunnen "verdwijnen" in logische uitdrukkingen zoals hierboven beschreven. In rekenkundige uitdrukkingen leiden onbekende operanden altijd tot het resultaat Onbekend (behalve deling door 0).

Een uitdrukking die resulteert in Onbekend verandert de triggertoestand ("Probleem/OK") niet. Dus, als het "Probleem" was (zie Geval 1), blijft het in dezelfde probleemtoestand, zelfs als het bekende deel is opgelost ('1' wordt '0'), omdat de uitdrukking nu wordt geëvalueerd naar Onbekend en dat verandert de triggertoestand niet.

Als een triggerevaluatie met meerdere niet-ondersteunde items resulteert in Onbekend, verwijst het foutbericht in de frontend naar het laatste geëvalueerde niet-ondersteunde item.