7 Funciones predictivas de iniciador

Visión general

A veces hay signos del problema que se avecina. Estos signos pueden detectarse para que se puedan tomar acciones con anticipación para prevenir o al menos minimizar el impacto del problema.

Zabbix tiene herramientas para predecir el comportamiento futuro del sistema monitoreado basado en datos históricos. Estas herramientas se realizan a través de funciones predictivas del iniciador.

Funciones

Antes de configurar un iniciador, es necesario definir qué es un estado problemático y cuánto tiempo se necesita para tomar medidas. Luego, hay dos formas de configurar un iniciador que indique una posible situación no deseada. Primero: el iniciador debe activarse cuando se espera que el sistema se encuentre en un estado problemático después del "tiempo para actuar". Segundo: el iniciador debe activarse cuando el sistema va a alcanzar el estado problemático en menos del "tiempo para actuar". Las funciones de iniciador correspondientes que se pueden utilizar son forecast y timeleft. Tenga en cuenta que el análisis estadístico subyacente es básicamente idéntico para ambas funciones. Puede configurar un iniciador de la forma que prefiera con resultados similares.

Parámetros

Ambas funciones utilizan prácticamente el mismo conjunto de parámetros. Utilice la lista de funciones admitidas como referencia.

Intervalo de tiempo

En primer lugar, debe especificar el período histórico que Zabbix debe analizar para realizar la predicción. Puede hacerlo de la manera habitual mediante el parámetro time period y el cambio de hora opcional, como lo hace con las funciones avg, count, delta, max, min y sum.

1 Horizonte de previsión

(solo forecast)
El parámetro time especifica qué tan lejos en el futuro debe Zabbix extrapolar las dependencias que encuentra en los datos históricos. No importa si usa time_shift o no, time siempre se cuenta a partir del momento actual.

Umbral a alcanzar

(solo timeleft)
El parámetro threshold especifica un valor que la métrica analizada debe alcanzar, sin diferencia si es desde arriba o desde abajo. Una vez que hayamos determinado f(t) (ver a continuación), debemos resolver la ecuación f(t) = threshold y devolver la raíz que esté más cerca de ahora y a la derecha de ahora o 999999999999.9999 si no existe dicha raíz.

Cuando los valores de las métricas se acercan al umbral y luego lo cruzan, timeleft asume que la intersección ya está en el pasado y por lo tanto cambia a la siguiente intersección con nivel threshold, si la hay. La mejor práctica debería ser utilizar las predicciones como un complemento a los diagnósticos de problemas ordinarios, no como una sustitución.1

Funciones de ajuste

El "ajuste" predeterminado es la función lineal. Pero si su sistema monitoreado es más complicado tienes más opciones para elegir.

fit x = f(t)
linearpolynomialN x = a + b*t
linear[^2] 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

(solo forecast)
Cada vez que se evalúa una función de iniciador, obtiene datos del período histórico especificado y ajusta una función especificada a los datos. Por lo tanto, si los datos son ligeramente diferentes, la función ajustada será ligeramente diferente. Si simplemente calculamos el valor de la función ajustada en un momento específico en el futuro, no sabrá nada sobre cómo se espera que se comporte la métrica analizada entre ahora y ese momento en el futuro. Para algunas opciones de ajuste (como polinomio), un valor simple del futuro puede ser engañoso.

modo resultado de forecast
value f(ahora + tiempo)
max máxahora <= t <= ahora + tiempo f(t)
min mínahora <= t <= ahora + tiempo f(t)
delta max - min
avg promedio de f(t) (ahora <= t <= ahora + tiempo) según definición

Detalles

