À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.
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.
Ambas as funções usam quase o mesmo conjunto de parâmetros. Use a lista de funções suportadas como referência.
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.
(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.
(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
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 |
(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 |
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.
As funções retornam -1 nas seguintes situações:
Nenhum aviso ou erro é sinalizado se o ajuste escolhido descrever mal os dados fornecidos ou se houver poucos dados para uma previsão precisa.
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:
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:
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.
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)