Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml rrdtool-修订HWDRA_Xml_Perl_Rrdtool - Fatal编程技术网

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);