This something I needed, and something I know others have asked for. It's a 
quick perl script to add a DS to an existing RRD without nuking all the 
existing data.
*Instructions:*
rrdtool dump my.rrd > file.xml
./rrdAddDS.pl file.xml newDsName > new_file.xml
rrdtool restore new_file.xml my_new.rrd

Voila!

Here's a quick command line script I wrote to transform every RRD in the 
current directory.

opendir(DIR, "./");
my @files = grep { /\.rrd$/ } readdir(DIR);
foreach my $file (@files)
{
        system("rrdtool dump $file > temp.xml");
        system("~/rrdAddDS.pl temp.xml images > new.xml");
        unlink($file);
        system("rrdtool restore new.xml $file");
        unlink("temp.xml");
        unlink("new.xml");
}


Build on it as you wish, let me know if you likes, forward on any improvements!

-Jeff

------------------------------------------------------------------------

#!/usr/bin/perl
# rrdAddDS.pl

open(INF, @ARGV[0]) or die "Could not open '$ARGV[0]'\n";

while ($line = <INF>)
{
        chomp($line); # Strip off Newline characters

        ##############
        # Add the DS #
        ##############
        if ($insertDS == 1)
        {
                print <<EndDS;

        <ds>
                <name> $ARGV[1] </name>
                <type> GAUGE </type>
                <minimal_heartbeat> 600 </minimal_heartbeat>
                <min> 0.0000000000e+00 </min>
                <max> NaN </max>

                <!-- PDP Status -->
                <last_ds> UNKN </last_ds>
                <value> 1.8530980000e+01 </value>
                <unknown_sec> 0 </unknown_sec>
        </ds>
EndDS
                $insertDS = 0;
        }

        ###################################
        # Insert DS under CDP_PREP entity #
        ###################################
        if ($insertCDP_PREP == 1)
        {
                print "                        <ds><value> NaN </value>  
<unknown_datapoints> 0 </unknown_datapoints></ds>\n";
                $insertCDP_PREP = 0;
        }

        ###########################################
        # Look for end of the <lastupdate> entity #
        ###########################################
        if ($line =~ /<\/lastupdate>/)
        {
                $insertDS = 1;
        }

        ###########################################
        # Look for start of the <cdp_prep> entity #
        ###########################################
        if ($line =~ /<cdp_prep>/)
        {
                $insertCDP_PREP = 1;
        }

        ##############################
        # Look for the end of an RRA #
        ##############################
        if ($line =~ /<\/database>/)
        {
                $parse = 0;
        }

        ########################################################################
        # Add the extra "<v> NaN </v>" under the RRAs. Just print normal lines #
        ########################################################################
        if ($parse == 1)
        {
                print substr($line, 0, -6);
                print "<v> NaN </v>";
                print substr($line, -6);
                print "\n";
        }
        else
        {
                print "$line\n";
        }

        ################################
        # Look for the start of an RRA #
        ################################
        if ($line =~ /<database>/)
        {
                $parse = 1;
        }
}

------------------------------------------------------------------------



--
Unsubscribe mailto:[EMAIL PROTECTED]
Help        mailto:[EMAIL PROTECTED]
Archive     http://www.ee.ethz.ch/~slist/rrd-users
WebAdmin    http://www.ee.ethz.ch/~slist/lsg2.cgi

Reply via email to