2 Expressão de acionamento

Visão geral

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

A sintaxe de uma expressão simples útil é função(/host/key,parâmetro)<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 foi sempre superior a 100 kilobytes.

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

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

Ao definir apenas uma expressão de problema, essa expressão será usada como o limite do problema e o limite de recuperação do problema. Assim que assim que a expressão do problema for avaliada como TRUE, haverá um problema. Assim que assim que a expressão do problema for avaliada como FALSE, o problema será resolvido.

Ao definir tanto a expressão do problema quanto a expressão de recuperação suplementar suplementar, a resolução do problema se torna mais complexa: não apenas a a expressão do problema precisa ser FALSA, mas também a expressão de recuperação precisa ser deve ser VERDADEIRA. Isso é útil para criar histerese (#hysteresis) e evitar disparo de gatilho.

Funções

As funções permitem calcular os valores coletados (média, mínimo, máximo, soma), localizar cadeias de caracteres, 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) 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 acionamento como parâmetros de função sejam limitadas a funções não históricas em acionadores, 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 supported funções 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'
Turno de tempo

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

O deslocamento de tempo começa com now - especificando a hora atual, e é seguida 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, um dia atrás.

A mudança de horário especificada em meses (M) e anos (y) é compatível apenas com funções de tendência. Outras funções suportam segundos (s), minutos (m), horas (h), dias (d) e semanas (w).

Mudança de horário com períodos de tempo absolutos

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

A mudança de horário para períodos de tempo absolutos começa com now - especificando a hora atual, e é seguida por qualquer número de operações de tempo: /<time unit> - define o início e o fim da unidade de tempo, por por exemplo, da meia-noite à meia-noite de 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.

Parameter Description
1d:now/d Yesterday
1d:now/d+1d Today
2d:now/d+1d Últimos 2 dias
1w:now/w Última semana
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 acionadores (em ordem decrescente de prioridade de execução):

Prioridade Operador Definição Notas para valores desconhecidos Force cast operand to float 1
1 - Unário menos -Desconhecido → Desconhecido Sim
2 not Logical NOT not* Desconhecido → Desconhecido Sim
**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
/ Division Unknown / 0 → error
Unknown / 1.2 → Unknown
0.0 / Unknown → Unknown
Yes
4 + Aritmética mais 1,2 + Desconhecido → Desconhecido Sim
- Menos aritmética 1,2 - Desconhecido → Desconhecido Sim
5 < Menos que. O operador é definido como:

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

A<=B ⇔ (A≤B+0,000001)
Desconhecido <= Desconhecido → Desconhecido Sim
> Mais de. O operador é definido como:

A>B ⇔ (A>B+0,000001)
Sim
>= Mais que 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)
No 1
<> Não é igual. O operador é definido como:

A<>B ⇔ (A<B-0.000001) or (A>B+0,000001)
No 1
7 e Logical AND 0 e Desconhecido → 0
1 e Desconhecido → Desconhecido
Desconhecido e Desconhecido → Desconhecido
Sim
8 or Logical OR 1 ou Desconhecido → 1
0 ou Desconhecido → Desconhecido
Desconhecido ou Desconhecido → Desconhecido
Sim

1 O operando de cadeia de caracteres ainda é convertido em 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 em um operando de cadeia de caracteres 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 os unários - e not, têm associatividade da esquerda para a direita associatividade da esquerda para a direita. Os unários - e not são não associativos (ou seja -(-1) e not (not 1) devem ser usados em vez de --1 e não não 1).

