Você está visualizando a documentação da versão de desenvolvimento, que pode estar incompleta.
Esta página foi traduzida automaticamente. Se você notar um erro, selecione-o e pressione Ctrl+Enter para reportá-lo aos editores.

2 Expressão de trigger

Visão geral

As expressões usadas em triggers são muito flexíveis. Você pode usá-las para criar testes lógicos complexos em relação às estatísticas monitoradas.

Uma expressão simples usa uma função que é aplicada ao item com alguns parâmetros. A função retorna um resultado que é comparado ao limite, usando um operador e uma constante.

A sintaxe de uma expressão simples e útil é function(/host/key,parameter)<operator><constant>.

Por exemplo:

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

será acionado se o número de bytes recebidos durante os últimos cinco minutos estiver sempre acima de 100 kilobytes.

Embora a sintaxe seja exatamente a mesma, do ponto de vista funcional existem dois tipos de expressões de trigger:

  • expressão de problema - define as condições do problema
  • expressão de recuperação (opcional) - define condições adicionais para a resolução do problema

Ao definir apenas uma expressão de problema, essa expressão será usada tanto como o limite do problema quanto como o limite de recuperação do problema. Assim que a expressão de problema for avaliada como VERDADEIRA, há um problema. Assim que a expressão de problema for avaliada como FALSA, o problema é resolvido.

Ao definir tanto a expressão de problema quanto a expressão de recuperação suplementar, a resolução do problema se torna mais complexa: não apenas a expressão de problema deve ser FALSA, mas também a expressão de recuperação deve ser VERDADEIRA. Isso é útil para criar histerese e evitar oscilações do trigger.

É improdutivo usar a macro {TRIGGER.VALUE} em uma expressão de recuperação porque essa expressão só é avaliada quando o trigger está no estado "Problema". Consequentemente, {TRIGGER.VALUE} sempre será resolvido como "1" (que indica um estado de "Problema") ao avaliar a expressão.

Funções

As funções permitem calcular os valores coletados (média, mínimo, máximo, soma), localizar strings, referenciar o tempo atual e outros fatores.

Uma lista completa das funções suportadas está disponível.

Normalmente, as funções retornam valores numéricos para comparação. Ao retornar strings, a comparação é possível com os operadores = e <> (veja o exemplo).

Parâmetros da função

Os parâmetros da função permitem especificar:

  • host e chave do item (funções que referenciam apenas o histórico do item do host)
  • parâmetros específicos da função
  • outras expressões (não disponível para funções que referenciam apenas o histórico do item do host, veja outras expressões para exemplos)

