[comment]: # translation:outdated

[comment]: # ({f445d963-f445d963})
# 7 Funciones predictivas de iniciador

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

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

A veces hay signos del problema que se avecina. Estos signos pueden ser
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 la predicción
funciones de disparo.

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

[comment]: # ({dc6741c9-24b155a7})
#### 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.

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

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

Ambas funciones utilizan prácticamente el mismo conjunto de parámetros. Utilice la lista de
[funciones admitidas](/manual/appendix/functions) como referencia.

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

[comment]: # ({33e199b9-a93b071e})
##### 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**.

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

[comment]: # ({cf6b2333-b922d0f2})
##### Horizonte de pronóstico

(solo **forecast**)\
El parámetro `time` especifica qué tan lejos en el futuro Zabbix debe
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.

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

[comment]: # ({17723823-625c0c85})
##### 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.

::: notetip
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](#footnotes)^
:::

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

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

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

|`ajuste`|x = f(t)|
|-----|--------|
|*lineal*|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]: # ({b75f1e85-add67840})
##### 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áx~ahora\ <=\ t\ <=\ ahora\ +\ `tiempo`~ f(t)|
|*min*|mín~ahora\ <=\ t\ <=\ ahora\ +\ `tiempo`~ f(t)|
|*delta*|*max* - *min*|
|*avg*|promedio de f(t) (ahora <= t <= ahora + `tiempo`) según [definición](https://en.wikipedia.org/wiki/Mean_of_a_function)|

[comment]: # ({/b75f1e85-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^, el cuadrado de la época es 10^18^, 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*.

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

[comment]: # ({4c0382f7-660cda6b})
#### 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](#footnotes)^.

::: notetip
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.
:::

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

[comment]: # ({f5dc222d-06e0a230})
#### 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 activación 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](#footnotes)^:

    timeleft(/host/vfs.fs.size[/,free],1h,0)<1h y 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](/manual/config/triggers/expression) 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](https://en.wikipedia.org/wiki/Runge's_phenomenon). 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 y ({TRIGGER.VALUE}=0 y timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 o {TRIGGER.VALUE}=1)`

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