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:
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:
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.
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).
Os parâmetros de função permitem especificar:
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.
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'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 |
Os parâmetros da função podem conter outras expressões, como as seguintes sintaxe:
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)
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:
(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:
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.
A carga do processador está muito alta no servidor Zabbix.
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.
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.
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.
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 de 100 KB nos últimos 5 minutos.
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:
A expressão é verdadeira quando os dois servidores SMTP estão inativos em ambos smtp1.example.com e smtp2.example.com.
O agente Zabbix precisa ser atualizado.
Uso da função find():
A expressão será verdadeira se o Zabbix Agent tiver a versão beta8.
O servidor não pode ser acessado.
A expressão será verdadeira se o host "example.example.com" estiver inacessível mais de 5 vezes nos últimos 30 minutos.
Nenhum batimento cardíaco nos últimos 3 minutos.
Uso da função nodata():
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.
Atividade da CPU durante a noite.
Uso da função time():
O trigger pode alterar seu estado para problema apenas durante o período noturno (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
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).
Verificar se a hora local do cliente está sincronizada com a hora do servidor Zabbix.
Uso da função fuzzytime():
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).
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
).
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.
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%.
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.
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])
Comparação de 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 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.
Comparação de 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 cadeia de caracteres é comparada diretamente.
Opção 2) usar uma macro
na expressão:
Comparação de períodos de longo prazo.
Problema: a carga do servidor Exchange aumentou em mais de 10% no mês passado
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.
À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:
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!
A temperatura na sala do servidor está muito alta.
Expressão problema:
Expressão de recuperação:
O espaço livre em disco é muito baixo.
Expressão problema: é inferior a 10 GB nos últimos 5 minutos
Expressão de recuperação: é mais de 40 GB 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 comoUnknown
.
Contudo, alguns casos de 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").Unknown
.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.