![]() |
This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved. |
1. Introducción
La monitorización de tareas que se procesan regularmente o bajo demanda, así como de procesos en ejecución permanente, puede realizarse, por ejemplo, analizando archivos de registro o de estado. Sin embargo, esto suele llevar asociado un esfuerzo adicional, ya que a menudo es necesario leer grandes volúmenes de datos para extraer poca información.
Para reducir este esfuerzo, Checkmk ofrece la opción de que un programa escriba la salida directamente en un archivo con formato de agente Checkmk. Almacenados en el llamado directorio spool, el agente recopila todos estos archivos e integra su contenido en la salida del agente. El método que utiliza el directorio spool es útil, por ejemplo, para
el análisis periódico de archivos de registro,
la monitorización de copias de seguridad automáticas,
la creación y el check de las estadísticas de carga de una base de datos,
cuando el Plugin
mk-job
no es suficiente para el control de los cronjobs,el desarrollo de checks propios para comprobar la salida de muestras.
En Checkmk, el directorio de spool es compatible con los agentes de los siguientes sistemas operativos: Windows, Linux, AIX, FreeBSD, OpenWrt y Solaris.
Para asegurarte de que puedes utilizar esta función sin problemas, debes tener en cuenta algunos puntos.
2. Rutas del directorio de archivos
La ruta por defecto del directorio spool es /var/lib/check_mk_agent/spool/
en Linux y otros sistemas Unix, y C:\ProgramData\checkmk\agent\spool\
en Windows. En Linux y Unix puedes personalizar la ruta del directorio padre con la regla Agent rules > Installation paths for agent files (Linux, UNIX) y la opción Base directory for variable data (caches, state files) disponible allí.
Si estás trabajando en un host en monitorización, puedes filtrar de la salida del agente el directorio de spool configurado allí:
user@host:~$ check_mk_agent | grep SpoolDirectory
SpoolDirectory: /var/lib/check_mk_agent/spool
Checkmk utiliza un único directorio spool, cuyo propietario por defecto es root
. No se proporcionan múltiples directorios con diferentes propietarios. Sin embargo, puedes, por supuesto, crear archivos (inicialmente vacíos) en el directorio spool y hacer propietario a otro usuario, que podrá sobrescribir el contenido de su archivo.
3. Nombres y contenido de los archivos
Los archivos spool pueden contener salida de texto en cualquiera de los formatos procesados por Checkmk. Los archivos se añaden unos a otros en el orden presente en el directorio spool. La extensión de archivo utilizada no importa.
Si quieres utilizar un esquema numérico para la ordenación, antepón al nombre del fichero un guión bajo (_
), ya que los nombres de ficheros que empiezan por números sirven como check de antigüedad. Los ficheros que empiezan por un punto se ignoran.
Para evitar confusiones en el contenido concatenado de los archivos, cada archivo spool debe
empezar con un título de la sección, es decir, una línea encerrada entre
<<<
y>>>
- incluso si en el fichero sólo se utiliza el formato local check,terminar con una nueva línea.
Así, un local check que proporciona un servicio de forma inmediata puede tener el siguiente aspecto:
<<<local>>>
0 "Spool Test Dummy" - This static service is always OK
Del mismo modo, puedes dejar salidas que requieran un Plugin de check en el lado de Checkmk:
<<<waterlevels>>>
rainbarrel 376
pond 15212
pool 123732
3.1. Terminación de secciones piggyback
Si utilizas secciones piggyback en un archivo, termínalo con la línea <<<<>>>>
. Ésta es la única forma de garantizar que, si cambia el orden de lectura, la salida que sigue a la salida piggyback se reasigne al propio host.
4. Comprobación de la antigüedad de los archivos
Si un programa puede escribir correctamente en su archivo de salida, todo es estupendo, independientemente de si se ha procesado correctamente o no. Pero, ¿qué ocurre si un programa aborta antes de escribir en el disco, o un error del sistema de archivos impide que se escriban nuevos archivos?
Para esta situación tienes la opción de anteponer al nombre del archivo un número entero, por ejemplo 600MyCronjob
. En este caso, el número se interpretará como la antigüedad máxima del archivo en segundos. Si el archivo es mayor, el agente lo ignorará y el servicio asociado en Checkmk cambiará al estado DESCONOCIDO debido a la falta de salida. En el ejemplo de un archivo llamado 3900_hourly_cleaner.txt
, el número se elige así adecuadamente para un cronjob que se ejecuta cada hora, para el que se espera un tiempo de ejecución inferior a cinco minutos.
5. Un ejemplo práctico
Supongamos que ejecutas un servicio en el que los usuarios inician y cierran sesión. En los archivos de registro del servicio, encontrarás líneas de los tres tipos siguientes:
21/Oct/2022:12:42:09 User harrihirsch logged in from 12.34.56.78
21/Oct/2022:12:42:23 User zoezhang logged out after 10 min idle
21/Oct/2022:13:00:00 Current user count: 739
El proceso no escribe la línea con Current user count
después de cada inicio de sesión/cierre de sesión, sino a intervalos fijos. Si el número de líneas del archivo de registro es lo suficientemente bajo como para leerlo rápidamente, puedes programar un local check. Este check lee todo el archivo de registro línea por línea cada vez y siempre establece el recuento de usuarios al valor mostrado en las apariciones de la línea Current user count
. En las apariciones de las líneas logged in
y logged out
aumenta o disminuye el recuento de usuarios. Al final, tu check imprime una línea similar a la siguiente:
1 "Frobolator User Count" count=1023 Watch out! Limit nearly used up.
A medida que tu servicio se hace más popular, el local check se ejecuta cada vez durante más tiempo, hasta que llega un momento en que esta solución, e incluso ejecutarla como un plugin de agente asíncrono, deja de ser práctica. Aquí es donde el uso adecuado del directorio de spool puede aumentar drásticamente la eficacia de la ejecución del check. En los próximos párrafos, te mostraremos cómo modificar el programa que ha estado proporcionando tu local check para que haga un uso eficaz del directorio de spool.
En primer lugar, el programa no debe terminar por sí mismo cuando llegue al final del archivo, sino escribir un archivo spool que contenga el estado actual determinado del servicio cuando el archivo de registro se evalúe por completo:
<<<local>>>
2 "Frobolator User Count" count=1200 Maximum number of users reached!
A continuación, deja que tu programa espere durante un cierto periodo de tiempo -unos segundos o varios minutos-, que dependerá de la frecuencia de las nuevas entradas de registro que se añadan. A continuación, deberá evaluar sólo las nuevas líneas añadidas y volver a calcular el estado. Si las cifras han cambiado, volverá a escribir el archivo spool.
Programa este procedimiento como un bucle sin fin. Para detectar un posible crash de este programa, debes dar al archivo spool el nombre correspondiente, por ejemplo 1800_frobolator.txt
- si 30 minutos sin actualizar el archivo spool indican problemas con el servicio o con el programa evaluador.
En lugar del directorio de plugins del agente, inicia ahora el programa como daemon utilizando las opciones de tu sistema operativo. Presta atención aquí al reinicio automático, si el programa se crashea o se termina. Muchas aplicaciones de servidor también proporcionan la opción de canalizar la salida de registro a otro programa en lugar de o además de escribir archivos de registro normales. Utilizar este mecanismo para un script de evaluación que escriba archivos spool también es una buena idea.
6. Algunos puntos a tener en cuenta
La lectura de archivos puede tener otros inconvenientes en comparación con el inicio habitual de procesos por parte del agente. Ten en cuenta los siguientes puntos para un funcionamiento sin problemas.
6.1. Juego de caracteres
Checkmk espera que la salida del agente esté codificada exclusivamente en UTF-8 (sin Byte Order Mark / BOM) con una simple línea nueva (0x0A
o \n
) como salto de línea. Las desviaciones pueden, en el peor de los casos, provocar que la salida del agente no pueda leerse más allá del primer carácter de un archivo spool con formato incorrecto. Concretamente, esto significa:
Especialmente en los sistemas Windows y Linux más antiguos, asegúrate de que los archivos spool no se escriben en la codificación Windows 1250 a 1258 o ISO 8859. Si esto es inevitable, asegúrate de que sólo se utiliza la intersección a UTF-8 - ASCII de 7 bitsde facto.
Especialmente en los sistemas Windows más recientes, asegúrate de que los archivos spool no se escriben en la codificación UTF-16 que allí se utiliza como estándar.
No utilices BOM. En particular, los lenguajes de script en Windows suelen escribir automáticamente esta secuencia de caracteres, que indica la codificación utilizada, en los archivos de salida. En la salida del agente, impide que
<<<
aparezca al principio de una línea.Utiliza la nueva línea de salto de línea de Unix (
0x0A
o\n
). De nuevo, Windows suele utilizar la cadenaCRLF
(0x0D 0x0A
o\r\n
).
Si un archivo spool provoca un comportamiento no deseado, examina sus primeras líneas con un editor hexadecimal:
0xFF 0xFE
indica un archivo codificado en UTF-16: En este caso, cambia tus scripts para que salgan en UTF-8.0xEF 0xBB 0xBF
indica UTF-8 con lista de materiales: en este caso suele bastar con escribir el archivo sin lista de materiales en el futuro.
6.2. Soft links y tuberías con nombre
En principio, los archivos del directorio de spool también pueden ser soft links o named pipes. Hay que tener en cuenta que la comprobación de la antigüedad a través de los nombres de archivo no funciona en este caso, porque se evalúa la antigüedad del soft link o de la propia named pipe, y no la antigüedad de los datos escritos. En el caso de las named pipes, también debes asegurarte de que el proceso que escribe en la pipe siempre suministra datos. Si no se suministran datos, el agente Checkmk esperará eternamente y acabará agotando el timeout.
Si necesitas permitir que usuarios sin privilegios escriban en archivos spool, crea archivos vacíos para estos usuarios y establece su propiedad en consecuencia. Estos usuarios pueden entonces establecer un soft link por su cuenta o escribir directamente en el archivo spool.
6.3. Bloqueo y almacenamiento
Cuando se escriben programas más largos que escriben varias líneas de estado en un archivo spool, resulta tentador abrir el archivo de salida escribiendo cuando se inicia el programa. Sin embargo, en este caso el archivo permanecerá completamente vacío hasta que se vacíe primero el búfer de escritura y se escriba en el destino, y estará incompleto hasta que el programa de escritura haya cerrado el archivo. Lo mismo ocurre si se bloquea un archivo exclusivamente mientras dura una operación de escritura larga.
Por esta razón, deberías escribir en el archivo de salida sólo cuando todo el contenido a escribir esté disponible, o escribir en un archivo temporal que luego copiarás en el directorio spool - o respectivamente, utilizar cat
para transferir el contenido de un archivo temporal a uno existente en el directorio spool.
6.4. Mantener una vista general
Otro problema puede ocurrir cuando distintos programas intentan escribir en archivos con el mismo nombre. Con muchos archivos spool, es fácil perder la pista de qué programa escribe realmente en qué archivo spool. En particular, si un archivo spool formateado incorrectamente hace que parte de la salida del agente quede inutilizable, esto es muy molesto y puede dar lugar a una búsqueda que lleve mucho tiempo.
Puedes mantener el orden creando un archivo con el mismo nombre - precedido por un punto - para cada archivo spool, que contenga información sobre el trabajo y una persona de contacto, si procede. El contenido de este archivo oculto no se transfiere con él.