如何自定义警报消息文本

所以,我用munin来监视几百台服务器,我喜欢它。 我试图调整警报文本看起来有点不同,但我不理解如何得到它做我想要的。

我已经阅读http://guide.munin-monitoring.org/en/latest/tutorial/alert.html和http://munin-monitoring.org/wiki/MuninAlertVariables和variables等没有问题,我想改变语法。 更具体地说,这里是默认的文本格式化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 ::内存使用情况OKs:swap是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是1706340352.00(范围[:1000000000]以外)。

这是“function”,我想要的严重程度,但我想使它更漂亮,因为一些消息同时通过关键和警告,所有在同一时间,最终看起来像这样:

'WARNING':'OK dev :: hostname.dev …..

我知道这是为什么,我的格式逻辑说:“如果有cfield,输出CRITICAL。那么如果有wfield,输出WARNING …”等我希望它只输出三个最严重的而不是2或全部三个,如果他们都存在。

在我的大脑中,我可以想出它的逻辑(如果有c场,输出CRITICAL,如果没有c场,并且有w场,输出WARNING,如果没有c场或w场,但有场,然后输出OK。)但是,我不知道这是写在什么格式的方法或语言。Munin这个程序全部是用Perl编写的,但是在Perl或者其他任何语言中我都找不到在线的任何东西(我的谷歌福今天不能强大)。

那么,有没有人知道如何帮助我? TLDR,在这种语法(其中$ {if:cfields CRITICAL}意味着IF cfields存在,然后print CRITICAL)什么是正确的写法:IF cfields不存在并且wfields存在THEN打印WARNING。

TIA

可以在LimitsOld.pmmessage_expand函数中看到扩展的允许语法。 据我所知,它没有实现足够的控制结构来做你想做的事情。

另一种方法是通过中介(例如Nagios或你自己devise的脚本)传递通知,并在那里应用逻辑/重新格式化。