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.

7 Funções de trigger preditivas

Visão geral

Às vezes, há sinais de um problema iminente. Esses sinais podem ser detectados para que ações possam ser tomadas com antecedência para evitar ou pelo menos minimizar o impacto do problema.

O Zabbix possui ferramentas para prever o comportamento futuro do sistema monitorado com base em dados históricos. Essas ferramentas são realizadas por meio de funções preditivas de trigger.

Funções

Antes de definir um trigger, é necessário definir o que é um estado de problema e quanto tempo é necessário para agir. Então, existem duas maneiras de configurar um trigger sinalizando sobre uma situação potencialmente indesejada. Primeiro: o trigger deve disparar quando se espera que o sistema esteja em um estado de problema após o "tempo para agir". Segundo: o trigger deve disparar quando o sistema estiver prestes a atingir o estado de problema em menos de "tempo para agir". As funções de trigger correspondentes a serem usadas são forecast e timeleft. Observe que a análise estatística subjacente é basicamente idêntica para ambas as funções. Você pode configurar um trigger de qualquer maneira que preferir, com resultados semelhantes.

Parâmetros

Ambas as funções usam quase o mesmo conjunto de parâmetros. Use a lista de funções suportadas como referência.

Intervalo de tempo

Antes de tudo, você deve especificar o período histórico que o Zabbix deve analisar para gerar a previsão. Você faz isso de uma maneira já conhecida, usando o parâmetro time period e um deslocamento de tempo opcional, assim como faz com as funções avg, count, delta, max, min e sum.

Horizonte de previsão

(forecast apenas)
O parâmetro time especifica até onde no futuro o Zabbix deve extrapolar as dependências encontradas nos dados históricos. Não importa se você usa time_shift ou não, time é sempre contado a partir do momento atual.

Limite a ser atingido

(timeleft apenas)
O parâmetro threshold especifica um valor que o item analisado deve atingir, não importando se de cima para baixo ou de baixo para cima. Uma vez que determinamos f(t) (veja abaixo), devemos resolver a equação f(t) = threshold e retornar a raiz que está mais próxima do momento atual e à direita do momento atual ou 1.7976931348623158E+308 se não houver tal raiz.

Quando os valores do item se aproximam do limite e depois o cruzam, timeleft assume que a interseção já está no passado e, portanto, muda para a próxima interseção com o nível threshold, se houver. A melhor prática é usar previsões como complemento ao diagnóstico de problemas convencionais, e não como substituição.1

Funções de ajuste

O fit padrão é a função linear. Mas se o seu sistema monitorado for mais complicado, você tem mais opções para escolher.

fit x = f(t)
linear x = a + b*t
polynomialN2 x = a0 + a1*t + a2*t2 + ... + an*tn
exponential x = a*exp(b*t)
logarithmic x = a + b*log(t)
power x = a*tb
Modos

(forecast apenas)
Toda vez que uma função de trigger é avaliada, ela obtém dados do período de histórico especificado e ajusta uma função especificada aos dados. Assim, se os dados forem ligeiramente diferentes, a função ajustada será ligeiramente diferente. Se simplesmente calcularmos o valor da função ajustada em um momento especificado no futuro, você não saberá nada sobre como o item analisado deve se comportar entre agora e aquele momento no futuro. Para algumas opções de fit (como polynomial) um valor simples do futuro pode ser enganoso.

mode forecast resultado
value f(agora + time)
max maxagora <= t <= agora + time f(t)
min minagora <= t <= agora + time f(t)
delta max - min
avg média de f(t) (agora <= t <= agora + time) de acordo com a definição

Detalhes

