Мониторинг поведения регулярного выражения содержимого ответа http

Я использую стек Logstash + Elasticsearch для объединения журналов из нескольких взаимосвязанных приложений.

Я пытаюсь заставить Monit предупреждать всякий раз, когда слово «ОШИБКА» возвращается как часть запроса Elasticsearch REST от Monit, но проверка регулярного выражения «контент», похоже, не работает для меня. (Я отправляю оповещения по электронной почте и SMS из Monit через M/Monit.)

Я знаю, что мои экземпляры Monit и M/Monit настроены правильно, потому что я могу получать оповещения об эхо-запросах сервера, изменениях контрольной суммы файлов и т. д. просто отлично.

Мой HTTP-запрос Monit Elasticsearch выглядит следующим образом:

check host elasticsearch_error with address 12.34.56.789
    if failed 
      url http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-2d 
      and content = "ERROR" 
    then alert

Кстати, %20 экранирует "пробел", %3A экранирует ":"

В моем logstash есть только записи журнала ошибок, которым от одного до двух дней. то есть, когда я бегу

http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-2d

в браузере я вижу ошибки (со словом "ОШИБКА") в теле ответа, но когда я запускаю

http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-1d

Я не. (Обратите внимание на разницу в один день.) Это ожидаемое поведение. Примечание. Тело моего ответа представляет собой JSON со строкой «ERROR» в дочернем элементе на несколько уровней ниже. Я не знаю, влияет ли это на то, как Monit обрабатывает регулярное выражение.

Когда я запускаю проверку, как указано выше, я вижу

'elasticsearch_error' failed protocol test [HTTP] at 
INET[12.34.56.789:9200/_search
q=severity%3AERROR%20AND%20timestamp%3A>now-2d] 
via TCP -- HTTP error: Regular expression doesn't match:
regexec() failed to match

в журнале. Хорошо. Содержание == "ОШИБКА" верно. Я могу предупредить об этом (хотя я нахожу сообщение Connection failed на панели мониторинга браузера Monit немного раздражающим... должно быть что-то вроде Regex failure.)

Проблема

Когда я «мониторю перезагрузку» и запускаю проверку с помощью

url http://12.34.56.789:9200/_search?q=severity%3AERROR%20AND%20timestamp%3A>now-1d

Я ВСЕ ЕЩЕ получаю ошибку regexec() failed to match, как указано выше. Обратите внимание, я не возвращаю строку «ERROR» в теле ответа. Содержание == "ОШИБКА" ложно. Почему эта проверка не проходит? Любой свет, пролитый по этому вопросу, будет оценен!

Ответ

Оказывается, эта проблема связана с кодировкой URL для запроса Elasticsearch.

Я использовал url http://12.34.56.789:9200/_search?q=severity:ERROR&timestamp:>now-36d в чеке, чтобы заставить Monit сделать запрос, который выглядит как 12.34.56.789:9200/_search?q=severity:ERROR&timestamp:%3Enow-36d. Обратите внимание на изменение кодировки. Кажется, это работает.

Фактический URL-адрес, используемый monit, можно увидеть, запустив monit в режиме отладки с помощью monit -vI.

Дополнительный вопрос

Объект 'content', похоже, учитывает '=', '==' и '!='. '=' упоминается в документации, но во многих сторонних примерах используется '=='. Какое самое правильное использование?

Ответ на дополнительный вопрос

Полезные люди из команды M/Monit сообщают, что «=» — это псевдоним для «==» в файле конфигурации Monit.


person Peter Bloom    schedule 04.03.2015    source источник
comment
serverfault .com/questions/308107/   -  person Peter Bloom    schedule 04.03.2015


Ответы (1)


Я добавил решение, которое нашел, к моему вопросу выше.

person Peter Bloom    schedule 16.03.2015