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

Преглед

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

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

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

На пример:

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

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

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

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

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

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

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

Функције

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

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

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

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

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

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

Кључ домаћина и ставке може се навести као /host/key.
Изостављање имена домаћина у првом параметру (тј. као у function(//key,parameter,...)) је подржано само у одређеним контекстима:

  • У формули израчунатих ставки
  • У макроима израза, који се могу користити у:

У овим контекстима можете користити и Макро {HOST.HOST}. {HOST.HOST<1-9>} би се могао користити у случају поља Назив догађаја и елемента мапе "Окидач" за референцирање на одређену ставку у изразу окидача. Када се име домаћина изостави или замени са {HOST.HOST} у овим контекстима, референца указује на прву ставку у изразу окидача или на прву ставку на графикону. Ван ових подржаних контекста, изостављање имена домаћина у изразима окидача резултираће грешком. Погледајте Пример 18 за илустрацију употребе двоструке косе црте у макроима за назив догађаја.

Референцирана ставка мора бити у подржаном стању (осим за функцију 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 Јуче
1d:now/d+1d Данас
2d:now/d+1d Последња 2 дана
1w:now/w Прошле седмице
1w:now/w+1w Ове седмице
Други изрази

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

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

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

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

Оператори

Следећи оператори су подржани за окидаче (у опадајућем приоритету извршења):

Priority Operator Definition Напомене за непознате вредности Принудно пребачени операнд у float 1
1 - Унарни минус -Непознато → Непознато Да
2 не Логичко НЕ не Непознато → Непознато Да
3 * Множење 0 * Непознато → Непознато
(да, Непознато, не 0 - да се не изгуби
Непознато у аритметичким операцијама)<br >1.2 * Непознато → Непознато
Да
/ Дељење Непознато / 0 → грешка
Непознато / 1.2 → Непознато
0.0 / Непознато → Непознато
Да
4 + Аритметички плус 1.2 + Непознато → Непознато Да
- Аритметички минус 1.2 - Непознато → Непознато Да
5 < Мање од. Оператор је дефинисан као:

А<B ⇔ (А<B-0.000001)
1.2 < Непознато → Непознато Да
<= Мање или једнако. Оператор је дефинисан као:

А<=B ⇔ (А≤B+0.000001)
Непознато <= Непознато → Непознато Да
> Више од. Оператор је дефинисан као:

А>B ⇔ (А>B+0.000001)
Да
>= Више од или једнако. Оператор је дефинисан као:

А>=B ⇔ (А≥B-0.000001)
Да
6 = Је једнако. Оператор је дефинисан као:

А=B ⇔ (А≥B-0.000001) и (А≤B+0.000001)
Не 1
<> Није једнако. Оператор је дефинисан као:

А<>B ⇔ (А<B-0.000001) или (А>B+0.000001)
Не 1
7 и Логичко И 0 и Непознато → 0
1 и Непознато → Непознато
Непознато и Непознато → Непознато
Да
8 или Логичко ИЛИ 1 или Непознато → 1
0 или Непознато → Непознато
Непознато или Непознато → Непознато
Да

1 Операнд стринга се и даље претвара у нумерички ако:

  • други операнд је нумерички
  • оператор који није = или <> се користи за операнд

(Ако пребацивање не успе - нумерички операнд се пребацује на стринг операнд и оба операнда се пореде као стрингови.)

Оператори not, and и or разликују велика и мала слова и морају бити малим словаим. Они такође морају бити окружени размацима или заградама.

Сви оператори, осим унарног - и not, имају слева надесно асоцијативност. Унарни - и not су неасоцијативни (значење -(-1) и not (not 1) треба користити уместо --1 и not not 1).

Резултат евалуације:

  • <, <=, >, >=, =, <> оператори ће дати '1' у изразу окидача ако је наведена релација тачна и '0' ако је нетачна. Ако је бар један операнд Непознат резултат је Непознат;
  • and за познате операнде ће дати '1' ако су оба његова операнда неједнака '0'; иначе, даје '0'; за непознате операнде and даје '0' само ако је један операнд једнак '0'; у супротном, се добија 'Unknown';
  • or за познате операнде ће дати '1' ако је бар један од његових операнда неједнак '0'; иначе, даје '0'; за непознате операнде or даје '1' само ако је један операнд неједнак '0'; у супротном, добија се 'Unknown';
  • Резултат оператора логичке негације not за познати операнд је '0' ако је вредност његовог операнда неједнака '0'; '1' ако је вредност његовог операнда једнака '0'. За непознати операнд ** not** даје 'Unknown'.

Кеширање вредности

Вредности потребне за процену окидача кешира Zabbix сервер. Због тога, процена окидача узрокује веће оптерећење базе података неко време након поновног покретања сервера. Кеш вредности се не брише када се вредности историје ставки уклоне (ручно или од стране housekeeper-а), тако да ће сервер користити кеширане вредности док не буду старије од временских периода дефинисаних у функцијама окидача или док се сервер поново не покрене.

Ако нема скорашњих података у кешу и нема дефинисаног периода упита у функцији, Zabbix ће подразумевано отићи у прошлост до једне недеље да би упитао базу података за историјске вредности.

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

Пример 1

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

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

Коришћењем функције 'last()', позивамо се на најновију вредност. /Zabbix server/system.cpu.load[all,avg1] даје кратак назив праћеног параметра. Одређује да је домаћин 'Zabbix server' и да је кључ који се прати '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:

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трапер ставка. Домаћин треба периодично да шаље податке за ову ставку користећи 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.comMX0 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 ?\"
       ```Option
       
       Опција 1) директно напишите стринг
       
       ```default
       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

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

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

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

  • Функција nodata() се процењује без обзира на то да ли је референтна ставка подржана или не.
  • Логички изрази са ИЛИ и И могу се проценити на познате вредности у два случаја без обзира на непознате операнде:
    • Случај 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' или "ОК").
      Zabbix покушава да процени такве логичке изразе узимајући неподржане ставке као непознате операнде. У два горња случаја биће произведена позната вредност ("Проблем" или "ОК", респективно); у свим осталим случајевима окидач ће бити процењен на Unknown.
  • Ако евалуација функције за подржану ставку резултира грешком, вредност функције постаје Unknown и учествује као непознати операнд у даљем вредновању израза.

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

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

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