Как настроить текст сообщения Мунина
Итак, я использую munin для мониторинга пары сотен серверов, и мне это нравится. Я пытаюсь настроить текст предупреждения, чтобы он выглядел немного иначе, и я не понимаю, как заставить его делать то, что я хочу.
Я прочитал http://guide.munin-monitoring.org/en/latest/tutorial/alert.html и http://munin-monitoring.org/wiki/MuninAlertVariables и у меня нет проблем с переменными и т. Д. Я хочу изменить синтаксис. Более конкретно, вот форматирование текста по умолчанию из модуля perl:
'${var:group} :: ${var:host} :: ${var:graph_title}${if:cfields \n\tCRITICALs:${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.}${if:wfields \n\tWARNINGs:${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.}${if:ufields \n\tUNKNOWNs:${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}${if:fofields \n\tOKs:${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}\n',
как указано в приведенном выше документе, это будет выводить что-то вроде этого:
dev:: hostname.dev:: Использование памяти ОК: обмен 779112448.00.
В настоящее время я переписал форматирование как:
${if:cfields CRITICAL} ${if:wfields WARNING} ${if:fofields OK} '${var:group} :: ${var:host} :: ${var:graph_title}\n${if:cfields CRITICAL :${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.\n\t}${if:wfields WARNING :${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.\n\t}${if:ufields UNKNOWN :${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.\n\t}${if:fofields OK :${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}'
Причина этого заключается в том, что я хочу, чтобы уровень серьезности отображался первым в порядке от наиболее серьезного до наименее серьезного.
Выходные данные выглядят примерно так, и тогда я могу довольно хорошо отфильтровать сообщения по их серьезности.
'CRITICAL':'dev:: hostname.dev:: Использование памяти CRITICAL: swap is 1706340352.00 (вне диапазона [:1000000000]).'
Это "функционирование" для того, что я хочу с точки зрения серьезности, но я бы хотел сделать его более красивым, потому что некоторые сообщения приходят одновременно с CRITICAL и WARNING и OK, и в итоге выглядят так:
'ПРЕДУПРЕЖДЕНИЕ': 'ОК, dev:: hostname.dev.....
Я знаю, почему это так, логика в моем формате говорит: "Если есть cfield, выведите CRITICAL. Затем, если есть wfield, выведите WARNING..." и т. Д. Я бы хотел, чтобы он выводил только самые серьезные из трех, а не 2 или все три, если они все существуют.
В моем мозгу я могу придумать логику для этого (если есть cfields, выведите CRITICAL, если нет cfields, и есть wfields, выведите WARNING, если нет cfields или wfields, но есть поля, затем выведите OK.) Однако я понятия не имею, в каком методе форматирования или на каком языке это написано. Munin, программа написана на Perl, но я не могу найти в Интернете ничего, ссылающегося на этот синтаксис в Perl или на любом другом языке по этому вопросу. (мой гугл-фу не должен быть сильным сегодня).
Итак, кто-нибудь знает, как помочь мне здесь? TLDR, в этом синтаксисе (где ${if:cfields CRITICAL} означает, что если c-поля существуют, то выведите CRITICAL), как правильно написать: если c-поля не существуют, а w-поля существуют, ЗАТЕМ печатать ПРЕДУПРЕЖДЕНИЕ.
ТИА
1 ответ
Допустимый синтаксис для расширения можно увидеть в message_expand
функция в LimitsOld.pm
, Насколько я могу судить, он не реализует достаточно структур управления, чтобы делать то, что вы хотите.
Альтернативный подход состоит в том, чтобы передавать уведомления через посредника (например, Nagios или сценарий вашего собственного изобретения) и применять там логику / переформатирование.