【问题标题】:Creating and updating RRDs from Perl script and graph in Cacti在 Cacti 中从 Perl 脚本和图形创建和更新 RRD
【发布时间】:2012-08-15 12:53:58
【问题描述】:

我对 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 将在mmap2 系统调用中显示此(invalid argument)

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

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

【问题讨论】:

  • 您只需要 5 行吗?我认为您需要从 rrdtool 文档开始(例如,man rrdcreate),以了解您传递给创建的那些参数的含义。以man rrd-beginners开头。
  • @derobert 不,我不想要五行,我肯定需要更多。但我不明白为什么以这种方式调用 create 函数会因错误而失败。
  • 实际上,现在尝试您的示例代码,它在这里工作,至少通过创建。也许在 strace 下运行它以查看“无效参数”的来源(如果它是系统调用)?
  • @derobert 使用 RRDTool::OORRD::Simple 在脚本上运行 strace,它们都将返回相同的“无效参数”。 mmap2(NULL, 1344, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 EINVAL (Invalid argument) close(3)
  • 您是否检查过您尝试创建的文件“gcRuntimes.rrd”的位置:可写文件系统,对父文件夹的写入权限?

标签: perl rrdtool rrd cacti


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您也可以在 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`;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多