Munin broadband_插件没有显示数据

Munin broadband_插件没有显示数据

我正在尝试使用 Munin 绘制接口上的累积带宽图。

显然有一个bandwidth_插件可以实现这个功能(见http://munin-monitoring.org/browser/munin-contrib/plugins/network/bandwidth_),我已经安装了它并且已经运行了几个星期了。

我原本希望看到一些漂亮的图表,但一切都被设置为“0”。

当执行时munin-run,我也会得到空值:

# munin-run bandwidth_br0
average.value  0
monthly.value 0
30dayusage.value  0

所以我尝试看一下代码:

open( my $rx, "<", "/sys/class/net/$interface/statistics/rx_bytes" )
     || die "Unable to read: $!";
$counter_input = <$rx>;
chomp $counter_input;

...并且输出一个不断增加的值,就像它应该的那样:

# cat /sys/class/net/br0/statistics/rx_bytes
2095478809

我的state文件包含以下信息:

pst0^D^H^H12345678^D^H^H^H^C+
^@^@^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1398125584^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1398037387^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1398331077^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output
^@^@^@1397950990^D^C^B^@^@^@^H<80>^E^@^@^@input^H<80>^F^@^@^@output

有人知道问题出在哪里或如何进一步调试吗?

在 Ubuntu Saucy 上使用 munin 2.0.17。

答案1

我写了这个插件。

这是我用来转储存储文件内容的脚本。我还想知道自我发现是否为您确定了正确的接口。

#!/usr/bin/perl

use Storable;
use Data::Dumper;
my $file="/var/lib/munin-node/plugin-state/nobody/bandwidth_eth1.state";
my $dump;
my $perf_ref;



my $store_ref = retrieve($file);
while (my ($key, $value) = each(%$store_ref) ) {
    $perf_ref->{$key} = $value;
}

foreach $key (sort keys %$perf_ref) {
if ($key =~ /last/) {
       print "$key\n";
    } else { 
   print scalar(localtime($key)) . "\n";
    }
print Dumper($perf_ref->{$key}) . "\n";
}

看起来您正在尝试测量虚拟接口 br0。监控物理接口可能更好。我查看了我拥有的一个桥接接口,结果很奇怪。接收计数器正在顺利增加,而传输从未改变,即使我对其进行 ping 也是如此。

答案2

我在使用 Ubuntu 14.04 的插件修订版 1.37 时遇到了同样的问题。

我尝试通过让 perl 检查脚本来追踪它:

perl -Mstrict -cw bandwidth_

它抱怨 split 的一些奇怪用法。我相信 split 需要一个变量来分配返回值。可能在最近的某个版本的 perl 中对此进行了更改。该脚本有点过时了。

Useless use of split in void context at bandwidth_ line 130.
Useless use of split in void context at bandwidth_ line 132.
Scalar value @_[0] better written as $_[0] at bandwidth_ line 212.
Useless use of split in void context at bandwidth_ line 211.

我不在乎建议函数,因为我已经将插件符号链接到 eth0 接口。如果您需要,可能也需要更改该部分。我的情况是问题$uptime始终未定义,导致返回 0。

因此我改变了子程序正常运行时间,将返回值分配给变量,然后使用该变量。

sub uptime {
    my $puptime = "/proc/uptime";
    open( TIME, "<", $puptime ) || die "Unable to read $puptime: $!";
    while (<TIME>) {
        my @arr = split;
        $uptime = $arr[0];
    }
    close(TIME);
    chomp $uptime;
}

现在插件返回的值看起来相当合理。

相关内容