Áú»¢¶Ä²©

2 Express?es de Trigger

Vis?o geral

As express?es de triggers s?o muito flex¨ªveis. Voc¨º pode utiliza-las para criar testes com l¨®gicas complexas em rela??o a dados e estat¨ªsticas da monitora??o.

A sintaxe b¨¢sica de uma express?o pode ser definida assim:

{<server>:<key>.<function>(<parameter>)}<operator><constant>

1 Fun??es

As fun??es de Trigger permitem referenciar dados coletados, hor¨¢rio atual e outros fatores.

Uma lista completa das fun??es suportadas est¨¢ dispon¨ªvel.

2 Par?metros das fun??es

A maioria das fun??es num¨¦ricas aceita uma quantidade de segundos como par?metro (uma unidade de tempo).

Voc¨º pode utilizar o prefixo # para especificar um par?metro com significado diferente:

Chamada da Fun??o Significa
sum(600) Sumariza??o de todos os valores nos ¨²ltimos 600 segundos (10 minutos)
sum(#5) Sumariza??o dos ¨²ltimos 5 valores

A fun??o last utiliza uma forma diferente para valores prefixados com #, para ela isso indicar¨¢ que ela dever¨¢ recuperar o en¨¦zimo valor anterior (do mais recente para o mais antigo). Exemplo, suponhamos que os ¨²ltimos 10 valores coletados s?o: (2, 3, 4, 9, 10, 11, 11, 16, 7, 0)

  • last(#2) - ir¨¢ retornar o pen¨²ltimo valor 7
  • last(#5) - ir¨¢ retornar 10.

As fun??es avg, count, last, min e max possuem um par?metro adicional: o time_shift. Este par?metro permite referenciar o dado em determinado per¨ªodo de tempo no passado. Por exemplo, avg(1h,1d) ir¨¢ retornar o valor m¨¦dio analisando 1 hora de valores de 1 dia antes do momento da coleta.

As triggers s¨® analisam os dados que est?o no hist¨®rico. Se o dado desejado n?o estiver no hist¨®rico, mas estiver nas m¨¦dias, a informa??o das m¨¦dias n?o ser¨¢ utilizada. Logo, ¨¦ necess¨¢rio que se mantenha o hist¨®rico por tempo compat¨ªvel com as triggers que se deseja criar.

Voc¨º pode utilizar os s¨ªmbolos de unidades nas express?es, por exemplo '5m' (minutos) ao inv¨¦s de '300' segundos ou '1d' (dia) ao inv¨¦s de '86400' segundos, '1K' ao inv¨¦s de '1024' bytes.

3 Operadores

Os seguintes operadores s?o suportados nas express?es de triggers (em ordem descedente de prioridade de execu??o):

Prioridade Operador Defini??o
1 - S¨ªmbolo de negativo
2 not N?o L¨®gico
3 *** |Multiplica??o | | |/** Divis?o
4 + Soma aritm¨¦tica
- Redu??o aritm¨¦tica
5 < Menor que. O operador ¨¦ definido como:
A<B ? (A<=B-0.000001)
<= Menor ou igual a.
> Maior que. O operador ¨¦ definido como:
A>B ? (A>=B+0.000001)
>= Maior ou igual a.
6 = ? igual. O operador ¨¦ definido como:
A=B ? (A>B-0.000001) e (A<B+0.000001)
<> Diferente. O operador ¨¦ definido comoas:
A<>B ? (A<=B-0.000001) ou (A>=B+0.000001)
7 and Operador l¨®gico E
8 or Operador l¨®gico OU

Os operadores not, and e or s?o sens¨ªveis ao caso e dever?o ser escritos em letra min¨²scula. Eles devem estar envoltos em espa?os ou par¨ºnteses.

Todos os operadores, exceto o "S¨ªmbolo de negativo" e "N?o l¨®gico", tem associa??o da esquerda para a direita.

4 Exemplos de triggers

Exemplo 1

An¨¢lise de carga de processamento na CPU: "Processor load is too high on www.zabbix.com"

{www.zabbix.com:system.cpu.load[all,avg1].last()}>5

'www.zabbix.com:system.cpu.load[all,avg1]' prov¨º um nome curto para o par?metro monitorado. Neste caso se refere ao host 'www.zabbix.com' com a chave 'system.cpu.load[all,avg1]'. Utilizando a fun??o 'last()', n¨®s estaremos referindo ao valor mais recente. Finalmente, '>5' define que a trigger dever¨¢ ir para o estado de "INCIDENTE" quando o valor mais recente desta chave, neste host for superior a 5.

Exemplo 2

www.zabbix.com is overloaded

{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 ou {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2 

A express?o ser¨¢ verdadeira quando o ¨²ltimo valor coletado para a carga da CPU for superior a 5 ou superior a 2 nos ¨²ltimos 10 coletados.

Exemplo 3

/etc/passwd has been changed

Utilize a fun??o 'diff()':

{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff()}=1

A express?o ser¨¢ verdadeira quando o ¨²ltimo valor da verifica??o 'checksum' do arquivo '/etc/passwd' for diferente da pen¨²ltima verifica??o.

De forma similar esta t¨¦cnica pode ser utilizada para monitorar v¨¢rios outros arquivos, tais quais: /etc/inetd.conf, /kernel, etc.

Exemplo 4

Algu¨¦m est¨¢ baixando um arquivo muito grande da internet (ou um tr¨¢fego intenso por um longo per¨ªodo)

Utilize a fun??o 'min()':

{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K

A express?o ser¨¢ verdadeira quando a quantidade de bytes recebidos nos ¨²ltimos 5 minutos na interface 'eth0' for superior a 100 KB.

Exemplo 5

Ambos os n¨®s do cluster de SMTP est?o indispon¨ªveis

Observe que a express?o utiliza dados de dois hosts diferentes:

{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0 and {smtp2.zabbix.com:net.tcp.service[smtp].last()}=0

A express?o ser¨¢ verdadeira quando ambos os servidores (smtp1.zabbix.com e smtp2.zabbix.com) SMTP estiverem fora do ar.

Exemplo 6

A vers?o do Áú»¢¶Ä²© Agent precisa ser atualizada

Use a fun??o 'str()':

{zabbix.zabbix.com:agent.version.str("beta8")}=1

A express?o ser¨¢ verdadeira se a vers?o do Áú»¢¶Ä²© Agent possuir o texto "beta8" (por exemplo 1.0beta8).

Exemplo 7

Servidor indispon¨ªvel

{zabbix.zabbix.com:icmpping.count(30m,0)}>5

A express?o ser¨¢ verdadeira se o host "zabbix.zabbix.com" estiver inacess¨ªvel por mais de 5 vezes nos ¨²ltimos 30 minutos.

Exemplo 8

Sem dados nos ¨²ltimos 3 minutos

Use a fun??o 'nodata()':

{zabbix.zabbix.com:tick.nodata(3m)}=1

Neste exemplo 'tick' ¨¦ um item do tipo 'Áú»¢¶Ä²© trapper'. Para que esta trigger funcione o item 'tick' precisar¨¢ ter sido definido. O host precisar¨¢ enviar periodicamente o dado para este item atrav¨¦s do comando 'zabbix_sender' ou similar.

A express?o ser¨¢ verdadeira se nenhum dado for recebido nos ¨²ltimos 180 segundos.

Exemplo 9

Alta carga de CPU no per¨ªodo noturno

Utilize a fun??o 'time()':

{zabbix:system.cpu.load[all,avg1].min(5m)}>2 and {zabbix:system.cpu.load[all,avg1].time()}>000000 and {zabbix:system.cpu.load[all,avg1].time()}<060000

A express?o ser¨¢ verdadeira se a carga de CPU for superior a 2, entre a meia noite e as seis da manh?.

Exemplo 10

Verifica se o hor¨¢rio local do host monitorado e do servidor do Áú»¢¶Ä²© est?o sincronizados

Use a fun??o 'fuzzytime()':

{MySQL_DB:system.localtime.fuzzytime(10)}=0

A express?o ser¨¢ verdadeira se o hor¨¢rio do servidor 'MySQL_DB' tiver uma diferen?a maior que 10 segundos em rela??o ao hor¨¢rio do Áú»¢¶Ä²© Server.

Exemplo 11

Comparando a carga atual de CPU com a carga no mesmo hor¨¢rio do dia anterior (usando o par?metro de time_shift).

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

A express?o ser¨¢ verdadeira se a carga da ¨²ltima hora for duas vezes superior a carga deste mesmo per¨ªodo um dia antes (24 horas).

Exemplo 12

Usando o valor de outro item como limite para a trigger:

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

A express?o ser¨¢ verdadeira se o espa?o livre for inferior a 10%.

5 T¨¦cnicas 'anti-flapping'

Algumas vezes voc¨º precisa ter condi??es diferentes para estados diferentes (INCIDENTE/OK). Por exemplo, n¨®s podemos ter que definir uma trigger para avisar quando a temperatura de uma sala for superior a 20C (vinte graus) que ¨¦ o m¨¢ximo suport¨¢vel para os servidores funcionarem com seguran?a, mas a temperatura ideal de funcionamento deveria ser de at¨¦ 15C (quinze graus). Temos como definir uma trigger desta forma no Áú»¢¶Ä²©, ela ser¨¢ ativada (mudar para o estado de INCIDENTE) se a temperatura ultrapassar o m¨¢ximo aceit¨¢vel, mas n?o ser¨¢ inativada (retornar ao estado OK) enquanto a temperatura n?o for inferior ¨¤ temperatura ideal.

Para fazer isso podemos definir uma trigger como a do "Exemplo 1". A trigger do "Exemplo 2" apresenta a mesma t¨¦cnica de "anti-flapping" para espa?o em disco.

Exemplo 1

A temperatura na sala dos servidores est¨¢ muito alta

({TRIGGER.VALUE}=0 and {server:temp.last()}>20) or
       ({TRIGGER.VALUE}=1 and {server:temp.last()}>15)
Exemplo 2

Pouco espa?o livre no disco

Incidente: se for menor que 10GB nos ¨²ltimos 5 minutos

Recupera??o (OK): se for maior que 40GB nos ¨²ltimos 10 minutos

({TRIGGER.VALUE}=0 and {server:vfs.fs.size[/,free].max(5m)}<10G) or
       ({TRIGGER.VALUE}=1 and {server:vfs.fs.size[/,free].min(10m)}<40G)

Observe que a macro {TRIGGER.VALUE} retorna o estado corrente da trigger (0 - OK, 1 - Incidente).