我在Nagiosgraph上遇到了问题。我创建了一个 nagios 检查,它通过 SNMP 监控服务器/工作站上的流量,检查的输出是一个长字符串,如下所示:
OK - traffmon eth0:incoming:170KB:outgoing:1606KB eth1:incoming:1576KB:outgoing:170KB eth2:incoming:156:outgoing:0|lo;incoming;25;outgoing;25 tunl0;incoming;0;outgoing;0 gre0;incoming;0;outgoing;0 sit0;incoming;0;outgoing;0 eth0;incoming;170KB;outgoing;1606KB eth1;incoming;1576KB;outgoing;170KB eth2;incoming;156;outgoing;0
我对前三个接口感兴趣,这就是为什么我将 eth0,eth1,eth2 与带有接口的整个字符串分开(我认为是性能数据),并且我按照 http://www.novell.com/coolsolutions/feature/19843.html 上的说明进行操作,并且我在我的服务中.cfg
define serviceextinfo{
host_name workstation
service_description Throughput Monitor
action_url /nagiosgraph/cgi-bin/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$&db=eth0,incoming,outgoing,&geom=500x100&rrdopts%3D-l%200%20-u%2010000%20-t%20Traffic
}
在我的地图文件中,我写了这个来匹配我感兴趣的内容:
/output:.*traffmon ([0-9]+), ([0-9]+), ([0-9]+), ([0-9]+), ([0-9]+), ([0-9]+), ([0-9]+), ([0-9]+), ([0-9]+)/
and push @s, [ 'eth0',
['incoming', 'GAUGE', $2],
['outgoing', 'GAUGE', $3] ],
[ 'eth1',
['incoming', 'GAUGE', $5],
['outgoing', 'GAUGE', $6] ],
[ 'eth2',
['incoming', 'GAUGE', $8],
['outgoing', 'GAUGE', $9] ];
我想创建三个表(eth0,eth1,eth2),其中有两列(传入,传出),从那时起尝试很好地表示它们。问题是通常我的 rrd 文件会自动创建,但为此检查 rrd 文件夹中带有工作站名称的文件夹不会被创建,.rrd 文件也不会被创建,而且我觉得它与地图文件有关,也许匹配不起作用或其他什么(我这么说是因为我现在没有 perl)。任何建议不胜感激。谢谢
你可以试试这个正则表达式:
/traffmon eth0:incoming:(d+)(?:KB):outgoing:(d+)(?:KB) eth1:incoming:(d+)(?:KB):outgoing:(d+)(?:KB) eth2:incoming:(d+):outgoing:(d+)/
您可以在 rubular: http://rubular.com/r/vj7VXwDPPU 上对其进行测试
我不熟悉你的nagios系统是如何工作的,但如果有更多的perl代码的空间,你也可以做这样的事情:
my $res = 'OK - traffmon eth0:incoming:170KB:outgoing:1606KB eth1:incoming:1576KB:outgoing:170KB eth2:incoming:156:outgoing:0|lo;incoming;25;outgoing;25 tunl0;incoming;0;outgoing;0 gre0;incoming;0;outgoing;0 sit0;incoming;0;outgoing;0 eth0;incoming;170KB;outgoing;1606KB eth1;incoming;1576KB;outgoing;170KB eth2;incoming;156;outgoing;0';
my @s;
push @s, map {
my @f = split /:/;
[ $f[0], [$f[1], 'GAUGE', $f[2] ], [$f[3], 'GAUGE', $f[4]] ]
} (split(/ ||/, $res))[3..5];
print Dumper @s;
这会在空间或管道
:
处拆分字符串,获取第 3 到第 5 个元素(即前三个接口),然后与它们进行循环。它在冒号@s
上拆分,构建您的数据结构并为每个接口返回它。返回的数据结构被推入CC_4。
输出:
$VAR1 = [
'eth0',
[
'incoming',
'GAUGE',
'170KB'
],
[
'outgoing',
'GAUGE',
'1606KB'
]
];
$VAR2 = [
'eth1',
[
'incoming',
'GAUGE',
'1576KB'
],
[
'outgoing',
'GAUGE',
'170KB'
]
];
$VAR3 = [
'eth2',
[
'incoming',
'GAUGE',
'156'
],
[
'outgoing',
'GAUGE',
'0'
]
];