Resultado da avaliação:

  • <, <=, >, >=, =, <> os operadores devem gerar '1' na expressão do acionador se a relação especificada for verdadeira e '0' se for falsa especificada for verdadeira e '0' se for falsa. Se pelo menos um operando for Desconhecido, o resultado será Desconhecido;
  • e para operandos conhecidos produzirá '1' se ambos os operandos forem iguais a '0'; caso contrário, produzirá '0'; para operandos desconhecidos e** produzirá '0' somente se um operando for comparado como igual a '0'; caso contrário, produzirá 'Desconhecido';
  • ou para operandos conhecidos produzirá '1' se qualquer um de seus operandos comparados a '0'; caso contrário, produzirá '0'; para operandos desconhecidos ou produzirá '1' somente se um dos operandos for diferente de '0'; caso contrário, produzirá 'Desconhecido';
  • O resultado do operador de negação lógica not para um operando conhecido é o resultado do operador de negação lógica not para um operando conhecido é '0' se o valor de seu operando for diferente de '0'; '1' se o valor de seu operando for igual a '0'. Para operando desconhecido operando not produz 'Desconhecido'.

Cache de valores

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

Exemplos de acionadores

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 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 acionador está no estado PROBLEM sempre que a medição de carga do processador mais recente do Zabbix mais recente da carga do processador do servidor Zabbix for maior que 5.

Exemplo 2

o site 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 arquivo /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 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 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 acionador, 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 acionador se tornará PROBLEM.

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

Exemplo 9

Atividade da CPU no período noturno.

Uso da função time():

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

O acionador pode mudar seu estado para problema somente no 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 acionador 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 acionador mudará para o estado de problema caso a hora local no servidor do 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 acionador 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 acionamento:

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

O acionador será disparado se o armazenamento livre cair abaixo de 10%.

Exemplo 14

Usando resultado da avaliação para obter o número de acionadores 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 acionador será acionado se pelo menos dois dos acionadores 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 acionamento 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% lameses

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 acionador para criar uma mensagem de alerta significativa, por exemplo, para receber algo como

"A carga do servidor Exchange aumentou em 24% in de 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 acionador para esse tipo de problema esse tipo de problema.

Você tem um exemplo de trigger expressions que pode ser útil para outras pessoas? Utilize o formulário Example suggestion form para enviá-lo aos desenvolvedores do Zabbix.

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 que informe um problema quando a temperatura da sala do servidor for superior a 20°C e quisermos que ele permaneça no estado de problema até que a temperatura caia para menos de 15°C, um simples limite de disparo de 20°C não será suficiente.

Em vez disso, precisamos definir uma expressão de acionamento para o evento problemático primeiro (temperatura acima de 20°C). Em seguida, precisamos definir uma condição de recuperação adicional (temperatura abaixo de 15°C). Isso é feito definindo um parâmetro parâmetro adicional Expressão de recuperação quando defining um acionador.

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

  • Primeiro, a expressão do problema (temperatura acima de 20°C) terá de ser avaliada como FALSA
  • Segundo, a expressão de recuperação (temperatura abaixo de 15°C) deverá ser avaliada como TRUE

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

O fato de a expressão de recuperação ser VERDADEIRA por si só não resolve um problema se a expressão do 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 é muito baixo.

Expressão do 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

Em geral, um operando desconhecido (como um item não suportado) na expressão fará com que o valor do acionador seja imediatamente convertido em Unknown.

Entretanto, 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 do fato de o item referenciado ser suportado ou não.
  • As 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 avaliada para um resultado conhecido ("1" ou "Problema"),
    • Caso 2: "0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." pode ser avaliado com um resultado conhecido ('0' ou "OK") O Zabbix tenta avaliar essas expressões lógicas usando itens não suportados itens não suportados como operandos desconhecidos. Nos dois casos acima, será produzido um valor conhecido ("Problema" ou "OK", respectivamente); em todos os outros casos, o acionador 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 outras avaliações de expressão.

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

Uma expressão que resulta em Unknown não altera o estado do acionador ("Problem/OK"). Portanto, se era "Problema" (consulte o Caso 1), ele permanece no mesmo estado de problema mesmo que a parte conhecida seja resolvida ("1" se torna "OK") seja resolvida ('1' se torna '0'), porque a expressão agora é avaliada como Unknown e isso não altera o estado do acionador.

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