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

标签 perl rrdtool rrd cacti

我对 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::OORRD::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(s) 开始,以便它们可以更新。我不确定是否需要一个以上的 RRD、哪个步长值最好、数据源等。

如果我可以成功创建/更新 RRD 或 RRD,我很确定我可以遵循 Cacti's Externally Updated RRDs doc将它们加载到要绘制的仙人掌上。虽然有人可能有更好的方法。任何帮助表示赞赏!

编辑

我在脚本的第二部分尝试了以下内容...
#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用我的脚本将显示此 (invalid argument)mmap2系统调用。
mmap2(NULL, 1344, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 EINVAL (Invalid argument)
close(3)

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

最佳答案

根据 this bug report ,很可能是 vboxfs创建文件的文件系统无法支持 mmap写模式下的系统调用。

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

关于perl - 在 Cacti 中从 Perl 脚本和图形创建和更新 RRD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969632/

相关文章:

如果宽字符错误,Perl 停止打印

python - 如何将 RRA 添加到现有 RRD 中?

c# - 生成类似图形性能图的 MRTG/RRD?

centos - 在 centos 7 中安装 Ganglia 失败(rrd create in -rrd ... no)

graph - RRD基础知识等等!

snmp - 是否可以在没有 MIB 支持的情况下使用 SNMP 代理?

c# - 是否可以通过网络访问Cacti RRD数据库

perl - 有没有办法让 Perl 报告错误的确切行号

Perl:文件输入到排序的文件

regex - Perl - 使用正则表达式删除字符串中的第一个单词