From: Florian Forster Date: Wed, 8 Dec 2010 14:00:58 +0000 (+0100) Subject: contrib/migrate-4-5.px: Add a first version of the migration script. X-Git-Tag: collectd-5.0.0-beta1~8 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=74761a89659630c5f7d1d849ae7d28ae1605d9be contrib/migrate-4-5.px: Add a first version of the migration script. --- diff --git a/contrib/migrate-4-5.px b/contrib/migrate-4-5.px new file mode 100755 index 00000000..efb2e0a1 --- /dev/null +++ b/contrib/migrate-4-5.px @@ -0,0 +1,222 @@ +#!/usr/bin/perl + +# collectd - contrib/migrate-4-5.px +# Copyright (C) 2010 Florian Forster +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +# Authors: +# Florian Forster + +use strict; +use warnings; + +use Getopt::Long ('GetOptions'); +use Data::Dumper (); +use File::Basename ('dirname'); + +our $InDir = '/var/lib/collectd'; +our $OutDir = '/tmp/collectd-5'; +our $Hostname = 'localhost'; + +our %TypesCounterToDerive = # {{{ +( + apache_bytes => ["count"], + apache_requests => ["count"], + arc_counts => ["demand_data", "demand_metadata", "prefetch_data", "prefetch_metadata"], + arc_l2_bytes => ["read", "write"], + ath_stat => ["value"], + compression => ["uncompressed", "compressed"], + connections => ["value"], + cpu => ["value"], + current => ["value"], + df => ["used", "free"], + disk_merged => ["read", "write"], + disk_octets => ["read", "write"], + disk_ops => ["read", "write"], + disk_ops_complex => ["value"], + disk_time => ["read", "write"], + dns_answer => ["value"], + dns_notify => ["value"], + dns_octets => ["queries", "responses"], + dns_opcode => ["value"], + dns_qtype => ["value"], + dns_query => ["value"], + dns_question => ["value"], + dns_rcode => ["value"], + dns_reject => ["value"], + dns_request => ["value"], + dns_resolver => ["value"], + dns_response => ["value"], + dns_transfer => ["value"], + dns_update => ["value"], + dns_zops => ["value"], + fscache_stat => ["value"], + fork_rate => ["value"], + http_request_methods => ["count"], + http_requests => ["count"], + http_response_codes => ["count"], + if_collisions => ["value"], + if_dropped => ["rx", "tx"], + if_errors => ["rx", "tx"], + if_multicast => ["value"], + if_octets => ["rx", "tx"], + if_packets => ["rx", "tx"], + if_rx_errors => ["value"], + if_tx_errors => ["value"], + io_octets => ["rx", "tx"], + io_packets => ["rx", "tx"], + ipt_bytes => ["value"], + ipt_packets => ["value"], + irq => ["value"], + memcached_command => ["value"], + memcached_octets => ["rx", "tx"], + memcached_ops => ["value"], + mysql_commands => ["value"], + mysql_handler => ["value"], + mysql_locks => ["value"], + mysql_log_position => ["value"], + mysql_octets => ["rx", "tx"], + nfs_procedure => ["value"], + nginx_requests => ["value"], + node_octets => ["rx", "tx"], + node_stat => ["value"], + operations => ["value"], + pg_blks => ["value"], + pg_n_tup_c => ["value"], + pg_scan => ["value"], + pg_xact => ["value"], + protocol_counter => ["value"], + ps_cputime => ["user", "syst"], + ps_pagefaults => ["minflt", "majflt"], + ps_code => ["value"], + ps_data => ["value"], + serial_octets => ["rx", "tx"], + swap_io => ["value"], + virt_cpu_total => ["ns"], + virt_vcpu => ["ns"], + vmpage_action => ["value"], + vmpage_faults => ["minflt", "majflt"], + vmpage_io => ["in", "out"], +); # }}} %TypesCounterToDerive + +our %TypesRenameDataSource = # {{{ +( + absolute => "count", + apache_bytes => "count", + apache_connections => "count", + apache_idle_workers => "count", + apache_requests => "count", + apache_scoreboard => "count", + conntrack => "entropy", + contextswitch => "contextswitches", + delay => "seconds", + entropy => "entropy", + file_size => "bytes", + frequency => "frequency", + frequency_offset => "ppm", + http_request_methods => "count", + http_requests => "count", + http_response_codes => "count", + percent => "percent", + ping => "ping", + records => "count", + time_dispersion => "seconds", + timeleft => "timeleft", + time_offset => "seconds", + users => "users", + virt_cpu_total => "ns", + virt_vcpu => "ns", +); # }}} %TypesRenameDataSource + +sub handle_file # {{{ +{ + my @path = @_; + my $path = join ('/', @path); + + if (!($path =~ m/\.rrd$/)) + { + return; + } + + my $tmp = pop (@path); + $tmp =~ s/\.rrd$//; + my ($type, $type_inst) = split (m/-/, $tmp, 2); + $type_inst ||= ''; + + $tmp = pop (@path); + my ($plugin, $plugin_inst) = split (m/-/, $tmp, 2); + $plugin_inst ||= ''; + + if ($TypesRenameDataSource{$type}) + { + my $old_ds = $TypesRenameDataSource{$type}; + print "rrdtool tune \"$path\" --data-source-rename ${old_ds}:value\n"; + } + + if ($TypesCounterToDerive{$type}) + { + my $ds_names = $TypesCounterToDerive{$type}; + + for (@$ds_names) + { + my $name = $_; + print "rrdtool tune \"$path\" --data-source-type ${name}:DERIVE --minimum ${name}:0 --maximum ${name}:U\n"; + } + } + + if ((($plugin eq 'df') || ($plugin eq 'interface')) + && (!$plugin_inst) && ($type_inst)) + { + my $dir = join ('/', @path); + print "mv \"$path\" \"$dir/$plugin-$type_inst/$type.rrd\"\n"; + } +} # }}} sub handle_file + +sub scan_dir # {{{ +{ + my @dir_parts = @_; + my $dir_str = join ('/', @dir_parts); + my $dh; + + opendir ($dh, $dir_str) || die; + while (my $entry = readdir ($dh)) + { + my $entry_path = "$dir_str/$entry"; + + if ($entry =~ m/^\./) + { + next; + } + + if (-d $entry_path) + { + scan_dir (@dir_parts, $entry); + } + elsif (-f $entry_path) + { + handle_file (@dir_parts, $entry); + } + } + closedir ($dh); +} # }}} sub scan_dir + +scan_dir ($InDir); + +# vim: set sw=2 sts=2 et fdm=marker :