Para evitar cálculos con números enormes, consideramos la marca de tiempo del primer valor en el período especificado más 1 ns como un nuevo tiempo cero (el tiempo de época actual es del orden de 109, el cuadrado de la época es 1018, la precisión doble es aproximadamente 10-16). Se agrega 1 ns para proporcionar todos los valores de tiempo positivos para ajustes logarítmicos y de potencia que implican el cálculo de log(t). El cambio de tiempo no afecta a los lineales, polinómicos ni exponenciales (aparte de los cálculos más fáciles y precisos), pero cambia la forma de las funciones logarítmicas y de potencia.

Posibles errores

Las funciones devuelven -1 en las siguientes situaciones:

  • el período de evaluación especificado no contiene datos;
  • el resultado de la operación matemática no está definido[^3];
  • complicaciones numéricas (desafortunadamente, para algunos conjuntos de datos de entrada, el rango y la precisión del formato de punto flotante de precisión doble se vuelven insuficientes)4.

No se marcan advertencias ni errores si el ajuste elegido no describe bien los datos proporcionados o si hay muy pocos datos para una predicción precisa.

Ejemplos y manejo de errores

Para recibir una advertencia cuando esté a punto de quedarse sin espacio libre en el disco de su equipo, puede usar una expresión de iniciador como esta:

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

Sin embargo, el código de error -1 puede entrar en juego y poner su iniciador en un estado problemático. Generalmente es bueno porque recibe una advertencia de que sus predicciones no funcionan correctamente y debe analizarlas más detenidamente para averiguar por qué. Pero a veces es malo porque -1 puede simplemente significar que no hubo datos sobre el espacio libre en el disco del equipo obtenido en la última hora. Si recibe demasiadas alertas de falsos positivos, considere usar una expresión de iniciador más complicada 5:

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

La situación es un poco más difícil con forecast. En primer lugar, -1 puede o no poner el iniciador en un estado de problema dependiendo de si tiene una expresión como forecast(/host/item,(...))<... o como forecast(/host/item,(...))>...

Además, -1 puede ser un pronóstico válido si es normal que el valor de la métrica sea negativo. Pero la probabilidad de esta situación en la situación del mundo real es insignificante (vea cómo funciona el operador =). Entonces, agregue ... or forecast(/host/item,(...))=-1 o ... and forecast(/host/item,(...))<>-1 si desea o no tratar -1 como un problema respectivamente.

Notas al pie

1 Por ejemplo, un iniciador simple como timeleft(/host/item,1h,X) < 1h puede entrar en estado de problema cuando el valor de la métrica se acerca a X y luego recuperarse repentinamente una vez que se alcanza el valor X. Si el problema es que el valor de la métrica es inferior a X, utilice: last(/host/item) < X or timeleft(/host/item,1h,X) < 1h Si el problema es que el valor de la métrica es superior a X, utilice: last(/host/item) > X or timeleft(/host/item,1h,X) < 1h

2 El grado del polinomio puede ser de 1 a 6, polynomial1 es equivalente a linear. Sin embargo, utilice polinomios de grado superior con precaución. Si el período de evaluación contiene menos puntos de los necesarios para determinar los coeficientes del polinomio, el grado del polinomio se reducirá (p. ej., se solicita polynomial5, pero solo hay 4 puntos, por lo tanto, se ajustará polynomial3).

3 Por ejemplo, ajustar funciones exponenciales o potenciales implica calcular log() de los valores de las métricas. Si los datos contienen ceros o números negativos, obtendrá un error ya que log() está definido solo para valores positivos.

4 Para los ajustes lineales, exponenciales, logarítmicos y potenciales, todos los cálculos necesarios se pueden escribir explícitamente. Para los polinomios, solo se puede calcular valor sin pasos adicionales. Calcular avg implica calcular la antiderivada polinómica (analíticamente). Calcular max, min y delta implica calcular la derivada polinómica (analíticamente) y encontrar sus raíces (numéricamente). Resolver f(t) = 0 implica encontrar raíces polinómicas (numéricamente).

5 Pero en este caso -1 puede hacer que su iniciador se recupere del estado del problema. Para estar completamente protegido, utilice: 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)