Monit: использовать содержимое MATCH для «проверить файл …», если соответствует «xxx»

Monit: использовать содержимое MATCH для «проверить файл …», если соответствует «xxx»

Я задавал этот вопрос около недели назад на StackOverflow, но ответа пока нет, вероятно, это невозможно, но я не знаю, где искать этот ответ, надеюсь, кто-нибудь здесь сможет помочь.

Я использую monit для сканирования журналов на наличие ошибок, а затем отправляю эти оповещения в систему мониторинга DataDog...

Кажется, все работает как надо, но теперь мне нужно выяснить, что именно вызывает тревогу.

Используя очень простое правило, я могу отловить строку в журнале, которая вызывает эту ошибку, и запустить специальный скрипт для оповещения; пока все в порядке:

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"

Эта конфигурация делает то, что я хочу, она на самом деле поднимает тревогу, которую я хотел.

Но теперь мне нужно знать, «что вызвало эту тревогу»; например, если в журнале появляется следующая строка:

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

В журналах мониторинга я вижу:

[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

И это прекрасно... Я хочу запечатлеть это:

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

Чтобы отправить эту строку в мою систему мониторинга (DataDog), я не могу найти никакой документации, которая фактически позволяет мне использоватьСООТВЕТСТВОВАТЬ contentили группы (которые, как я вижу, поддерживаются регулярным выражением MATCH)

Итак, вкратце:

Есть ли какая-нибудь переменная monit (например, $DESCRIPTION для почты), которая ссылается на MATCHстроку, запускающую правило?

(Я пробовал $DESCRIPTION, $HOST... и т. д., но это, похоже, работает только для электронной почты)

Я несколько раз заглядывал в Google (и сюда тоже), но не могу найти ответ...

Если вы считаете, что этот вопрос уже обсуждался, пожалуйста, укажите мне верное направление.

Обновление:

Извините, я забыл сказать, что я использую это на:

 Ubuntu 16.04 LTS and 
 Ubuntu 12

Версия Monit:

Это Monit версии 5.25.1, созданный с использованием SSL, IPv6, сжатия, PAM и больших файлов. Авторские права (C) 2001-2017 Tildeslash Ltd. Все права защищены.

Следуя рекомендациям DevOps, я обновил версию monit.

И пытался использоватьMONIT_DESCRIPTIONили$MONIT_DESCRIPTIONбез успеха файл правил выглядит так:

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

Мне нужно передать совпавшее содержимое в качестве дополнительного аргумента для программы dd_notify.py;

но вот что я получаю (что является результатом выполнения dd_notify.py):

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

то, что я хочу, это$MONIT_DESCRIPTIONсодержание, которое на самом деле:

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

Но сейчас мне не везет... Что я упускаю?

Спасибо.

решение1

Только что попробовал Monit 5.23.0, для него есть переменная окружения.

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

Monit выведет все вхождения соответствующего контента

Также синтаксис изменился в Monit 5.16.0, но старый все еще функционален. Список изменений доступен здесь:https://mmonit.com/monit/changes/

Также имейте в виду, что вы можете изменить различные лимиты Monithttps://mmonit.com/monit/documentation/monit.html#ОГРАНИЧЕНИЯ

Если вы готовы выполнить обновление, Monit предоставляет предварительно скомпилированные универсальные двоичные файлы, которые я использую, чтобы иметь более новые версии, чем те, что есть в репозиториях Ubuntu.

решение2

Спасибо DevOps за то, что направили меня на верный путь к решению этой проблемы. Я наконец-то добился того, чего хотел, и теперь могу объяснить (на основе своего понимания), почему у меня это не работало раньше.

Дело в том, что, как говорит DevOps, есть переменная MONIT_DESCRIPTION, которая фактически содержит строку ошибки, но эта переменная «доступна» только в среде bash.

Как я это делал:

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 "

и из dd_notify.py я пытался сделать:

ошибка = os.environ['MONIT_DESCRIPTION']

но я всегда получал «key_error», потому что «MONIT_DESCRIPTION» не был доступен из Python

затем я попытался вызвать свою программу, используя обертку bash, например:

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

и в коде 'wrapper.sh' у меня есть:

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

и вот я получил то, что искал:

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

И это здорово!

По сути, я не смог получить доступ к переменной окружения monit из Python... поэтому я обернул ее в скрипт bash и получил ее...!

Спасибо!

Связанный контент