This is a translation of the original English documentation page. Help us make it better.

2 Окидач израз

Преглед

Изрази који се користе у тригерима су веома флексибилни. Можете их користити за креирање сложених логичких тестова у вези са праћеном статистиком.

Једноставан израз користи функцију која се примењује на ставку са неким параметрима. Функција враћа резултат који се упоређује са прагом, користећи оператор и константу.

Синтакса једноставног корисног израза је function(/host/key,parameter)<operator><constant>.

На пример:

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

ће се покренути ако је број примљених бајтова током последњих пет минута увек био преко 100 килобајта.

Иако је синтакса потпуно иста, са функционалне тачке гледишта постоје две врсте израза за окидање:

  • израз проблема - дефинише услове проблема
  • израз за опоравак (опционо) - дефинише додатне услове решавања проблема

Када се дефинише само израз проблема, овај израз ће се користити и као праг проблема и као праг за опоравак проблема. Чим се израз проблема процени као ТАЧНО, постоји проблем. Чим се израз проблема процени као НЕТАЧНО, проблем је решен.

Када се дефинишу и израз проблема и додатни израз за опоравак, решавање проблема постаје сложеније: не само да израз проблема мора бити НЕТАЧАН, већ и израз за опоравак мора бити ТАЧАН. Ово је корисно за креирање hysteresis и избегавање клацања окидача.

Непродуктивно је користити макро {TRIGGER.VALUE} у изразу за опоравак јер се овај израз процењује само када је окидач у стању "Проблем". Сходно томе, {TRIGGER.VALUE} ће увек бити "1" (што указује на стање "Проблем") приликом извршавања израза.

Функције

Функције омогућавају израчунавање прикупљених вредности (просечне, минималне, максимум, збир), пронађите низове, референтно тренутно време и друге факторе.

Комплетна листа подржаних функција је доступан.

Функције обично враћају нумеричке вредности за поређење. Приликом повратка стрингове, поређење је могуће са = и <> оператори (погледајте пример).

Параметри функције

Параметри функције омогућавају да се наведе:

  • домаћин и кључ ставке (функције које се односе само на историју ставке домаћина)
  • параметри специфични за функцију
  • други изрази (није доступно за функције које упућују на домаћину историја ставке, погледајте други изрази за примери)

