Xml rrdtool-修订HWDRA
我正在使用Xml rrdtool-修订HWDRA,xml,perl,rrdtool,Xml,Perl,Rrdtool,我正在使用rrdtool收集和处理一些系统指标 我一直在试验相当神奇的HWPREDICT功能,它允许您为像差检测进行霍尔特·温特斯季节性预测 然而,我现在遇到了一个问题,当我开始时,我将我的HWPREDICT参数设置为每天有一个“季节”: rrdtool create <filename> -s 300 DS:curr_sessions:GAUGE:600:0:U RRA:AVERAGE:0.5:1:2880 RRA:AVERAGE:0.5:12:2016 RRA:AVERAGE:0
rrdtool
收集和处理一些系统指标
我一直在试验相当神奇的HWPREDICT
功能,它允许您为像差检测进行霍尔特·温特斯季节性预测
然而,我现在遇到了一个问题,当我开始时,我将我的HWPREDICT
参数设置为每天有一个“季节”:
rrdtool create <filename> -s 300 DS:curr_sessions:GAUGE:600:0:U RRA:AVERAGE:0.5:1:2880 RRA:AVERAGE:0.5:12:2016 RRA:AVERAGE:0.5:60:2400 RRA:HWPREDICT:1440:0.1:0.0001:288
但我很难弄清楚是否有任何方法可以在不重置源数据的情况下实现这一点。我已经研究了rrddump
,它允许您转储/恢复。这将导出XML,但保留RRA结构
rrdtune
允许您调整alpha/beta/gamma的一些参数,但不调整季节长度
rrdresize允许您修改RRA的长度,但不允许修改季节长度
有谁有好的解决方案可以让我重新创建rrd
,但保留其中的数据?(我不介意“丢失”我的HRA预测数据,因为季节性周期的改变几乎会使其失效,但我非常希望将我的现有数据保留在其他RRA中)
另外,我对perl非常熟悉,所以如果有人能给我指出正确的方向,请不要介意使用perl/XML。(我能否以某种方式“捏造”导出的XML,用一堆未初始化的值“提供”给它一个新的RRA?到目前为止的部分答案:
使用新参数创建新的rrd
文件。包括--start
,以允许您将日期向后追溯足够远。(在转储的XML中查找最低的“时间戳”)
处理转储的XML并提取数据。这里有一个问题-如果您有重叠的RRA,rrdtool将不接受“冲突”时间戳。例如,如果您有一个MAX
和一个AVERAGE
我选择了MAX
,因为这可能对我最有用
我还“按顺序”进行了此操作,因为我已按适当的顺序指定了初始RRA(例如,最小分辨率优先)。否则这可能会起作用,但请记住,在粗略的分辨率“MAX”中,可能会得到一些不同的值
#!/usr/local/bin/perl
use strict;
use warnings;
use XML::Twig;
my %update_vals;
sub parse_rra {
my ( $twig, $rra ) = @_;
return unless $rra->first_child_text('cf') eq 'MAX';
my $step = $twig->root->first_child_text('step');
my $lastupd = $twig->root->first_child_text('lastupdate');
my $base_time = $lastupd - $lastupd % $step;
my $pdp_step = $rra->first_child_text('pdp_per_row');
my @row_vals;
foreach my $row ( $rra->first_child('database')->children('row') ) {
my $val = $row->first_child_text('v');
push( @row_vals, $val );
}
my $start_rra = $base_time - $#row_vals * $step * $pdp_step;
foreach my $value (@row_vals) {
if ( not $value eq "NaN"
or not defined $update_vals{$start_rra} )
{
$update_vals{$start_rra} = $value;
$start_rra += $step * $pdp_step;
}
}
}
my $target_file = "your_rrd_dump.xml";
my $destination_file = "new.rrd";
my $twig = XML::Twig->new( 'twig_handlers' => { 'rra' => \&parse_rra } )
->parsefile($target_file);
foreach my $timestamp ( sort keys %update_vals ) {
print
`rrdtool update $destination_file $timestamp:$update_vals{$timestamp}`;
}
现在,到目前为止,所有这些都只是“重放”所有可用的时间戳。不幸的是,对于任何整合的数据点,它根本不起作用(基于RRA配置),因为在该分辨率下没有足够的样本(例如每天1个)
因此,作为第二种方法(已编辑):
- 创建您的“源”RRD李>
- 使用所需参数创建“新”RRD李>
XML::Twig
处理这两种数据,这是第一次保留“非HWPREDICT”数据并删除HWPREDICT
数据。第二次处理并将HWPREDICT
rra拼接到前一个中,以创建新的XML转储。。。你恢复的
注意-如果您有非常不同的数据,这可能不起作用。(注意-HWPREDICT
重新初始化的东西可能需要一段时间才能再次“安定下来”)
这基本上是通过两个单独的“rrdtool转储”运行,并将RRA
s拼接在一起。我会尝试一下,看看它是否真的能满足我的需要——直到霍尔特·温特斯的功能稳定下来我才知道 目前的部分答案:
使用新参数创建新的rrd
文件。包括--start
,以允许您将日期向后追溯足够远。(在转储的XML中查找最低的“时间戳”)
处理转储的XML并提取数据。这里有一个问题-如果您有重叠的RRA,rrdtool将不接受“冲突”时间戳。例如,如果您有一个MAX
和一个AVERAGE
我选择了MAX
,因为这可能对我最有用
我还“按顺序”进行了此操作,因为我已按适当的顺序指定了初始RRA(例如,最小分辨率优先)。否则这可能会起作用,但请记住,在粗略的分辨率“MAX”中,可能会得到一些不同的值
#!/usr/local/bin/perl
use strict;
use warnings;
use XML::Twig;
my %update_vals;
sub parse_rra {
my ( $twig, $rra ) = @_;
return unless $rra->first_child_text('cf') eq 'MAX';
my $step = $twig->root->first_child_text('step');
my $lastupd = $twig->root->first_child_text('lastupdate');
my $base_time = $lastupd - $lastupd % $step;
my $pdp_step = $rra->first_child_text('pdp_per_row');
my @row_vals;
foreach my $row ( $rra->first_child('database')->children('row') ) {
my $val = $row->first_child_text('v');
push( @row_vals, $val );
}
my $start_rra = $base_time - $#row_vals * $step * $pdp_step;
foreach my $value (@row_vals) {
if ( not $value eq "NaN"
or not defined $update_vals{$start_rra} )
{
$update_vals{$start_rra} = $value;
$start_rra += $step * $pdp_step;
}
}
}
my $target_file = "your_rrd_dump.xml";
my $destination_file = "new.rrd";
my $twig = XML::Twig->new( 'twig_handlers' => { 'rra' => \&parse_rra } )
->parsefile($target_file);
foreach my $timestamp ( sort keys %update_vals ) {
print
`rrdtool update $destination_file $timestamp:$update_vals{$timestamp}`;
}
现在,到目前为止,所有这些都只是“重放”所有可用的时间戳。不幸的是,对于任何整合的数据点,它根本不起作用(基于RRA配置),因为在该分辨率下没有足够的样本(例如每天1个)
因此,作为第二种方法(已编辑):
- 创建您的“源”RRD李>
- 使用所需参数创建“新”RRD李>
XML::Twig
处理这两种数据,这是第一次保留“非HWPREDICT”数据并删除HWPREDICT
数据。第二次处理并将HWPREDICT
rra拼接到前一个中,以创建新的XML转储。。。你恢复的
注意-如果您有非常不同的数据,这可能不起作用。(注意-HWPREDICT
重新初始化的东西可能需要一段时间才能再次“安定下来”)
这基本上是通过两个单独的“rrdtool转储”运行,并将RRA
s拼接在一起。我会尝试一下,看看它是否真的能满足我的需要——直到霍尔特·温特斯的功能稳定下来我才知道
#!/usr/local/bin/perl
use strict;
use warnings;
use XML::Twig;
my @cf_to_replace =
qw ( HWPREDICT MHWPREDICT SEASONAL DEVSEASONAL DEVPREDICT FAILURES );
my %hwp_cf = map { $_ => 1 } @cf_to_replace;
my $xml_doc;
sub discard_hwp {
my ( $twig, $rra ) = @_;
my $CF = $rra->first_child_text('cf');
if ( $hwp_cf{$CF} ) { $rra->delete }
}
sub splice_hwp {
my ( $twig, $rra ) = @_;
my $CF = $rra->first_child_text('cf');
if ( $hwp_cf{$CF} ) {
$rra->cut;
$rra->paste( 'last_child', $xml_doc->root );
}
}
my $orig_file = 'your_xml_dump.xml';
my $newly_created_rrddump = 'new_params.xml';
$xml_doc = XML::Twig->new(
'pretty_print' => 'indented',
'twig_handlers' => { 'rra' => \&discard_hwp }
)->parsefile($orig_file);
my $new = XML::Twig->new( 'twig_handlers' => { 'rra' => \&splice_hwp } )
->parsefile($newly_created_rrddump);
open( my $output, ">", "new.xml" ) or die $!;
print {$output} $xml_doc->sprint;
close($output);