私はPerlに少し慣れていませんが、間違いなくRRDに慣れていません。また、いくつかのWebサービステストを実行し、ガベージコレクションログから行を取得するPerlスクリプトがあります。スクリプトは他のタスクも実行しますが、必要なのはこれら2つに関連するグラフだけです。
スクリプトのこの部分は、結果レポート.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を正常に作成/更新できれば、Cactiの外部的に更新されたRRDのドキュメントに従って、グラフ化するためにそれらをcactiにロードできると確信しています。誰かがより良いアプローチを持っているかもしれませんが。どんな助けでも大歓迎です!
編集
スクリプトの2番目の部分で次のことを試しました...
#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
syscallでこれが表示されます。
mmap2(NULL, 1344, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 EINVAL (Invalid argument)
close(3)
RRD::SimpleとRRDTool::OOのどちらを使用してもかまいませんが、現在はどちらも同じエラーを返します。