De expressies 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 expressie 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 syntax van een eenvoudige nuttige expressie is function(/host/key,parameter)<operator><constant>
.
Bijvoorbeeld:
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
zal een trigger activeren als het aantal ontvangen bytes gedurende de laatste vijf minuten altijd meer dan 100 kilobytes was.
Hoewel de syntax precies hetzelfde is, zijn er vanuit functioneel oogpunt twee soorten triggerexpressies:
Bij het alleen definiëren van een probleemexpressie wordt deze expressie zowel als de drempelwaarde voor het probleem als de drempelwaarde voor het herstel van het probleem gebruikt. Zodra de probleemexpressie evalueert naar TRUE, is er een probleem. Zodra de probleemexpressie evalueert naar FALSE, is het probleem opgelost.
Bij het definiëren van zowel de probleemexpressie als de aanvullende hersteluitdrukking wordt het probleemoplossingsproces complexer: niet alleen moet de probleemexpressie FALSE zijn, maar ook de hersteluitdrukking moet TRUE zijn. Dit is handig om hysteresis te creëren en triggerflappen te voorkomen.
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 maken het mogelijk om te specificeren:
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 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 tijdsachtervoegsels gebruiken om de tijd aan te geven. Voorafgegaan door een hashtag heeft de parameter een andere betekenis:
Uitdrukking | 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 hashtag hebben een andere betekenis bij de functie last - ze geven de N-de vorige waarde aan, dus gegeven de waarden 3, 7, 2, 6, 5 (van de meest recente naar de minst recente):
last(/host/key,#2)
geeft '7' teruglast(/host/key,#5)
geeft '5' terugEen optionele tijdverschuiving wordt ondersteund met tijd of het aantal waarden als de functieparameter. Deze parameter maakt het mogelijk om gegevens te refereren uit een periode in het verleden.
Tijdverschuiving begint met now
- waarbij de huidige tijd wordt aangegeven, gevolgd door +N<tijdeenheid>
of -N<tijdeenheid>
- om N tijdseenheden toe te voegen of af te trekken.
Bijvoorbeeld, avg(/host/key,1h:now-1d)
zal de gemiddelde waarde teruggeven voor een uur één dag geleden.
Tijdverschuiving gespecificeerd in maanden (M) en jaren (y) wordt alleen ondersteund voor trend functies. Andere functies ondersteunen seconden (s), minuten (m), uren (h), dagen (d), en weken (w).
Tijdverschuiving met absolute tijdsperioden
Absolute tijdsperioden worden ondersteund in de tijdverschuivingsparameter, bijvoorbeeld, middernacht tot middernacht voor een dag, maandag-zondag voor een week, eerste dag-laatste dag van de maand voor een maand.
Tijdverschuiving voor absolute tijdsperioden begint met now
- waarbij de huidige tijd wordt aangegeven, gevolgd door een willekeurig aantal tijdsbewerkingen: /<tijdeenheid>
- definieert het begin en einde van de tijdsperiode, bijvoorbeeld, middernacht tot middernacht voor een dag, +N<tijdeenheid>
of -N<tijdeenheid>
- om N tijdsdelen toe te voegen of af te trekken.
Houd er rekening mee dat de waarde van de tijdverschuiving groter of gelijk kan zijn aan 0, terwijl de minimumwaarde 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 |
Functieparameters kunnen andere uitdrukkingen bevatten, zoals in de volgende syntax:
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)
De volgende operatoren worden ondersteund voor triggers (in dalende prioriteit van uitvoering):
Prioriteit | Operator | Definitie | Notities voor onbekende waarden | Dwing de conversie van operand naar float af 1 |
---|---|---|---|---|
1 | - | Unair min-teken | -Onbekend → Onbekend | Ja |
2 | not | Logische NIET | not Onbekend → Onbekend | Ja |
3 | * | Vermenigvuldiging | 0 * Onbekend → Onbekend (ja, Onbekend, niet 0 - om Onbekend in rekenkundige bewerkingen niet te verliezen) 1,2 * Onbekend → Onbekend |
Ja |
/ | Delen | Onbekend / 0 → fout Onbekend / 1,2 → Onbekend 0,0 / Onbekend → Onbekend |
Ja | |
4 | + | Arithmetische plus | 1,2 + Onbekend → Onbekend | Ja |
- | Arithmetische min | 1,2 - Onbekend → Onbekend | Ja | |
5 | < | Kleiner dan. De operator wordt gedefinieerd als: A<B ⇔ (A<B-0,000001) |
1,2 < Onbekend → Onbekend | Ja |
<= | Kleiner dan of gelijk aan. De operator wordt gedefinieerd als: A<=B ⇔ (A≤B+0,000001) |
Onbekend <= Onbekend → Onbekend | Ja | |
> | Groter dan. De operator wordt gedefinieerd als: A>B ⇔ (A>B+0,000001) |
Ja | ||
>= | Groter dan of gelijk aan. De operator wordt gedefinieerd als: A>=B ⇔ (A≥B-0,000001) |
Ja | ||
6 | = | Is gelijk aan. De operator wordt gedefinieerd als: A=B ⇔ (A≥B-0,000001) en (A≤B+0,000001) |
Nee 1 | |
<> | Is niet gelijk aan. De operator wordt gedefinieerd als: A<>B ⇔ (A<B-0,000001) of (A>B+0,000001) |
Nee 1 | ||
7 | and | Logische EN | 0 and Onbekend → 0 1 and Onbekend → Onbekend Onbekend and Onbekend → Onbekend |
Ja |
8 | or | Logische OF | 1 or Onbekend → 1 0 or Onbekend → Onbekend Onbekend or Onbekend → Onbekend |
Ja |
1 De stringoperand wordt nog steeds omgezet naar numeriek als:
(Als de conversie mislukt - wordt de numerieke operand omgezet naar een stringoperand en worden beide operanden als strings met elkaar vergeleken.)
not, and en or operatoren zijn hoofdlettergevoelig en moeten worden geschreven in kleine letters. Ze moeten ook worden omringd door spaties of haakjes.
Alle operatoren, behalve het unair - en not, hebben een links-naar-rechts associativiteit. Unair - en not zijn niet-associatief (wat betekent dat -(-1) en not (not 1) moeten worden gebruikt in plaats van --1 en not not 1).
Resultaat van evaluatie:
De volgende operatoren worden ondersteund voor triggers (in aflopende prioriteit van uitvoering):
Prioriteit | Operator | Definitie | Opmerkingen voor onbekende waarden | Dwing conversie van operand naar float af 1 |
---|---|---|---|---|
1 | - | Unair min-teken | - Onbekend → Onbekend | Ja |
2 | not | Logische NIET | not Onbekend → Onbekend | Ja |
3 | * | Vermenigvuldiging | 0 * Onbekend → Onbekend (ja, Onbekend, niet 0 - om Onbekend in rekenkundige bewerkingen niet te verliezen) 1,2 * Onbekend → Onbekend |
Ja |
/ | Delen | Onbekend / 0 → fout Onbekend / 1,2 → Onbekend 0,0 / Onbekend → Onbekend |
Ja | |
4 | + | Arithmetische plus | 1,2 + Onbekend → Onbekend | Ja |
- | Arithmetische min | 1,2 - Onbekend → Onbekend | Ja | |
5 | < | Kleiner dan. De operator wordt gedefinieerd als: A<B ⇔ (A<B-0,000001) |
1,2 < Onbekend → Onbekend | Ja |
<= | Kleiner dan of gelijk aan. De operator wordt gedefinieerd als: A<=B ⇔ (A≤B+0,000001) |
Onbekend <= Onbekend → Onbekend | Ja | |
> | Groter dan. De operator wordt gedefinieerd als: A>B ⇔ (A>B+0,000001) |
Ja | ||
>= | Groter dan of gelijk aan. De operator wordt gedefinieerd als: A>=B ⇔ (A≥B-0,000001) |
Ja | ||
6 | = | Is gelijk aan. De operator wordt gedefinieerd als: A=B ⇔ (A≥B-0,000001) en (A≤B+0,000001) |
Nee 1 | |
<> | Is niet gelijk aan. De operator wordt gedefinieerd als: A<>B ⇔ (A<B-0,000001) of (A>B+0,000001) |
Nee 1 | ||
7 | and | Logische EN | 0 and Onbekend → 0 1 and Onbekend → Onbekend Onbekend and Onbekend → Onbekend |
Ja |
8 | or | Logische OF | 1 or Onbekend → 1 0 or Onbekend → Onbekend Onbekend or Onbekend → Onbekend |
Ja |
1 De stringoperand wordt nog steeds omgezet naar numeriek als:
(Als de conversie mislukt, wordt de numerieke operand omgezet naar een stringoperand en worden beide operanden als strings met elkaar vergeleken.)
not, and en or operatoren zijn hoofdlettergevoelig en moeten worden geschreven in kleine letters. Ze moeten ook worden omringd door spaties of haakjes.
Alle operatoren, behalve het unair - en not, hebben een links-naar-rechts associativiteit. Unair - en not zijn niet-associatief (wat betekent dat -(-1) en not (not 1) moeten worden gebruikt in plaats van --1 en not not 1).
Resultaat van evaluatie:
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.
De processorbelasting is te hoog op de Zabbix-server.
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.
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.
/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.
Iemand downloadt een groot bestand van internet.
Gebruik van de functie min:
De expressie is waar wanneer het aantal ontvangen bytes op eth0 meer is dan 100 KB in de afgelopen 5 minuten.
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.
De Zabbix-agent moet worden bijgewerkt.
Gebruik van de functie find():
De expressie is waar als de Zabbix-agent de versie beta8 heeft.
De server is niet bereikbaar.
De expressie is waar als de host "example.example.com" meer dan 5 keer onbereikbaar is geweest in de afgelopen 30 minuten.
Geen hartslagen binnen de laatste 3 minuten.
Gebruik van de functie 'nodata()':
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.
CPU-activiteit 's nachts.
Gebruik van de functie 'time()':
De trigger kan alleen van status veranderen naar 'probleem' gedurende de nachtelijke uren (00:00 - 06:00 uur).
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).
Controleer of de lokale tijd van de client overeenkomt met de tijd van de Zabbix-server.
Gebruik van de functie 'fuzzytime()':
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.
Vergelijking van de gemiddelde belasting vandaag met de gemiddelde belasting van dezelfde tijd gisteren (met behulp van tijdsverschuiving als now-1d
).
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.
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.
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.
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])
Het vergelijken van twee tekenreekswaarden - operanden zijn:
Probleem: wijzigingen in de DNS-query detecteren
De item-sleutel is:
met macro's gedefinieerd als
en normaal gesproken retourneert het:
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.
Het vergelijken van twee tekenreekswaarden - operanden zijn:
Probleem: detecteren of de inhoud van het bestand /tmp/hello
gelijk is aan:
Optie 1) schrijf de tekenreeks rechtstreeks
Let op hoe \ en " tekens worden ontsnapt wanneer de tekenreeks rechtstreeks wordt vergeleken.
Optie 2) gebruik een macro
in de uitdrukking:
Lange-termijnperioden vergelijken.
Probleem: De belasting van de Exchange-server is de afgelopen maand met meer dan 10% gestegen
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.
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 een serverruimte boven de 20°C komt en we willen dat deze in de probleemstatus blijft totdat de temperatuur onder de 15°C zakt, 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 Hersteluitdrukking parameter te definiëren bij het definiëren van een trigger.
In dit geval zal het herstel van het probleem in twee stappen plaatsvinden:
De hersteluitdrukking wordt alleen geëvalueerd wanneer het probleemgeval eerst is opgelost.
De hersteluitdrukking die ALLEEN als TRUE wordt geëvalueerd, lost het probleem niet op als de probleemexpressie nog steeds TRUE is!
De temperatuur in de serverruimte is te hoog.
Probleemuitdrukking:
Hersteluitdrukking:
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.
Er is te weinig vrije schijfruimte.
Probleemuitdrukking: het is minder dan 10 GB gedurende de laatste 5 minuten.
Hersteluitdrukking: het is meer dan 40 GB gedurende de laatste 10 minuten.
Over het algemeen zal een onbekende operand (zoals een niet-ondersteund item) in de uitdrukking de triggerwaarde onmiddellijk instellen op Onbekend
.
Echter, in sommige gevallen worden onbekende operanden (niet-ondersteunde items, functiefouten) toegelaten in de uitdrukkingsbeoordeling:
nodata()
-functie wordt geëvalueerd, ongeacht of het gerefereerde item wordt ondersteund of niet.1 of some_function(niet_ondersteund_item1) of some_function(niet_ondersteund_item2) of ...
" kan worden geëvalueerd tot een bekend resultaat ('1' of "Probleem"),0 en some_function(niet_ondersteund_item1) en some_function(niet_ondersteund_item2) en ...
" kan worden geëvalueerd tot een bekend resultaat ('0' of "OK").Onbekend
.Onbekend
en neemt deze deel als onbekende operand in verdere uitdrukkingsbeoordeling.Merk op dat onbekende operanden alleen in logische expressies kunnen "verdwijnen", zoals hierboven beschreven. In aritmetische expressies 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 tot Onbekend
en dat verandert de triggertoestand niet.
Als een triggertekst met meerdere niet-ondersteunde items wordt geëvalueerd tot Onbekend
, verwijst het foutbericht in de frontend naar het laatste geëvalueerde niet-ondersteunde item.