在 Cacti 中从 Perl 脚本和图形创建和更新 RRD



我对Perl有点陌生,对RRD绝对是新手,我有一个Perl脚本,可以运行一些Web服务测试,还可以从垃圾收集日志中检索行。该脚本还执行其他任务,但我只需要一个与这两个相关的图表。

脚本的这一部分读取结果报告.html,从表中提取一些时间值并将其存储在变量中。

my $html = "./report/archive/results-$now/web_results.html";
my @headers = qw( Page Initial Resource STB UI );
my $te = HTML::TableExtract->new(headers => @headers);
$te->parse_file($html);
my ($table) = $te->tables;
for my $row ($te->rows) {
    my $pageDisplay = "@$row[0]";
    $pageDisplay =~ s/D//g;
    my $initialLoad = "@$row[1]";
    $initialLoad =~ s/D//g;
    my $resourceAudit = "@$row[2]";
    $resourceAudit =~ s/D//g;
    my $uiRefresh = "@$row[3]";
    $uiRefresh =~ s/D//g;
    my $stbRefresh = "@$row[4]";
    $stbRefresh =~ s/D//g;
}

我想使用 RRDTool::OO 或 RRD::Simple 将这些变量存储在 RRD 中,并在脚本的每个循环后更新它们。

我还想对脚本的另一段执行相同的操作,该脚本循环遍历一些垃圾回收日志行并为每个日志行返回运行时。

open LOG,"<","./report/archive/logs-$now/garbage.collection.txt" or die "Unable to read file: $!";
    while (my $line = <LOG>) {
        my ($time) = $line =~ m/breal=([0-9.]+)/;
    }
close LOG;

我相信RRDTool::OO有一个可以用我的变量调用的更新函数,但我的主要问题是创建RRD,以便可以使用它们进行更新。我不确定我是否需要有多个 RRD、最佳步长值、数据源等。

如果我能成功创建/更新 RRD 或 RRD,我很确定我可以按照 Cacti 的外部更新 RRD 文档将它们加载到仙人掌上进行绘制。虽然有人可能有更好的方法。任何帮助不胜感激!

编辑

我已经在脚本的第二部分尝试了以下内容...

#RRDTool::OO
my $rrd = RRDTool::OO->new(
             file => "gcRuntimes.rrd" );
$rrd->create(
     step        => 1,
     data_source => { name      => "GC",
                      type      => "GAUGE" },
     archive     => { rows      => 50 });
...
open LOG,"<","./report/archive/logs-$now/garbage.collection.txt" or die "Unable to read file: $!";
    while (my $line = <LOG>) {
        my ($time) = $line =~ m/breal=([0-9.]+)/;
        $rrd->update($time);
}
close LOG;

..但这失败并显示错误: rrdtool create gcRuntimes.rrd --step 1 DS:GC:GAUGE:2:U:U RRA:MAX:0.5:1:5 failed: creating 'gcRuntimes.rrd': Invalid argument at /home/foo/perl5/lib/perl5/RRDTool/OO.pm line 438

使用我的脚本运行strace将在mmap2系统调用中显示此(invalid argument)

mmap2(NULL, 1344, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 EINVAL (Invalid argument)
close(3)

如果我使用 RRD::Simple 或 RRDTool::OO 对我来说并不重要,但目前它们都返回相同的错误。

根据此错误报告,很可能是创建文件的vboxfs文件系统在写入模式下支持mmap系统调用时遇到问题。

您应该在常规Linux文件系统(ext3,ext4,reiserfs...)上的另一个位置尝试您的代码。

你也可以在

perl脚本中自行调用rrdtool命令。

my $result = `/usr/bin/rrdtool create /path/to/gcRuntimes.rrd --step 1 DS:GC:GAUGE:2:U:U RRA:MAX:0.5:1:5`;

my $result = `/usr/bin/rrdtool update /path/to/gcRuntimes.rrd $time:$data`;

相关内容

  • 没有找到相关文章

最新更新