Monit: verwende content MATCH bei „Datei prüfen …“, falls Übereinstimmung „xxx“

Monit: verwende content MATCH bei „Datei prüfen …“, falls Übereinstimmung „xxx“

Ich habe diese Frage vor etwa einer Woche bei StackOverflow gestellt, aber bisher keine Antwort erhalten. Wahrscheinlich ist das nicht möglich, aber ich weiß nicht, wo ich nach der Antwort suchen soll. Ich hoffe, dass mir hier jemand helfen kann.

Ich verwende Monit, um Protokolle nach Fehlern zu durchsuchen und diese Warnungen dann an ein Überwachungssystem namens DataDog weiterzuleiten ...

Alles scheint wie erwartet zu funktionieren, aber jetzt muss ich herausfinden, was den Alarm verursacht.

Mithilfe einer sehr einfachen Regel kann ich die Zeilen im Protokoll abfangen, die diesen Fehler verursachen, und das entsprechende Skript ausführen, um eine Warnung auszulösen. Bis hierhin ist alles in Ordnung:

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"

Diese Konfiguration macht, was ich will, sie löst tatsächlich den Alarm aus, den ich wollte

Aber jetzt muss ich wissen, „was diesen Alarm verursacht hat“. Wenn also beispielsweise diese Zeile im Protokoll erscheint:

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

In den Überwachungsprotokollen kann ich Folgendes sehen:

[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

Das ist perfekt ... ich möchte Folgendes festhalten:

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

Um diesen String an mein Überwachungssystem (DataDog) zu senden, kann ich keine Dokumentation finden, die es mir tatsächlich erlaubt, denÜBEREINSTIMMEN content, oder Gruppen (was meines Wissens durch den MATCH-Regex unterstützt wird)

Also kurz gesagt:

Gibt es eine Überwachungsvariable (wie $DESCRIPTION für E-Mail), die auf die MATCHZeile verweist, die die Regel auslöst?

(Ich habe $DESCRIPTION, $HOST usw. ausprobiert, aber das scheint nur für E-Mail zu funktionieren)

Ich habe mehrmals bei Google nachgesehen (und auch hier), aber ich kann die Antwort nicht finden ...

Wenn Sie meinen, dass dieses Thema bereits angesprochen wurde, weisen Sie mich bitte in die richtige Richtung.

Ein Update:

Entschuldigen Sie, ich habe vergessen zu sagen, dass ich dies auf folgendem Computer ausführe:

 Ubuntu 16.04 LTS and 
 Ubuntu 12

Die Monit-Version ist:

Dies ist Monit Version 5.25.1, erstellt mit SSL, mit IPv6, mit Komprimierung, mit PAM und mit großen Dateien. Copyright (C) 2001–2017 Tildeslash Ltd. Alle Rechte vorbehalten.

Gemäß der Empfehlung von DevOps habe ich die Monit-Version aktualisiert.

Und versuchte zu verwendenMONIT_DESCRIPTIONoder$MONIT_DESCRIPTIONohne Erfolg sieht die Regeldatei so aus:

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

Ich möchte den Inhalt, der übereinstimmt, als zusätzliches Argument für das Programm dd_notify.py übergeben.

aber was ich bekomme ist (was das Ergebnis der Ausführung ist dd_notify.py):

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

was ich will ist$MONIT_DESCRIPTIONInhalt, der eigentlich ist:

[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]

Aber im Moment habe ich kein Glück ... was fehlt mir hier?

Danke schön.

Antwort1

Habe es gerade mit Monit 5.23.0 versucht und es gibt eine Umgebungsvariable dafür.

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

Monit gibt jedes Vorkommen des passenden Inhalts aus

Auch die Syntax wurde in Monit 5.16.0 geändert, ist aber immer noch funktionsfähig. Das Änderungsprotokoll ist hier verfügbar:https://mmonit.com/monit/changes/

Beachten Sie auch, dass Sie die verschiedenen Grenzen von Monit ändern könnenhttps://mmonit.com/monit/documentation/monit.html#LIMITS

Wenn Sie ein Upgrade durchführen möchten, stellt Monit vorkompilierte generische Binärdateien bereit, die ich verwende, um eine neuere Version als die in den Ubuntu-Repositorys zu haben.

Antwort2

Vielen Dank an DevOps, dass Sie mich auf den richtigen Weg gebracht haben, um dieses Problem zu lösen. Ich habe endlich das erreicht, was ich tun wollte, und kann (aus meiner Sicht) auch erklären, warum es bei mir vorher nicht funktioniert hat.

Die Sache ist, wie DevOps sagt, es gibt eine Variable MONIT_DESCRIPTION, die tatsächlich die Fehlerzeichenfolge enthält, aber diese Variable ist nur in der Bash-Umgebung „erreichbar“.

Wie ich es gemacht habe:

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 "

und von dd_notify.py aus habe ich versucht:

Fehler = os.environ['MONIT_DESCRIPTION']

aber ich bekam immer 'key_error', weil 'MONIT_DESCRIPTION' von Python aus nicht zugänglich war

dann habe ich versucht, mein Programm mit einem Bash-Wrapper wie folgt aufzurufen:

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

und im „wrapper.sh“-Code habe ich:

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

und dann habe ich gefunden, was ich gesucht habe:

{
  "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"
  }
}

Was großartig ist!

Ich konnte also grundsätzlich nicht von Python aus auf die Umgebungsvariable „Monit“ zugreifen, also habe ich sie in ein Bash-Skript gepackt und dann konnte ich sie abrufen …!

Danke schön!

verwandte Informationen