O host e a chave do item podem ser especificados como /host/chave.
A omissão do nome do host no primeiro parâmetro (ou seja, como em function(//chave,parâmetro,...)) só é suportada em certos contextos:

  • Na fórmula de itens calculados
  • Em macros de expressão, que podem ser usadas em:

Nesses contextos, você também pode usar a macro {HOST.HOST}. {HOST.HOST<1-9>} pode ser usada no caso do campo Nome do evento e do elemento de mapa "Trigger" para se referir a um item específico na expressão do trigger. Quando o nome do host é omitido ou substituído por {HOST.HOST} nesses contextos, a referência aponta para o primeiro item na expressão do trigger ou para o primeiro item no gráfico. Fora desses contextos suportados, omitir o nome do host em expressões de trigger resultará em erro. Veja o Exemplo 18 para uma ilustração do uso da barra dupla em macros de Nome do evento.

O item referenciado deve estar em um estado suportado (exceto para a função nodata(), que também é calculada para itens não suportados).

Enquanto outras expressões de trigger como parâmetros de função são limitadas a funções que não usam histórico em triggers, essa limitação não se aplica em itens calculados.

Parâmetros específicos da função

Os parâmetros específicos da função são colocados após a chave do item e são separados da chave do item por uma vírgula. Veja as funções suportadas para uma lista completa desses parâmetros.

A maioria das funções numéricas aceita tempo como parâmetro. Você pode usar segundos ou sufixos de tempo para indicar o tempo. Precedido por um sinal de cerquilha, o parâmetro tem um significado diferente:

Expressão Descrição
sum(/host/key,10m) Soma dos valores nos últimos 10 minutos.
sum(/host/key,#10) Soma dos últimos dez valores.

Parâmetros com um sinal de cerquilha têm um significado diferente com a função last - eles denotam o N-ésimo valor anterior, então, dados os valores 30, 70, 20, 60, 50 (do mais recente para o menos recente):

  • last(/host/key,#2) retornaria '70'
  • last(/host/key,#5) retornaria '50'
Deslocamento de tempo

Um deslocamento de tempo opcional é suportado com tempo ou contagem de valores como parâmetro da função. Esse parâmetro permite referenciar dados de um período de tempo no passado.

O deslocamento de tempo começa com now - especificando o tempo atual, e é seguido por +N<unidade de tempo> ou -N<unidade de tempo> - para adicionar ou subtrair N unidades de tempo.

Por exemplo, avg(/host/key,1h:now-1d) retornará o valor médio de uma hora há um dia atrás.

O deslocamento de tempo especificado em meses (M) e anos (y) é suportado apenas para funções de tendência. Outras funções suportam segundos (s), minutos (m), horas (h), dias (d) e semanas (w).

Deslocamento de tempo com períodos de tempo absolutos

Períodos de tempo absolutos são suportados no parâmetro de deslocamento de tempo, por exemplo, meia-noite à meia-noite para um dia, segunda-feira a domingo para uma semana, primeiro dia ao último dia do mês para um mês.

O deslocamento de tempo para períodos de tempo absolutos começa com now - especificando o tempo atual, e é seguido por qualquer número de operações de tempo: /<unidade de tempo> - define o início e o fim da unidade de tempo, por exemplo, meia-noite à meia-noite para um dia, +N<unidade de tempo> ou -N<unidade de tempo> - para adicionar ou subtrair N unidades de tempo.

Observe que o valor do deslocamento de tempo pode ser maior ou igual a 0, enquanto o valor mínimo do período de tempo é 1.

Parâmetro Descrição
1d:now/d Ontem
1d:now/d+1d Hoje
2d:now/d+1d Últimos 2 dias
1w:now/w Semana passada
1w:now/w+1w Esta semana
Outras expressões

Os parâmetros da função podem conter outras expressões, conforme a seguinte sintaxe:

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

Observe que outras expressões não podem ser usadas se a função fizer referência ao histórico do item. Por exemplo, a seguinte sintaxe não é permitida:

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

Operadores

Os seguintes operadores são suportados para triggers (em ordem decrescente de prioridade de execução):

Prioridade Operador Definição Notas para valores desconhecidos Forçar conversão do operando para float 1
1 - Menos unário -Desconhecido → Desconhecido Sim
2 not NÃO lógico not Desconhecido → Desconhecido Sim
3 * Multiplicação 0 * Desconhecido → Desconhecido
(sim, Desconhecido, não 0 - para não perder
Desconhecido em operações aritméticas)
1.2 * Desconhecido → Desconhecido
Sim
/ Divisão Desconhecido / 0 → erro
Desconhecido / 1.2 → Desconhecido
0.0 / Desconhecido → Desconhecido
Sim
4 + Mais aritmético 1.2 + Desconhecido → Desconhecido Sim
- Menos aritmético 1.2 - Desconhecido → Desconhecido Sim
5 < Menor que. O operador é definido como:

A<B ⇔ (A<B-0.000001)
1.2 < Desconhecido → Desconhecido Sim
<= Menor ou igual a. O operador é definido como:

A<=B ⇔ (A≤B+0.000001)
Desconhecido <= Desconhecido → Desconhecido Sim
> Maior que. O operador é definido como:

A>B ⇔ (A>B+0.000001)
Sim
>= Maior ou igual a. O operador é definido como:

A>=B ⇔ (A≥B-0.000001)
Sim
6 = É igual. O operador é definido como:

A=B ⇔ (A≥B-0.000001) e (A≤B+0.000001)
Não 1
<> Diferente. O operador é definido como:

A<>B ⇔ (A<B-0.000001) ou (A>B+0.000001)
Não 1
7 and E lógico 0 and Desconhecido → 0
1 and Desconhecido → Desconhecido
Desconhecido and Desconhecido → Desconhecido
Sim
8 or OU lógico 1 or Desconhecido → 1
0 or Desconhecido → Desconhecido
Desconhecido or Desconhecido → Desconhecido
Sim

1 O operando string ainda é convertido para numérico se:

  • outro operando for numérico
  • operador diferente de = ou <> for usado em um operando

(Se a conversão falhar - o operando numérico é convertido para string e ambos os operandos são comparados como strings.)

Os operadores not, and e or diferenciam maiúsculas de minúsculas e devem estar em minúsculas. Eles também devem ser cercados por espaços ou parênteses.

Todos os operadores, exceto o - unário e o not, têm associatividade da esquerda para a direita. O - unário e o not são não associativos (ou seja, -(-1) e not (not 1) devem ser usados em vez de --1 e not not 1).

Resultado da avaliação:

  • Os operadores <, <=, >, >=, =, <> devem retornar '1' na expressão do trigger se a relação especificada for verdadeira e '0' se for falsa. Se pelo menos um operando for Desconhecido, o resultado será Desconhecido;
  • and para operandos conhecidos deve retornar '1' se ambos os operandos forem diferentes de '0'; caso contrário, retorna '0'; para operandos desconhecidos, and retorna '0' apenas se um operando for igual a '0'; caso contrário, retorna 'Desconhecido';
  • or para operandos conhecidos deve retornar '1' se qualquer um dos operandos for diferente de '0'; caso contrário, retorna '0'; para operandos desconhecidos, or retorna '1' apenas se um operando for diferente de '0'; caso contrário, retorna 'Desconhecido';
  • O resultado do operador de negação lógica not para um operando conhecido é '0' se o valor do operando for diferente de '0'; '1' se o valor do operando for igual a '0'. Para operando desconhecido, not retorna 'Desconhecido'.

Cache de valores

Os valores necessários para a avaliação do trigger são armazenados em cache pelo Zabbix server. Por causa disso, a avaliação do trigger causa uma carga maior no banco de dados por algum tempo após a reinicialização do server. O cache de valores não é limpo quando os valores do histórico do item são removidos (seja manualmente ou pelo housekeeper), então o server usará os valores em cache até que eles sejam mais antigos do que os períodos de tempo definidos nas funções do trigger ou até que o server seja reiniciado.

Se não houver dados recentes no cache e não houver um período de consulta definido na função, o Zabbix, por padrão, irá buscar no passado até uma semana para consultar o banco de dados por valores históricos.

Exemplos de triggers

Exemplo 1

A carga do processador está muito alta no Zabbix server.

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

Ao usar a função 'last()', estamos referenciando o valor mais recente. /Zabbix server/system.cpu.load[all,avg1] fornece um nome curto do parâmetro monitorado. Especifica que o host é 'Zabbix server' e a chave monitorada é 'system.cpu.load[all,avg1]'. Finalmente, >5 significa que o trigger está no estado PROBLEMA sempre que a medição mais recente da carga do processador do Zabbix server for maior que 5.

Exemplo 2

www.example.com está sobrecarregado.

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

A expressão é verdadeira quando a carga atual do processador é maior que 5 ou a carga do processador foi maior que 2 nos últimos 10 minutos.

Exemplo 3

/etc/passwd foi alterado.

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

A expressão é verdadeira quando o valor anterior do checksum de /etc/passwd difere do mais recente.

Expressões semelhantes podem ser úteis para monitorar alterações em arquivos importantes, como /etc/passwd, /etc/inetd.conf, /kernel, etc.

Exemplo 4

Alguém está baixando um arquivo grande da Internet.

Uso da função min:

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

A expressão é verdadeira quando o número de bytes recebidos na eth0 é maior que 100 KB nos últimos 5 minutos.

Exemplo 5

Ambos os nós do servidor SMTP em cluster estão inativos.

Observe o uso de dois hosts diferentes em uma expressão:

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

A expressão é verdadeira quando ambos os servidores SMTP estão inativos em smtp1.example.com e smtp2.example.com.

Exemplo 6

O agent do Zabbix precisa ser atualizado.

Uso da função find():

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

A expressão é verdadeira se o agent do Zabbix tiver a versão beta8.

Exemplo 7

O servidor está inacessível.

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

A expressão é verdadeira se o host "example.example.com" estiver inacessível mais de 5 vezes nos últimos 30 minutos.

Exemplo 8

Sem batimentos cardíacos nos últimos 3 minutos.

Uso da função nodata():

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

Para usar este trigger, 'tick' deve ser definido como um item trapper do Zabbix. O host deve enviar periodicamente dados para este item usando o zabbix_sender. Se nenhum dado for recebido em 180 segundos, o valor do trigger se tornará PROBLEMA.

Observe que 'nodata' pode ser usado para qualquer tipo de item.

Exemplo 9

Atividade da CPU durante a noite.

Uso da função time():

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

O trigger pode mudar seu estado para problema apenas durante a noite (00:00 - 06:00).

Exemplo 10

Atividade da CPU a qualquer momento com exceção.

Uso da função time() e do operador not:

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

O trigger pode mudar seu estado para problema a qualquer momento, exceto por 2 horas na troca da semana (domingo, 23:00 - segunda-feira, 01:00).

Exemplo 11

Verifique se a hora local do cliente está sincronizada com a hora do Zabbix server.

Uso da função fuzzytime():

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

O trigger mudará para o estado de problema caso a hora local no server MySQL_DB e no Zabbix server difira em mais de 10 segundos. Observe que 'system.localtime' deve ser configurado como uma verificação passiva.

Exemplo 12

Comparando a carga média de hoje com a carga média do mesmo horário de ontem (usando deslocamento de tempo como now-1d).

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

O trigger será disparado se a carga média da última hora ultrapassar a carga média da mesma hora de ontem em mais de duas vezes.

Exemplo 13

Usando o valor de outro item para obter um limite de trigger:

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

O trigger será disparado se o armazenamento livre cair abaixo de 10 por cento.

Exemplo 14

Usando resultado da avaliação para obter o número de triggers acima de um limite:

(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

O trigger será disparado se pelo menos dois dos triggers na expressão estiverem em estado de problema.

Exemplo 15

Comparando valores de string de dois items - os operandos aqui são funções que retornam strings.

Problema: criar um alerta se a versão do Ubuntu for diferente em hosts diferentes

last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
Exemplo 16

Comparando dois valores de string - os operandos são:

  • uma função que retorna uma string
  • uma combinação de macros e strings

Problema: detectar alterações na consulta DNS

A chave do item é:

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

com macros definidas como

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

e normalmente retorna:

example.com           MX       0 mail.example.com

Portanto, nossa expressão de trigger para detectar se o resultado da consulta DNS divergiu do resultado esperado é:

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

Observe as aspas ao redor do segundo operando.

Exemplo 17

Comparando dois valores de string - os operandos são:

  • uma função que retorna uma string
  • uma constante de string com caracteres especiais \ e "

Problema: detectar se o conteúdo do arquivo /tmp/hello é igual a:

\" //hello ?\"

Opção 1) escrever a string diretamente:

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

Observe como os caracteres \ e " são escapados quando a string é comparada diretamente.

Opção 2) usar uma macro

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

na expressão:

last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Exemplo 18

Comparando períodos de longo prazo.

Problema: A carga do servidor Exchange aumentou mais de 10% no mês passado

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

Você também pode usar o campo Nome do evento na configuração do trigger para construir uma mensagem de alerta significativa, por exemplo, para receber algo como

"A carga do servidor Exchange aumentou em 24% em julho (0,69) em comparação com junho (0,56)"

o nome do evento deve ser definido como:

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

Também é útil permitir o fechamento manual na configuração do trigger para esse tipo de problema.

Tem um exemplo de expressão de trigger que pode ser útil para outras pessoas? Use o formulário de sugestão de exemplo para enviá-lo aos desenvolvedores do Zabbix.

Histerese

Às vezes, é necessário um intervalo entre os estados de problema e recuperação, em vez de um simples limite. Por exemplo, se quisermos definir um trigger que relate um problema quando a temperatura da sala do servidor ultrapassar 20°C e quisermos que ele permaneça no estado de problema até que a temperatura caia abaixo de 15°C, um simples limite de trigger em 20°C não será suficiente.

Em vez disso, precisamos definir primeiro uma expressão de trigger para o evento de problema (temperatura acima de 20°C). Em seguida, precisamos definir uma condição adicional de recuperação (temperatura abaixo de 15°C). Isso é feito definindo um parâmetro adicional Expressão de recuperação ao definir um trigger.

Neste caso, a recuperação do problema ocorrerá em duas etapas:

  • Primeiro, a expressão de problema (temperatura acima de 20°C) terá que ser avaliada como FALSA
  • Em segundo lugar, a expressão de recuperação (temperatura abaixo de 15°C) terá que ser avaliada como VERDADEIRA

A expressão de recuperação será avaliada somente quando o evento de problema for resolvido primeiro.

A expressão de recuperação ser VERDADEIRA sozinha não resolve um problema se a expressão de problema ainda for VERDADEIRA!

Exemplo 1

A temperatura na sala do servidor está muito alta.

Expressão do problema:

last(/server/temp)>20

Expressão de recuperação:

last(/server/temp)<=15
Exemplo 2

O espaço livre em disco está muito baixo.

Expressão do problema: é menor que 10GB nos últimos 5 minutos

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

Expressão de recuperação: é maior que 40GB nos últimos 10 minutos

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

Expressões com operandos desconhecidos

Geralmente, um operando desconhecido (como um item não suportado) na expressão fará com que o valor do trigger seja imediatamente definido como Desconhecido.

No entanto, em alguns casos, operandos desconhecidos (itens não suportados, erros de função) são admitidos na avaliação da expressão:

  • A função nodata() é avaliada independentemente de o item referenciado ser suportado ou não.
  • Expressões lógicas com OR e AND podem ser avaliadas para valores conhecidos em dois casos, independentemente dos operandos desconhecidos:
    • Caso 1: "1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." pode ser avaliado para um resultado conhecido ('1' ou "Problema"),
    • Caso 2: "0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." pode ser avaliado para um resultado conhecido ('0' ou "OK").
      O Zabbix tenta avaliar tais expressões lógicas considerando itens não suportados como operandos desconhecidos. Nos dois casos acima, um valor conhecido será produzido ("Problema" ou "OK", respectivamente); em todos os outros casos, o trigger será avaliado como Desconhecido.
  • Se a avaliação da função para um item suportado resultar em erro, o valor da função se torna Desconhecido e participa como operando desconhecido em avaliações posteriores da expressão.

Observe que operandos desconhecidos podem "desaparecer" apenas em expressões lógicas, conforme descrito acima. Em expressões aritméticas, operandos desconhecidos sempre levam ao resultado Desconhecido (exceto divisão por 0).

Uma expressão que resulta em Desconhecido não altera o estado do trigger ("Problema/OK"). Portanto, se estava em "Problema" (veja o Caso 1), permanecerá no mesmo estado de problema mesmo que a parte conhecida seja resolvida ('1' se torne '0'), porque a expressão agora é avaliada como Desconhecido e isso não altera o estado do trigger.

Se uma expressão de trigger com vários itens não suportados for avaliada como Desconhecido, a mensagem de erro no frontend se refere ao último item não suportado avaliado.