[comment]: # ({c34725dc-f445d963})
# Funciones de trigger predictivas

[comment]: # ({/c34725dc-f445d963})

[comment]: # ({9dac6d6d-9dac6d6d})
#### Descripción general

A veces hay signos de un problema inminente. Estos signos pueden ser detectados para que se puedan tomar medidas con antelación para prevenir o al menos minimizar el impacto del problema.

Zabbix dispone de herramientas para predecir el comportamiento futuro del sistema monitorizado basándose en los datos históricos. Estas herramientas se implementan a través de funciones predictivas de trigger.

[comment]: # ({/9dac6d6d-9dac6d6d})

[comment]: # ({827f1d5f-24b155a7})
#### Funciones

Antes de configurar un trigger, es necesario definir qué es un estado de problema y cuánto tiempo se necesita para tomar medidas. Luego, hay dos formas de configurar un trigger que señale una posible situación no deseada. Primero: el trigger debe activarse cuando se espera que el sistema esté en un estado de problema después del "tiempo para actuar". Segundo: el trigger debe activarse cuando el sistema vaya a alcanzar el estado de problema en menos del "tiempo para actuar". Las funciones de trigger correspondientes a 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 trigger de la forma que prefiera con resultados similares.

[comment]: # ({/827f1d5f-24b155a7})

[comment]: # ({9f0f6aee-c80922f6})
#### Parámetros

