Monit: use el contenido COINCIDIR en "verificar archivo ..." si coincide con "xxx"

Monit: use el contenido COINCIDIR en "verificar archivo ..." si coincide con "xxx"

Hice esta pregunta hace aproximadamente una semana en StackOverflow, pero todavía no tengo respuesta, probablemente no sea posible, pero no sé dónde buscar esa respuesta, espero que alguien pueda ayudar aquí.

Estoy usando monit para escanear registros en busca de errores y luego enviar esas alertas a un sistema de monitoreo llamado DataDog...

Todo parece funcionar como se esperaba, pero ahora necesito detectar qué está causando la alarma.

Usando una regla muy simple, puedo capturar la línea en el registro que provoca este error y ejecutar el script específico para alertar; hasta aquí todo ok:

montirc file:

check file testmonit with path /var/log/testmonit.log
      if MATCH "(ERROR.*)" then
         exec "/usr/bin/python /opt/scripts/bin/dd_notify.py test-error"

Esta configuración hace lo que quiero, en realidad genera la alarma que quería.

Pero ahora necesito saber "Qué causó esta alarma"; así, por ejemplo, si esta línea aparece en el registro:

ERROR failure to complete process due lock file....

En los registros de monit puedo ver:

[UTC Mar  6 11:59:08] error    : 'testmonit' content match [ERROR failure to complete process due lock file....]
[UTC Mar  6 11:59:08] info     : 'testmonit' exec: /usr/bin/python

Lo cual es perfecto... lo que quiero es capturar esto:

[ERROR failure to complete process due lock file....]

Para enviar esta cadena a mi sistema de monitoreo (DataDog), no puedo encontrar ninguna documentación que realmente me permita usar elFÓSFORO content, o grupos (que puedo ver está siendo compatible con la expresión regular MATCH)

En resumen:

¿Hay alguna variable monit (como $DESCRIPCIÓN para correo) que haga referencia a MATCHla línea que activa la regla?

(He probado $DESCRIPTION, $HOST...etc pero esto parece funcionar sólo para el correo electrónico)

Busqué en Google varias veces (y también aquí) pero no encuentro la respuesta...

Por favor, si cree que esto se ha solucionado antes, no dude en indicarme la dirección correcta.

Una actualización:

Lo siento, olvidé decir que estoy ejecutando esto en:

 Ubuntu 16.04 LTS and 
 Ubuntu 12

La versión de Monit es:

Esta es la versión 5.25.1 de Monit Construida con ssl, con ipv6, con compresión, con pam y con archivos grandes Copyright (C) 2001-2017 Tildeslash Ltd. Todos los derechos reservados.

Siguiendo la recomendación de DevOps, actualicé la versión monit.

Y traté de usarMONIT_DESCRIPCIÓNo$MONIT_DESCRIPTIONsin éxito el archivo de reglas es así:

check file pd-error with path /var/log/testmonit.log if CONTENT = "ERROR" then exec "/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error " $MONIT_DESCRIPTION

Lo que quiero es pasar el contenido que ha coincidido como argumento adicional para el programa dd_notify.py;

pero lo que obtengo es (que es el resultado de ejecutar dd_notify.py):

{ "ALARM": { "pd_error": 67 }, "MESSAGES": { "pd_error": "$MONIT_DESCRIPTION" } }

lo que quiero es$MONIT_DESCRIPTIONcontenido que en realidad es:

[UTC Apr 3 21:53:22] debug : 'pd-error' Pattern 'ERROR' match on content line [Apr 3 21:52:30 ams01 MainProcess[1376]: cel ery.worker.job ERROR Task tasks.telemetry.gather_and_send_telemetry_info[f090d579-9ec2-40e5-9fb2-91436eb4fc8a] fail]

Pero de momento no estoy teniendo suerte... ¿qué me falta aquí?

Gracias.

Respuesta1

Jsut probó con Monit 5.23.0 y hay una variable de entorno para ello.

MONIT_DESCRIPTION=content match:
[ERROR failure to complete process due lock file....]
[ERROR failure to complete process due lock file....]

Monit generará cada aparición del contenido coincidente.

Además, la sintaxis modificada en Monit 5.16.0, pero anterior, sigue siendo funcional. El registro de cambios está disponible aquí:https://mmonit.com/monit/changes/

También tenga en cuenta que puede cambiar los distintos límites de Monithttps://mmonit.com/monit/documentation/monit.html#LIMITS

Si está dispuesto a actualizar, Monit proporciona archivos binarios genéricos precompilados que estoy usando para tener versiones más nuevas que las de los repositorios de Ubuntu.

Respuesta2

Gracias a DevOps por ponerme en el camino correcto para terminar con este problema. Finalmente logré lo que quería hacer y también puedo explicar (según tengo entendido) por qué no me funcionaba antes.

La cosa es que, como dice DevOps, hay una variable MONIT_DESCRIPTION que de hecho tiene la cadena de error, pero esta variable solo es "accesible" en el entorno bash.

Como estaba haciendo:

check file pd-error with path /var/log/testmonit.log
if CONTENT = "ERROR" then exec "/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error "

y desde dd_notify.py estaba intentando hacer:

error = os.environ['MONIT_DESCRIPTION']

pero siempre recibía 'key_error' porque 'MONIT_DESCRIPTION' no era accesible desde Python

luego intenté llamar a mi programa usando un contenedor bash como:

check file pd-error with path /var/log/testmonit.log
  if CONTENT = "ERROR" then exec "/bin/bash /opt/scripts/bin/wrapper.sh"

y en el código 'wrapper.sh' tengo:

/usr/bin/python /opt/scripts/bin/dd_notify.py pd_error

y luego obtuve lo que estaba buscando:

{
  "ALARM": {
    "pd_error": 294
  }, 
  "MESSAGES": {
    "pd_error": "content match:\nMay 16 18:07:08 ams01 MainProcess[1358]: celery.worker.job ERROR Task fds.realtime.tasks.telemetry.gather_and_send_telemetry_info[abe35540-55ef-40db-984a-
12287f5648ab] raised unexpected: ConnectionError()#012Traceback (most recent call last):#012  File \"/usr/lib/python2.7/dist-packages/celery/app/trace.py\", line 240, in trace_task#012   
 R = retval = fun(*args, **kwargs)#012  File \"/usr/lib/python2.7/dist-packages/celery/app/trace.py\", line 438, in __protected_call__#012    return self.run(*args, **kwargs)\n...\n"
  }
}

¡Lo cual es genial!

Básicamente, no pude acceder a la variable de entorno monit desde Python... ¡así que lo envolví en un script bash y luego lo obtuve...!

¡Gracias!

información relacionada