Я задавал этот вопрос около недели назад на 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 и получил ее...!
Спасибо!