7 Funções preditivas de trigger
Visão geral
Às vezes, há sinais de um problema iminente. Esses sinais podem ser identificados 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 de trigger preditivas.
Funções
Antes de definir um trigger, é necessário definir o que é um estado de problema e quanto tempo é necessário para agir. Existem duas maneiras de configurar um trigger para sinalizar 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 da 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
Primeiramente, você deve especificar o período histórico que o Zabbix deve analisar para gerar a previsão. Você faz isso de uma maneira familiar, por meio do parâmetro período de tempo e de 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 que encontra 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 importa 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 comum, 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 = a~0~ + a~1~*t + a~2~*t2 + ... + a~n~*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 | max~agora\ <=\ t\ <=\ agora\ +\ time~ f(t) |
| min | min~agora\ <=\ 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 enormes, 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 dupla é 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 muda 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 seu 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 o 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, um 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 então se recuperar repentinamente quando 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 raízes do polinômio (numericamente).
5 Mas, neste caso, -1 pode fazer com que seu 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)