Я задавал этот вопрос около недели на 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]
Но сейчас мне не везет ... что мне здесь не хватает?
Спасибо.
Спасибо 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 я пытался сделать:
error = 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, а затем получил его ...!
Спасибо!
Jsut пробовал с 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/
Также имейте в виду, что вы можете изменять различные лимиты Monit. https://mmonit.com/monit/documentation/monit.html#LIMITS
Если вы хотите выполнить обновление, Monit предоставляет предварительно скомпилированные общие двоичные файлы, которые я использую, чтобы иметь более новые версии, чем те, что находятся в репозиториях Ubuntu.