2 Expressões de Trigger

Visão geral

As expressões usadas em triggers são flexíveis. Você pode usá-las para criar testes lógicos complexos em relação a 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 threshold, usando um operador e uma constante.

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

Por exemplo:

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

disparará o trigger se o número de bytes recebidos nos ú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 threshold do problema quanto o threshold de recuperação. 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 será 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 somente a expressão de problema precisa ser FALSA, mas também a expressão de recuperação precisa ser VERDADEIRA. Isso é útil para criar hysteresis e evitar oscilação do trigger.

É improdutivo usar a macro {TRIGGER.VALUE} em uma expressão de recuperação porque esta expressão só é avaliada quando o trigger está no estado de "Problema". Consequentemente, {TRIGGER.VALUE} sempre será resolvido como "1" (o 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, fazer referência à hora atual e outros fatores.

Uma lista completa de 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 <> (consulte example).

Parâmetros de função

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

  • chave do host e do item (funções que fazem referência apenas ao histórico do item do host)
  • parâmetros específicos da função
  • outras expressões (não disponíveis para funções que fazem referência ao histórico de itens do host), consulte outras expressões para exemplos)

O host e a chave do item podem ser especificados como /host/key. O item referenciado deve estar em um estado suportado (exceto para a função nodata(), que também é calculada para itens sem suporte).

Embora outras expressões de trigger como parâmetros de função sejam limitadas a funções não históricas 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. Consulte a seção funções suportadas para obter uma lista completa desses parâmetros.

A maioria das funções numéricas aceita a hora como parâmetro. Você pode usar segundos ou time suffixes para indicar o tempo. Precedido por uma marca de hash, 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.

Os parâmetros com uma marca de hash têm um significado diferente com a função last - eles denotam o enésimo valor anterior, portanto, dados os valores 3, 7, 2, 6, 5 (do mais recente para o menos recente):

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

Um deslocamento de tempo opcional é suportado com o tempo ou contagem de valor como parâmetro da função. Esse parâmetro permite fazer referência a dados de um período no passado.

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

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

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

Deslocamento de tempo com períodos absolutos

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

O deslocamento de tempo para períodos absolutos começa com now - especificando o tempo atual, e é seguido por qualquer número de operações de tempo: /<time unit> - define o início e o fim da unidade de tempo, por exemplo, da meia-noite à meia-noite para um dia, +N<time unit> ou -N<time unit> - 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 Dois últimos 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, como as seguintes sintaxe:

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

Observe que outras expressões não poderão ser usadas se a função fizer referência ao histórico do item. Por exemplo, a sintaxe a seguir 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ça a conversão do operando para float 1
1 - Unário negativo -Desconhecido → Desconhecido Sim
2 not Lógico NOT não 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 → error
Desconhecido / 1.2 → Desconhecido
0.0 / Desconhecido → Desconhecido
Sim
4 + Soma aritmética 1.2 + Desconhecido → Desconhecido Sim
- Subtração aritmética 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 <= UDesconhecido → 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 a. O operador é definido como:

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

A<>B ⇔ (A<B-0.000001) ou (A>B+0.000001)
No 1
7 and Lógico AND 0 and Desconhecido → 0
1 and Desconhecido → Desconhecido
Desconhecido and Desconhecido → Desconhecido
Sim
8 or Lógico OR 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
  • um operador diferente de = ou <> for usado em um operando

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

Os operadores not, and e or são sensíveis a maiúsculas e minúsculas e devem ser escritos em minúsculas. Eles também precisam estar cercados por espaços ou parênteses.

Todos os operadores, exceto o unário - e not, têm associatividade da esquerda para a direita. Os operadores unários - e 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:

  • <, <=, >, >=, =, <> Operadores retornarão '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 retornará '1' se ambos os operandos forem diferentes de '0'; caso contrário, retornará '0'; para operandos desconhecidos, and retornará '0' somente se um dos operandos for igual a '0'; caso contrário, retornará 'Desconhecido';
  • or para operandos conhecidos retornará '1' se qualquer um dos operandos for diferente de '0'; caso contrário, retornará '0'; para operandos desconhecidos, or retornará '1' somente se um dos operandos for diferente de '0'; caso contrário, retornará 'Desconhecido';
  • O resultado do operador de negação lógica not para um operando conhecido é '0' se o valor do seu operando for diferente de '0'; '1' se o valor do seu operando for igual a '0'. Para um operando desconhecido, not retornará 'Desconhecido'.

