我是Perl的新手,对RRD来说是新手,我有一个运行一些webservice测试的Perl脚本,还可以从垃圾收集日志中检索行。该脚本也执行其他任务,但我只需要有一个与这两个相关的图表。
这段脚本读取结果报告.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'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对我没关系,但目前他们都返回相同的错误。
答案 0 :(得分:1)
根据this bug report,创建文件的vboxfs
文件系统很可能在写入模式下支持mmap
系统调用。
您应该在常规Linux文件系统上的其他位置尝试您的代码(ext3,ext4,reiserfs ......)
答案 1 :(得分:0)
您也可以在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`;