Кључ домаћина и ставке може се навести као /host/key.
Ако је домаћин изостављен (нпр. као у function(//key,parameter,...)), функција ће референцирати тренутног домаћина.
Референцирана ставка мора бити у подржаном стању (осим за функцију nodata(), која се израчунава и за неподржане ставке).

Док су други изрази окидача као параметри функције ограничени на функције које нису историјске у окидачима, ово ограничење се не примењује на израчунате ставке.

Параметри специфични за функцију

Параметри специфични за функцију се налазе после кључа ставке и одвојени су од кључа ставке зарезом. Погледајте подржане функције за комплетну листу ових параметара.

Већина нумеричких функција прихвата време као параметар. Можете користити секунде или временске суфиксе да бисте означили време. Претходи му знак хеш, параметар има другачије значење:

Expression Description
sum(/host/key,10m) Збир вредности у последњих 10 минута.
sum(/host/key,#10) Збир последњих десет вредности.

Параметри са ознаком хеш имају другачије значење са функцијом last - они означавају N-ту претходну вредност, тако да су за вредности 30, 70, 20, 60, 50 (од најновије до најмање скорије):

  • last(/host/key,#2) би вратило '70'
  • last(/host/key,#5) би вратило '50'
Временски помак

Опциони временски помак је подржан са временом или бројачем вредности као параметром функције. Овај параметар омогућава референцирање података из временског периода у прошлости.

Временски помак почиње са now - што одређује тренутно време, а затим следи +N<time unit> или -N<time unit> - за додавање или одузимање N временских јединица.

На пример, avg(/host/key,1h:now-1d) ће вратити просечну вредност за сат времена пре једног дана.

Временски помак наведен у месецима (M) и годинама (y) је подржан само за функције тренда. Друге функције подржавају секунде (s), минуте (m), сате (h), дане (d) и недеље (w).

Временски помак са апсолутним временским периодима

Апсолутни временски периоди су подржани у параметру временског помака, на пример, од поноћи до поноћи за дан, понедељак-недеља за недељу дана, први дан-последњи дан у месецу за месец.

Временски помак за апсолутне временске периоде почиње са now - што одређује тренутно време, а затим следи било који број временских операција: /<time unit> - дефинише почетак и крај временске јединице, на пример, од поноћи до поноћи за дан, +N<time unit> или -N<time unit> - за додавање или одузимање N временских јединица.

Имајте на уму да вредност временског помака може бити већа или једнака 0, док је минимална вредност временског периода 1.

Parameter Description
1d:now/d Yesterday
1d:now/d+1d Today
2d:now/d+1d Last 2 days
1w:now/w Last week
1w:now/w+1w This week
Други изрази

Параметри функције могу садржати друге изразе, као у наставку синтакса:

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

Имајте на уму да се други изрази не могу користити ако се функција позива историја ставке. На пример, следећа синтакса није дозвољена:

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

Operators

The following operators are supported for triggers (in descending priority of execution):

Priority Operator Definition Notes for unknown values Force cast operand to float 1
1 - Unary minus -Unknown → Unknown Yes
2 not Logical NOT not Unknown → Unknown Yes
3 * Multiplication 0 * Unknown → Unknown
(yes, Unknown, not 0 - to not lose
Unknown in arithmetic operations)
1.2 * Unknown → Unknown
Yes
/ Division Unknown / 0 → error
Unknown / 1.2 → Unknown
0.0 / Unknown → Unknown
Yes
4 + Arithmetical plus 1.2 + Unknown → Unknown Yes
- Arithmetical minus 1.2 - Unknown → Unknown Yes
5 < Less than. The operator is defined as:

A<B ⇔ (A<B-0.000001)
1.2 < Unknown → Unknown Yes
<= Less than or equal to. The operator is defined as:

A<=B ⇔ (A≤B+0.000001)
Unknown <= Unknown → Unknown Yes
> More than. The operator is defined as:

A>B ⇔ (A>B+0.000001)
Yes
>= More than or equal to. The operator is defined as:

A>=B ⇔ (A≥B-0.000001)
Yes
6 = Is equal. The operator is defined as:

A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001)
No 1
<> Not equal. The operator is defined as:

A<>B ⇔ (A<B-0.000001) or (A>B+0.000001)
No 1
7 and Logical AND 0 and Unknown → 0
1 and Unknown → Unknown
Unknown and Unknown → Unknown
Yes
8 or Logical OR 1 or Unknown → 1
0 or Unknown → Unknown
Unknown or Unknown → Unknown
Yes

1 String operand is still cast to numeric if:

  • another operand is numeric
  • operator other than = or <> is used on an operand

(If the cast fails - numeric operand is cast to a string operand and both operands get compared as strings.)

not, and and or operators are case-sensitive and must be in lowercase. They also must be surrounded by spaces or parentheses.

All operators, except unary - and not, have left-to-right associativity. Unary - and not are non-associative (meaning -(-1) and not (not 1) should be used instead of --1 and not not 1).

Evaluation result:

  • <, <=, >, >=, =, <> operators shall yield '1' in the trigger expression if the specified relation is true and '0' if it is false. If at least one operand is Unknown the result is Unknown;
  • and for known operands shall yield '1' if both of its operands compare unequal to '0'; otherwise, it yields '0'; for unknown operands and yields '0' only if one operand compares equal to '0'; otherwise, it yields 'Unknown';
  • or for known operands shall yield '1' if either of its operands compare unequal to '0'; otherwise, it yields '0'; for unknown operands or yields '1' only if one operand compares unequal to '0'; otherwise, it yields 'Unknown';
  • The result of the logical negation operator not for a known operand is '0' if the value of its operand compares unequal to '0'; '1' if the value of its operand compares equal to '0'. For unknown operand not yields 'Unknown'.

Value caching

Values required for trigger evaluation are cached by Zabbix server. Because of this trigger evaluation causes a higher database load for some time after the server restarts. The value cache is not cleared when item history values are removed (either manually or by housekeeper), so the server will use the cached values until they are older than the time periods defined in trigger functions or server is restarted.

If there is no recent data in the cache and there is no defined querying period in the function, Zabbix will by default go as far back in the past as one week to query the database for historical values.

Примери окидача

Пример 1

Оптерећење процесора је превисоко на Zabbix серверу.

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

Коришћењем функције 'last()', позивамо се на најновије вредност. /Zabbix server/system.cpu.load[all,avg1] даје кратко име праћени параметар. Наводи да је домаћин 'Zabbix сервер' а кључ који се надгледа је 'system.cpu.load[all,avg1]'. коначно, >5 значи да је окидач у стању ПРОБЛЕМ кад год је највише недавно мерење оптерећења процесора са Zabbix сервера је веће од 5.

Пример 2

www.example.com је преоптерећен.

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

Израз је тачан када је или тренутно оптерећење процесора веће од 5 или је оптерећење процесора било више од 2 током последњих 10 минута.

Пример 3

/etc/passwd је промењен.

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

Израз је истинит када је претходна вредност /etc/passwd контролне суме разликује од најновијег.

Слични изрази могу бити корисни за праћење промена у важним датотеке, као што су /etc/passwd, /etc/inetd.conf, /kernel, итд.

Пример 4

Неко преузима велику датотеку са Интернета.

Употреба функције мин:

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

Израз је тачан када је број примљених бајтова на eth0 већи од 100 KB у последњих 5 минута.

Пример 5

Оба чвора кластеризованог SMTP сервера не раде.

Обратите пажњу на употребу два различита домаћина у једном изразу:

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

Израз је тачан када су оба SMTP сервера искључена на оба smtp1.example.com и smtp2.example.com.

Пример 6

Zabbix агент треба да се надогради.

Употреба функције find():

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

Израз је тачан ако Zabbix агент има верзију beta8.

Пример 7

Сервер је недоступан.

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

Израз је тачан ако је домаћин "example.example.com" недоступнији него 5 пута у последњих 30 минута.

Пример 8

Нема откуцаја срца у последња 3 минута.

Употреба функције nodata():

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

Да бисте користили овај окидач, 'tick' мора бити дефинисан као Zabbix trapper ставка. Домаћин би требао периодично шаљите податке за ову ставку користећи zabbix_sender. Ако нема података примљено у року од 180 секунди, вредност окидача постаје ПРОБЛЕМ.

Напомена да се 'nodata' може користити за било који тип ставке.

Пример 9

Активност CPU-а ноћу.

Употреба функције time():

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

Окидач може променити своје стање у проблем само ноћу (00:00 - 06:00).

Пример 10

Активност CPU-а у било ком тренутку са изузетком.

Употреба функције time() и оператора не:

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

Окидач може променити своје стање у проблем у било ком тренутку, осим 2 сата на недељној промени (недеља, 23:00 - понедељак, 01:00).

Пример 11

Проверите да ли је локално време клијента синхронизовано са временом Zabbix сервера.

Употреба функције fuzzytime():

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

Окидач ће се променити у стање проблема у случају да је укључено локално време сервер MySQL_DB и Zabbix сервер се разликују за више од 10 секунди. Напомена тај 'system.localtime' мора бити конфигурисан као пасивни провера.

Пример 12

Поређење просечног оптерећења данас са просечним оптерећењем у исто време јуче (користећи временски помак као now-1d).

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

Окидач ће се активирати ако је просечно оптерећење последњег сата изнад просечно оптерећење истог сата јуче више од два пута.

Пример 13

Коришћење вредности друге ставке за добијање прага окидача:

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

Окидач ће се покренути ако бесплатно складиште падне испод 10 процената.

Пример 14

Коришћење резултата евалуације да бисте добили прекорачење броја окидача праг:

(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

Окидач ће се покренути ако су најмање два окидача у изразу су у проблематичном стању.

Пример 15

Поређење вредности низа две ставке – операнди су функције које повратни низови.

Проблем: креирајте упозорење ако се верзија Ubuntu разликује на другој домаћини

last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
Пример 16

Упоређивање две вредности низа - операнди су:

  • функција која враћа стринг
  • комбинација макроа и низова

Проблем: откријте промене у DNS упиту

Кључ ставке је:

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

са макроима дефинисаним као

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

и обично враћа:

example.com  MX  0 mail.example.com

Дакле, наш израз окидача за откривање да ли је резултат DNS упита одступио од очекиваног резултата је:

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

Обратите пажњу на наводнике око другог операнда.

Пример 17

Упоређивање две вредности низа - операнди су:

  • функција која враћа стринг
  • константа стринга са специјалним знаковима \ и "

Проблем: откријте да ли је садржај датотеке /tmp/hello једнак:

\" //hello ?\"

Опција 1) директно напишите стринг

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

Обратите пажњу на то како се знакови \ и " избегавају када се стринг упореди директно.

Опција 2) користите макро

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

у изразу:

last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Пример 18

Поређење дугорочних периода.

Проблем: Оптерећење Exchange сервера је порасло за више од 10% прошлог месеца

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

Такође можете користити Догађај име поље у окидачу конфигурацију за прављење значајне поруке упозорења, на пример за примити нешто као

"Load of Exchange server increased by 24% in July (0.69) comparing to June (0.56)"

назив догађаја мора бити дефинисан као:

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)})

