我有一个特定应用程序的状态通过 SNMP 报告为字符串。
当一切按预期工作时,监控会报告一个空字符串,而当某些数据源出现问题时,它会报告一个包含受影响数据源名称的字符串。
我希望当该字符串不为空时,将其作为警报/信息显示在 Zenoss 事件控制台上。
问题是,每当我向监控模板添加 SNMP 类型的数据源时,它都会采用数值。
这个想法是使用 StatusThreshold 来查看值何时发生变化。
这样的设置会导致事件控制台中不出现任何事件。
据我了解,阈值是根据 RRD 数据库中的值进行评估的,该值仅为数字,因此字符串会始终变成“NaN”。
Zenoss 的监控模板界面没有显示处理字符串的直观方法。该怎么做?
答案1
一个可能的解决方案非常简单,但在互联网上搜索会出现很多类似的问题,这些问题要么没有得到解答,要么最终采取了不同的方法,要么从一开始就是不同的问题。
Zenoss 提供了与 Nagios 插件集成的功能,如果您不知道这种集成如何工作,可能不会引起您的注意。
基本上,这意味着您可以调用任意命令,只要它返回退出代码 0 表示成功(清除事件)和 1、2 或 3 表示错误(生成事件),以及在 STDOUT 上返回格式正确的字符串。
有了这些信息,您可以编写一个简单的脚本,使用 读取您的 SNMP 数据snmpget
、对其进行解析并打印您希望在事件中显示的消息。
一个简单而通用的 Perl 示例可能是:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my ( $target, $oid, $msg ) = @ARGV;
my $value = `snmpget -v1 -c <comunity> $target $oid`;
$value =~ /STRING: "([^"]*)"/;
exit 0 unless $1;
say "$msg $1";
exit 1;
将其保存$ZENHOME/libexec/string_monitor
为 zenoss 服务器并
chmod +x $ZENHOME/libexec/string_monitor
然后在监控模板上,添加类型为 COMMAND 的数据源并填写命令模板字段,如下所示:
string_monitor ${here/manageIp} <OID> "Error reported on:"
如果你不熟悉 Zenoss,请记住以下几点:
如果您设置了一台 zenoss 服务器和多个收集器,这将从您设备所分配到的收集器调用,而不是从主服务器调用,因此请记住在所有收集器上都提供该脚本。当它尝试调用string_monitor
收集器但收集器不存在时,事件控制台上会出现一个事件,显示“代码:2 - 消息:滥用 shell 内置函数”
$ZENHOME/libexec/string_monitor
这很容易产生误导,因为当错误未被发现时,很容易暗示你的脚本有问题。:-)
如果您在设置数据源时使用“测试”按钮,这可能会特别令人困惑,在这种情况下,请求将从主服务器发出,并且它似乎可以工作,然后在控制台上显示上述错误。
此外,为了加快进程,您可能需要 ssh 进入收集器,sudo -i -uzenoss
然后运行zencommand run -d your.targetdevice.com -v 10
这应该会在该设备上生成完整运行,并且您的事件应该出现在事件控制台上(假设它不是空的)。
让它工作之后,您还可以将脚本中的实际数字数据传递到 Zenoss,打印行的格式为:
Error string to display|failing=7 warning=31 good=24
失败、良好和警告将作为该数据源上的数据点传递,您可以在其上使用 MinMax 阈值或绘制图形。
为了简单起见,我建议使用最小/虚拟脚本来开始工作,然后再从那里进行扩展:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
say "We got an error|my=1 sample=6 values=10";
exit 1;