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:
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.
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)
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.
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.
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]' 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.
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.
/etc/passwd has been changed
Utilize a fun??o 'diff()':
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.
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()':
A express?o ser¨¢ verdadeira quando a quantidade de bytes recebidos nos ¨²ltimos 5 minutos na interface 'eth0' for superior a 100 KB.
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.
A vers?o do Áú»¢¶Ä²© Agent precisa ser atualizada
Use a fun??o 'str()':
A express?o ser¨¢ verdadeira se a vers?o do Áú»¢¶Ä²© Agent possuir o texto "beta8" (por exemplo 1.0beta8).
Servidor indispon¨ªvel
A express?o ser¨¢ verdadeira se o host "zabbix.zabbix.com" estiver inacess¨ªvel por mais de 5 vezes nos ¨²ltimos 30 minutos.
Sem dados nos ¨²ltimos 3 minutos
Use a fun??o 'nodata()':
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.
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?.
Verifica se o hor¨¢rio local do host monitorado e do servidor do Áú»¢¶Ä²© est?o sincronizados
Use a fun??o 'fuzzytime()':
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.
Comparando a carga atual de CPU com a carga no mesmo hor¨¢rio do dia anterior (usando o par?metro de time_shift
).
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).
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%.
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.
A temperatura na sala dos servidores est¨¢ muito alta
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).