Такође је корисно дозволити ручно затварање у конфигурацији окидача за ова врста проблема.

Имате ли пример израза окидача који би могао бити користан другима? Користите Формулар предлога да га пошаљете Zabbix програмерима.

Хистереза

Понекад је потребан интервал између стања проблема и стања опоравка, уместо једноставног прага. На пример, ако желимо да дефинишемо окидач који пријављује проблем када температура у серверској соби пређе 20°C и желимо да остане у стању проблема док температура не падне испод 15°C, једноставан праг окидача на 20°C неће бити довољан.

Уместо тога, прво морамо дефинисати израз окидача за проблемски догађај (температура изнад 20°C). Затим морамо дефинисати додатни услов опоравка (температура испод 15°C). То се ради дефинисањем додатног параметра Израз опоравка приликом дефинисања окидача.

У овом случају, решавање проблема ће се одвијати у два корака:

  • Прво, израз проблема (температура изнад 20°C) ће морати да се процени као НЕТАЧАН
  • Друго, израз опоравка (температура испод 15°C) ће морати да се процени као ТАЧАН

Израз опоравка ће бити процењен само када се проблемски догађај прво реши.

Само чињеница да је израз опоравка ТАЧАН не решава проблем ако је израз проблема и даље ТАЧАН!

Пример 1