Para evitar cálculos com números muito grandes, consideramos o timestamp do primeiro valor no período especificado mais 1 ns como um novo tempo zero (o tempo de época atual está na ordem de 109, a época ao quadrado é 1018, a precisão double é cerca de 10-16). 1 ns é adicionado para fornecer todos os valores de tempo positivos para os ajustes logarítmico e potência, que envolvem o cálculo de log(t). O deslocamento de tempo não afeta os ajustes linear, polinomial, exponencial (além de cálculos mais fáceis e precisos), mas altera a forma das funções logarítmica e potência.

Possíveis erros

As funções retornam -1 nas seguintes situações:

  • o período de avaliação especificado não contém dados;
  • o resultado da operação matemática não está definido3;
  • complicações numéricas (infelizmente, para alguns conjuntos de dados de entrada, o intervalo e a precisão do formato de ponto flutuante de dupla precisão tornam-se insuficientes)4.

Nenhum aviso ou erro é sinalizado se o ajuste escolhido descrever mal os dados fornecidos ou se houver poucos dados para uma previsão precisa.

Exemplos e tratamento de erros

Para receber um aviso quando você estiver prestes a ficar sem espaço livre em disco no seu host, você pode usar uma expressão de trigger como esta:

timeleft(/host/vfs.fs.size[/,free],1h,0)<1h

No entanto, o código de erro -1 pode entrar em ação e colocar sua trigger em um estado de problema. Geralmente isso é bom porque você recebe um aviso de que suas previsões não estão funcionando corretamente e deve analisá-las mais cuidadosamente para descobrir o motivo. Mas às vezes isso é ruim porque -1 pode simplesmente significar que não houve dados sobre o espaço livre em disco do host obtidos na última hora. Se você estiver recebendo muitos alertas falsos positivos, considere usar uma expressão de trigger mais complexa 5:

timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1

A situação é um pouco mais difícil com forecast. Antes de tudo, -1 pode ou não colocar a trigger em estado de problema dependendo de você ter uma expressão como forecast(/host/item,(...))<... ou como forecast(/host/item,(...))>...

Além disso, -1 pode ser uma previsão válida se for normal para o valor do item ser negativo. Mas a probabilidade dessa situação no mundo real é insignificante (veja como o operador = funciona). Portanto, adicione ... or forecast(/host/item,(...))=-1 ou ... and forecast(/host/item,(...))<>-1 se você quiser ou não quiser tratar -1 como um problema, respectivamente.

Notas de rodapé

1 Por exemplo, uma trigger simples como timeleft(/host/item,1h,X) < 1h pode entrar em estado de problema quando o valor do item se aproxima de X e, de repente, se recuperar assim que o valor X for atingido. Se o problema for o valor do item estar abaixo de X, use: last(/host/item) < X or timeleft(/host/item,1h,X) < 1h Se o problema for o valor do item estar acima de X, use: last(/host/item) > X or timeleft(/host/item,1h,X) < 1h

2 O grau do polinômio pode ser de 1 a 6, polynomial1 é equivalente a linear. No entanto, use polinômios de grau mais alto com cautela. Se o período de avaliação contiver menos pontos do que o necessário para determinar os coeficientes do polinômio, o grau do polinômio será reduzido (por exemplo, polynomial5 é solicitado, mas há apenas 4 pontos, portanto polynomial3 será ajustado).

3 Por exemplo, ajustar funções exponential ou power envolve calcular log() dos valores do item. Se os dados contiverem zeros ou números negativos, você receberá um erro, pois log() é definido apenas para valores positivos.

4 Para ajustes linear, exponential, logarithmic e power todos os cálculos necessários podem ser escritos explicitamente. Para polynomial apenas value pode ser calculado sem etapas adicionais. Calcular avg envolve computar a antiderivada do polinômio (analiticamente). Calcular max, min e delta envolve computar a derivada do polinômio (analiticamente) e encontrar suas raízes (numericamente). Resolver f(t) = 0 envolve encontrar as raízes do polinômio (numericamente).

5 Mas, nesse caso, -1 pode fazer com que sua trigger se recupere do estado de problema. Para estar totalmente protegido, use: timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)