Cache de valores

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

Exemplos de triggers

Exemplo 1

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

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

Ao usar a função "last()", estamos fazendo referência ao valor mais recente. o /Zabbix server/system.cpu.load[all,avg1] fornece um nome curto do parâmetro monitorado o parâmetro monitorado. Ele especifica que o host é "Zabbix server e a chave que está sendo monitorada é 'system.cpu.load[all,avg1]'. Finalmente, >5 significa que o trigger está no estado PROBLEM sempre que a medição de carga do processador mais recente do Zabbix for maior que 5.

Exemplo 2

O 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 superior a 2 nos últimos 10 minutos.

Exemplo 3

O /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 da soma de verificação de /etc/passwd for diferente 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 de 100 KB nos últimos 5 minutos.

Exemplo 5

Os dois nós do servidor SMTP em cluster estão fora do ar.

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

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

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

Exemplo 6

O agente Zabbix precisa ser atualizado.

Uso da função find():

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

A expressão será verdadeira se o Zabbix Agent tiver a versão beta8.

Exemplo 7

O servidor não pode ser acessado.

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

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

Exemplo 8

Nenhum batimento cardíaco nos últimos 3 minutos.

Uso da função nodata():

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

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

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 alterar seu estado para problema apenas durante o período noturno (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
       e não (dayofweek()=7 e time()>230000)
       and not (dayofweek()=1 and time()<010000)

O trigger pode mudar seu estado para problema a qualquer momento, exceto por 2 horas em uma mudança de semana (domingo, 23:00 - segunda-feira, 01:00).

Exemplo 11

Verificar se a hora local do cliente está sincronizada com a hora do servidor Zabbix.

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 servidor MySQL_DB e do servidor Zabbix for diferente em mais de 10 segundos. Observe que que o "system.localtime" deve ser configurado como uma verificação [passiva check] (/manual/appendix/items/activepassive#passive_checks).

Exemplo 12

Comparação da carga média de hoje com a carga média do mesmo horário ontem (usando a mudança de horário como now-1d).

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

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

Exemplo 13

Usar 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%.

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á acionado se pelo menos dois dos triggers na expressão estiverem em um estado problemático.

Exemplo 15

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

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

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

Comparação de 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[8.8.8.8,{$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 ao DNS se desviou do resultado esperado é:

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

Observe as aspas ao redor do segundo operando.

Exemplo 17

Comparação de 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 cadeia de caracteres é 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

Comparação de períodos de longo prazo.

Problema: a carga do servidor Exchange aumentou em 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 a opção Event name na configuração do trigger para criar 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 esse tipo de problema.

Histerese

Às vezes, é necessário um intervalo entre os estados de problema e de recuperação, em vez de um simples limite. Por exemplo, se quisermos definir um trigger que reporte um problema quando a temperatura da sala de servidores ultrapassar 20°C e queremos 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 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 de expressão de recuperação adicional ao definir defining 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
  • Segundo, 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 apenas quando o evento problema for resolvido primeiro.

::: notewarning A expressão de recuperação sendo VERDADEIRA sozinha não resolve o problema se a expressão problema ainda for VERDADEIRA!

Exemplo 1

A temperatura na sala do servidor está muito alta.

Expressão problema:

last(/server/temp)>20

Expressão de recuperação:

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

O espaço livre em disco é muito baixo.

Expressão problema: é inferior a 10 GB nos últimos 5 minutos

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

Expressão de recuperação: é mais de 40 GB 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 comoUnknown.

Contudo, alguns casos de 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 de 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 essas expressões lógicas tratando itens não suportados como operandos desconhecidos. Nos dois casos acima, um valor conhecido será produzido ("Problema" ou "OK", respectivamente); em casos all other (todos os outros), o trigger será avaliado como Unknown.
  • Se a avaliação da função para um item suportado resultar em erro, o valor da função se torna Unknown e participa como um operando desconhecido na avaliação posterior da expressão.

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

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

Se uma expressão de trigger com vários itens não suportados for avaliada como Unknown, a mensagem de erro na interface se referirá ao último item não suportado avaliado.