Температура у серверској просторији је превисока.

Израз проблема:

last(/server/temp)>20

Израз за опоравак:

last(/server/temp)<=15
Пример 2

Слободног простора на диску је премало.

Израз проблема: то је мање од 10GB за последњих 5 минута

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

Израз за опоравак: то је више од 40GB за последњих 10 минута

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

Изрази са непознатим операндима

Генерално, непознати операнд (као што је неподржана ставка) у изразу ће одмах приказати вредност окидача као Непознато.

Међутим, у неким случајевима непознати операнди (неподржане ставке, грешке функција) се дозвољавају у израчунавање израза:

  • Функција nodata() се израчунава без обзира на то да ли је референцирана ставка подржана или не.
  • Логички изрази са ИЛИ и И могу се проценити у познате вредности у два случаја, без обзира на непознате операндове:
  • Case 1: "1 или нека_функција(unsupported_item1) или нека_функција(unsupported_item2) или ..." може се проценити у познати резултат ('1' или "Проблем"),
  • Case 2: "0 и нека_функција(unsupported_item1) и нека_функција(unsupported_item2) и ..." могу се проценити у познати резултат ('0' или "У реду").
    Zabbix покушава да процени такве логичке изразе узимајући неподржане ставке као непознате операндове. У два горе наведена случаја биће произведена позната вредност ("Проблем" или "У реду", респективно); у свим осталим случајевима окидач ће се проценити као Непознато.
  • Ако процена функције за подржани елемент резултира грешком, вредност функције постаје Непознато и учествује као непознати операнд у даљој процени израза.

Имајте на уму да непознати операнди могу "нестати" само у логичким изразима као што је горе описано. У аритметичким изразима непознати операнди увек воде до резултата Непознато (осим дељења са 0).

Израз који резултира са Непознато не мења стање окидача ("Проблем/У реду"). Дакле, ако је био "Проблем" (видети Случај 1), остаје у истом стању проблема чак и ако је познати део решен ('1' постаје '0'), јер се израз сада евалуира као Непознато и то не мења стање окидача.

Ако се израз окидача са неколико неподржаних елемената евалуира као Непознато, порука о грешци у корисничком интерфејсу се односи на последњи неподржани евалуирани елемент.