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:
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:
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.
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).
Os parâmetros da função permitem especificar:
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:
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.
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'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 |
Os parâmetros da função podem conter outras expressões, conforme a seguinte sintaxe:
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)
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:
(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 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.
A carga do processador está muito alta no Zabbix server.
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.
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.
/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.
Alguém está baixando um arquivo grande da Internet.
Uso da função min:
A expressão é verdadeira quando o número de bytes recebidos na eth0 é maior que 100 KB nos últimos 5 minutos.
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])=0A expressão é verdadeira quando ambos os servidores SMTP estão inativos em smtp1.example.com e smtp2.example.com.
O agent do Zabbix precisa ser atualizado.
Uso da função find():
A expressão é verdadeira se o agent do Zabbix tiver a versão beta8.
O servidor está inacessível.
A expressão é verdadeira se o host "example.example.com" estiver inacessível mais de 5 vezes nos últimos 30 minutos.
Sem batimentos cardíacos nos últimos 3 minutos.
Uso da função nodata():
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.
Atividade da CPU durante a noite.
Uso da função time():
O trigger pode mudar seu estado para problema apenas durante a noite (00:00 - 06:00).
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).
Verifique se a hora local do cliente está sincronizada com a hora do Zabbix server.
Uso da função fuzzytime():
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.
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).
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.
Usando o valor de outro item para obter um limite de trigger:
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1O trigger será disparado se o armazenamento livre cair abaixo de 10 por cento.
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)>=2O trigger será disparado se pelo menos dois dos triggers na expressão estiverem em estado de problema.
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])Comparando dois valores de string - os operandos são:
Problema: detectar alterações na consulta DNS
A chave do item é:
com macros definidas como
e normalmente retorna:
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.
Comparando dois valores de string - os operandos são:
Problema: detectar se o conteúdo do arquivo /tmp/hello é igual a:
Opção 1) escrever a string diretamente:
Observe como os caracteres \ e " são escapados quando a string é comparada diretamente.
Opção 2) usar uma macro
na expressão:
Comparando períodos de longo prazo.
Problema: A carga do servidor Exchange aumentou mais de 10% no mês passado
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.
À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:
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!
A temperatura na sala do servidor está muito alta.
Expressão do problema:
Expressão de recuperação:
O espaço livre em disco está muito baixo.
Expressão do problema: é menor que 10GB nos últimos 5 minutos
Expressão de recuperação: é maior que 40GB nos últimos 10 minutos
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:
nodata() é avaliada independentemente de o item referenciado ser suportado ou não.1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." pode ser avaliado para um resultado conhecido ('1' ou "Problema"),0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." pode ser avaliado para um resultado conhecido ('0' ou "OK").Desconhecido.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.