Ambas funciones utilizan casi el mismo conjunto de parámetros. Utilice la lista de
[funciones soportadas](/manual/config/triggers/expression#functions) como referencia.

[comment]: # ({/9f0f6aee-c80922f6})

[comment]: # ({33e199b9-a93b071e})
##### Intervalo de tiempo

En primer lugar, debe especificar el período histórico que Zabbix debe analizar para obtener la predicción. Lo hace de la manera habitual mediante el parámetro `período de tiempo` y el desplazamiento de tiempo opcional, como lo hace con las funciones **avg**, **count**, **delta**, **max**, **min** y **sum**.

[comment]: # ({/33e199b9-a93b071e})

[comment]: # ({55d83c24-b922d0f2})
##### Horizonte de previsión

(**forecast** solamente)<br>
El parámetro `time` especifica hasta qué punto en el futuro Zabbix debe extrapolar las dependencias que encuentra en los datos históricos. No importa si utiliza `time_shift` o no, `time` siempre se cuenta a partir del momento actual.

[comment]: # ({/55d83c24-b922d0f2})

[comment]: # ({1ccaacd1-625c0c85})
##### Umbral a alcanzar

(**timeleft** solo)<br>
El parámetro `threshold` especifica un valor que el item analizado debe alcanzar,
sin importar si es desde arriba o desde abajo. Una vez que hemos determinado f(t)
(ver más abajo), debemos resolver la ecuación f(t) = `threshold` y devolver la
raíz que esté más cerca del momento actual y a la derecha del mismo, o
1.7976931348623158E+308 si no existe tal raíz.

::: notetip
Cuando los valores del item 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 el nivel `threshold`, si
existe. La mejor práctica es usar las predicciones como complemento de
los diagnósticos de problemas ordinarios, no como sustituto.^[1](#footnotes)^
:::

[comment]: # ({/1ccaacd1-625c0c85})

[comment]: # ({4d1deb86-976bd98e})
##### Funciones de ajuste

La función `fit` por defecto es la función *lineal*. Pero si su sistema monitorizado es
más complicado, tiene más opciones para elegir.

|`fit`|x = f(t)|
|-----|--------|
|*linear*|x = a + b\*t|
|*polynomialN*^[2](#footnotes)^|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*exponential*|x = a\*exp(b\*t)|
|*logarithmic*|x = a + b\*log(t)|
|*power*|x = a\*t^b^|

[comment]: # ({/4d1deb86-976bd98e})

[comment]: # ({3c1c1442-add67840})
##### Modos

(**forecast** solamente)<br>
Cada vez que se evalúa una función de trigger, obtiene datos del
período de historial 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 especificado en el futuro, no sabrá nada sobre cómo
se espera que se comporte el item analizado entre ahora y ese momento en el
futuro. Para algunas opciones de `fit` (como *polynomial*) un valor simple del
futuro puede ser engañoso.

|`mode`|**forecast** resultado|
|------|----------------------|
|*value*|f(now + `time`)|
|*max*|max~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*min*|min~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*delta*|*max* - *min*|
|*avg*|promedio de f(t) (now <= t <= now + `time`) según la [definición](https://en.wikipedia.org/wiki/Mean_of_a_function)|

[comment]: # ({/3c1c1442-add67840})

[comment]: # ({3f946ebf-5ff2285e})
#### 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 10^9^, la época al cuadrado es 10^18^, la precisión doble es de aproximadamente 10^-16^). Se añade 1 ns para proporcionar todos los valores de tiempo positivos para los ajustes *logarítmicos* y *de potencia* que implican calcular log(t). El desplazamiento de tiempo no afecta a los ajustes *lineales*, *polinomiales*, *exponenciales* (aparte de cálculos más fáciles y precisos), pero cambia la forma de las funciones *logarítmicas* y *de potencia*.

[comment]: # ({/3f946ebf-5ff2285e})

[comment]: # ({d180bad2-660cda6b})
#### Errores potenciales

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](#footnotes)^;
-   complicaciones numéricas (desafortunadamente, para algunos conjuntos de datos de entrada, el rango y la precisión del formato de coma flotante de doble precisión se vuelven insuficientes)^[4](#footnotes)^.

::: notetip
No se muestran advertencias ni errores si el ajuste elegido describe mal los datos proporcionados o si hay muy pocos datos para una predicción precisa.
:::

[comment]: # ({/d180bad2-660cda6b})

[comment]: # ({e57d3e18-06e0a230})
#### Ejemplos y manejo de errores

Para recibir una advertencia cuando esté a punto de quedarse sin espacio libre en disco en su host, puede usar una expresión de trigger 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 trigger en estado de problema. Generalmente esto es bueno porque recibe una advertencia de que sus predicciones no funcionan correctamente y debería revisarlas más a fondo para averiguar por qué. Pero a veces es malo porque -1 simplemente puede significar que no se obtuvieron datos sobre el espacio libre en disco del host en la última hora. Si está recibiendo demasiadas alertas falsas positivas, considere usar una expresión de trigger más complicada ^[5](#footnotes)^:

    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 trigger en estado de problema dependiendo de si tiene una expresión como `forecast(/host/item,(...))<...` o como `forecast(/host/item,(...))>...`

Además, -1 puede ser una predicción válida si es normal que el valor del item sea negativo. Pero la probabilidad de esta situación en el mundo real es insignificante (vea [cómo](/manual/config/triggers/expression) funciona el operador **=**). Así que agregue `... or forecast(/host/item,(...))=-1` o `... and forecast(/host/item,(...))<>-1` si desea o no desea tratar -1 como un problema respectivamente.

#### Notas al pie

^**1**^ Por ejemplo, un trigger simple como `timeleft(/host/item,1h,X) < 1h` puede entrar en estado de problema cuando el valor del item se acerca a X y luego recuperarse repentinamente una vez que se alcanza el valor X. Si el problema es que el valor del item está por debajo de X, use: `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` Si el problema es que el valor del item está por encima de X use: `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, use polinomios de mayor grado [con precaución](https://es.wikipedia.org/wiki/Fen%C3%B3meno_de_Runge). 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á (por ejemplo, se solicita *polynomial5*, pero solo hay 4 puntos, por lo tanto se ajustará *polynomial3*).

^**3**^ Por ejemplo, ajustar funciones *exponential* o *power* implica calcular log() de los valores del item. Si los datos contienen ceros o números negativos, obtendrá un error ya que log() solo está definido para valores positivos.

^**4**^ Para los ajustes *linear*, *exponential*, *logarithmic* y *power* todos los cálculos necesarios pueden escribirse explícitamente. Para *polynomial* solo se puede calcular *value* sin pasos adicionales. Calcular *avg* implica calcular la antiderivada del polinomio (analíticamente). Calcular *max*, *min* y *delta* implica calcular la derivada del polinomio (analíticamente) y encontrar sus raíces (numéricamente). Resolver f(t) = 0 implica encontrar raíces del polinomio (numéricamente).

^**5**^ Pero en este caso -1 puede hacer que su trigger se recupere del 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)`

[comment]: # ({/e57d3e18-06e0a230})
