Esta é uma tradução da página de documentação original em inglês. Ajude-nos a torná-la melhor.

7 Funções de gatilho preditivas

Visão geral

Algumas vezes há sinais dos problemas que ocorrerão. Estes sinais podem ser identificados de forma que ações possam ser tomadas de antemão para prevenir ou ao menos minimizar os impactos do problema.

O Zabbix possui ferramentas para predizer o comportamento futuro de um sistema monitorado baseado em seus dados históricos. Estas ferramentas são disponibilizadas através das funções de gatilho preditivas.

1 Funções

Duas coisas que se precisa conhecer é como definir um estado de problema e quanto tempo é necessário para tomar uma ação. Então há dois caminhos para configurar uma sinalização de gatilho sobre uma situação indesejada em potencial. Primeiro: o gatilho deve disparar quando é esperado que o sistema esteja em estado de problema após o "tempo para agir". Segundo: o gatilho deve disparar quando o sistema alcançará o estado de problema em menos do que o "tempo para agir".

Funções de gatilhos correspondentes para usar são forecast e timeleft. Note que a análise estatística subjacente é basicamente idêntica para ambas as funções. Você pode configurar um gatilho da maneira que preferir com resultados similares.

2 Parâmetros

Ambas as funções utilizam praticamente o mesmo conjunto de parâmetros. Use a lista de funções suportadas para referência.

2.1 Intervalo de tempo

Primeiro de tudo, você deve especificar o período histórico que o Zabbix deve analisar para chegar a uma predição. Você faz isso de uma forma familiar com o parâmetro período de tempo e mudança de tempo (time shift) opcional como você fez com as funções avg, count, delta, max, min e sum.

2.2 Horizonte de previsão

(apenas forecast)
O parâmetro time especifica quanto distante no futuro o Zabbix deve extrapolar as dependência que ele encontra nos dados históricos. Não importa se você usar time_shift ou não, time é sempre contado a partir momento atual.

2.3 Limite (threshold) a alcançar

(apenas timeleft)
O parâmetro threshold especifica um valor que o item analisado deve alcançar, sem distinção se a partir de cima ou de baixo. Uma vez que tenhamos determinado f(t) (veja abaixo) devemos solucionar a equação f(t) = threshold e retornar a raíz que está mais perto e à direita de agora (now) ou 999999999999.9999 se não houver tal raíz.

Quando valores de item se aproximam do limite e então o cruzam, timeleft assume que essa interseção já está no passado e por isso alterna para a próxima interseção com o nível de threshold, se houver algum. A boa prática deveria ser utilizar as predições como complemento aos diagnósticos de problema ordinários, e não como uma substituição.1

2.4 Funções de ajuste (fit)

O ajuste (fit) padrão é a função linear. Mas se o seu sistema monitorado é mais complexo você tem mais opções para escolher.

fit x = f(t)
linear x = a + b*t
polynomialN2
(polinomial)
x = a0 + a1*t + a2*t2 + ... + an*tn
exponential
(exponencial)
x = a*exp(b*t)
logarithmic
(logarítmico)
x = a + b*log(t)
power
(potência)
x = a*tb
2.5 Modos

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

modo resultado forecast
valor f(now + time)
max maxnow <= t <= now + time f(t)
min minnow <= t <= now + time f(t)
delta max - min
avg média de f(t) (now <= t <= now + time) de acordo com definição

3 Detalhes

Para evitar cálculos com números enormes nós consideramos o registro de data do primeiro valor no período especificado mais 1 ns como um novo tempo zero (zero-time) (tempo epoch atual é de ordem 109, epoch ao quadrado é 1018, dupla precisão é aproximadamente 10-16). 1 ns é adicionado para fornecer todos os valores de tempo positivos para ajustes logarithmic e power que envolvem o cálculo de log(t). Alteração de tempo (time shift) não afeta as funções linear, polynomial, exponential (além de cálculos mais fáceis e mais precisos) mas altera a forma das funções logarithmic e power.

4 Erros potenciais

As funções retornam -1 em tais situações:

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

Nenhum alerta ou erros são apresentados se o ajuste (fit) escolhido descreve pobremente os dados providos ou se há apenas poucos dados para um predição acurada.

5 Exemplos e lidando com erros

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

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

No entanto, o código de erro -1 pode aparecer e colocar seu gatilho em um estado de problema. Geralmente isso é bom porque você recebe um alerta de que suas predições não funcionam corretamente e você deve olhar para elas com mais cuidado para encontrar o por quê. Mas algumas vezes é ruim porque -1 pode simplesmente significar que não há dados sobre o espaço em disco livre no host obtidos na última hora. Se você estiver recebendo alertas de falso positivo demais considere usar uma expressão de gatilho mais elaborada 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. Primeiro de tudo, -1 pode ou não colocar o gatilho em um estado de problema dependendo se você tiver uma expressão como forecast(/host/item,(...))<... ou como forecast(/host/item,(...))>...

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


  1. Por exemplo, um gatilho simples como timeleft(/host/item,1h,X) < 1h pode incorrer em estado de problema quando o valor do item se aproxima de X e então de repente se recupera assim que o valor de X é alcançado. Se o problema é o valor do item estar abaixo de X use: last(/host/item) < X or timeleft(/host/item,1h,X) < 1h. Se o problema é o valor do item estar acima de X use: last(/host/item) > X or timeleft(/host/item,1h,X) < 1h↩︎

  2. Grau polinomial pode ser de 1 a 6, polynomial1 é equivalente a linear. No entanto, use graus polinomiais mais altos com cautela. Se o período de avaliação contém menos do que o necessário para determinar os coeficientes polinomiais, o grau polinomial será diminuído (p.e. polynomial5 é requisitado, mas há apenas 4 pontos, consequentemente polynomial3 será ajustado).↩︎

  3. Por exemplo o ajuste de funções exponential ou power envolvem o cálculo de log() dos valores do item. Se o dado contém zeros ou valores negativos você terá 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 valor pode ser calculado sem quaisquer passos adicionais. O cálculo de avg envolve computação de antiderivativo polinomial (analiticamente). Computação de max, min e delta envolve computação de derivativo polinomial (analiticamente) e descoberta de suas raízes (numericamente). A solução de f(t) = 0 envolve a descoberta das raízes polinomiais (numericamente).↩︎

  5. Mas neste caso o -1 pode fazer com que seu gatilho se recupere do estado de problema. Para estar completamente 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)↩︎