Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> --- Notes: versioned breaks on - qemu-server - pve-manager - pve-container - libpve-storage-perl could also move to pve-common instead.
data/PVE/Makefile | 2 +- data/PVE/Cluster.pm | 125 ----------------------------------------- data/PVE/RRD.pm | 134 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 126 deletions(-) create mode 100644 data/PVE/RRD.pm diff --git a/data/PVE/Makefile b/data/PVE/Makefile index 7b3b318..052a815 100644 --- a/data/PVE/Makefile +++ b/data/PVE/Makefile @@ -11,7 +11,7 @@ PVE_VENDORARCH=${DESTDIR}/${PERL_VENDORARCH}/auto/PVE/IPCC PERL_DOC_INC_DIRS:=.. SUBDIRS=Cluster CLI API2 -SOURCES=IPCC.pm Cluster.pm Corosync.pm +SOURCES=IPCC.pm Cluster.pm Corosync.pm RRD.pm all: diff --git a/data/PVE/Cluster.pm b/data/PVE/Cluster.pm index 155a639..6de7a27 100644 --- a/data/PVE/Cluster.pm +++ b/data/PVE/Cluster.pm @@ -12,7 +12,6 @@ use JSON; use MIME::Base64; use Net::SSLeay; use POSIX qw(EEXIST ENOENT); -use RRDs; use Socket; use Storable qw(dclone); use UUID; @@ -715,130 +714,6 @@ sub rrd_dump { return $res; } -sub create_rrd_data { - my ($rrdname, $timeframe, $cf) = @_; - - my $rrddir = "/var/lib/rrdcached/db"; - - my $rrd = "$rrddir/$rrdname"; - - my $setup = { - hour => [ 60, 70 ], - day => [ 60*30, 70 ], - week => [ 60*180, 70 ], - month => [ 60*720, 70 ], - year => [ 60*10080, 70 ], - }; - - my ($reso, $count) = @{$setup->{$timeframe}}; - my $ctime = $reso*int(time()/$reso); - my $req_start = $ctime - $reso*$count; - - $cf = "AVERAGE" if !$cf; - - my @args = ( - "-s" => $req_start, - "-e" => $ctime - 1, - "-r" => $reso, - ); - - my $socket = "/var/run/rrdcached.sock"; - push @args, "--daemon" => "unix:$socket" if -S $socket; - - my ($start, $step, $names, $data) = RRDs::fetch($rrd, $cf, @args); - - my $err = RRDs::error; - die "RRD error: $err\n" if $err; - - die "got wrong time resolution ($step != $reso)\n" - if $step != $reso; - - my $res = []; - my $fields = scalar(@$names); - for my $line (@$data) { - my $entry = { 'time' => $start }; - $start += $step; - for (my $i = 0; $i < $fields; $i++) { - my $name = $names->[$i]; - if (defined(my $val = $line->[$i])) { - $entry->{$name} = $val; - } else { - # leave empty fields undefined - # maybe make this configurable? - } - } - push @$res, $entry; - } - - return $res; -} - -sub create_rrd_graph { - my ($rrdname, $timeframe, $ds, $cf) = @_; - - # Using RRD graph is clumsy - maybe it - # is better to simply fetch the data, and do all display - # related things with javascript (new extjs html5 graph library). - - my $rrddir = "/var/lib/rrdcached/db"; - - my $rrd = "$rrddir/$rrdname"; - - my @ids = PVE::Tools::split_list($ds); - - my $ds_txt = join('_', @ids); - - my $filename = "${rrd}_${ds_txt}.png"; - - my $setup = { - hour => [ 60, 60 ], - day => [ 60*30, 70 ], - week => [ 60*180, 70 ], - month => [ 60*720, 70 ], - year => [ 60*10080, 70 ], - }; - - my ($reso, $count) = @{$setup->{$timeframe}}; - - my @args = ( - "--imgformat" => "PNG", - "--border" => 0, - "--height" => 200, - "--width" => 800, - "--start" => - $reso*$count, - "--end" => 'now' , - "--lower-limit" => 0, - ); - - my $socket = "/var/run/rrdcached.sock"; - push @args, "--daemon" => "unix:$socket" if -S $socket; - - my @coldef = ('#00ddff', '#ff0000'); - - $cf = "AVERAGE" if !$cf; - - my $i = 0; - foreach my $id (@ids) { - my $col = $coldef[$i++] || die "fixme: no color definition"; - push @args, "DEF:${id}=$rrd:${id}:$cf"; - my $dataid = $id; - if ($id eq 'cpu' || $id eq 'iowait') { - push @args, "CDEF:${id}_per=${id},100,*"; - $dataid = "${id}_per"; - } - push @args, "LINE2:${dataid}${col}:${id}"; - } - - push @args, '--full-size-mode'; - - # we do not really store data into the file - my $res = RRDs::graphv('-', @args); - - my $err = RRDs::error; - die "RRD error: $err\n" if $err; - - return { filename => $filename, image => $res->{image} }; -} # a fast way to read files (avoid fuse overhead) sub get_config { diff --git a/data/PVE/RRD.pm b/data/PVE/RRD.pm new file mode 100644 index 0000000..5d4abc9 --- /dev/null +++ b/data/PVE/RRD.pm @@ -0,0 +1,134 @@ +package PVE::RRD; + +use strict; use warnings; + +use RRDs; + +use PVE::Tools; + +sub create_rrd_data { + my ($rrdname, $timeframe, $cf) = @_; + + my $rrddir = "/var/lib/rrdcached/db"; + + my $rrd = "$rrddir/$rrdname"; + + my $setup = { + hour => [ 60, 70 ], + day => [ 60*30, 70 ], + week => [ 60*180, 70 ], + month => [ 60*720, 70 ], + year => [ 60*10080, 70 ], + }; + + my ($reso, $count) = @{$setup->{$timeframe}}; + my $ctime = $reso*int(time()/$reso); + my $req_start = $ctime - $reso*$count; + + $cf = "AVERAGE" if !$cf; + + my @args = ( + "-s" => $req_start, + "-e" => $ctime - 1, + "-r" => $reso, + ); + + my $socket = "/var/run/rrdcached.sock"; + push @args, "--daemon" => "unix:$socket" if -S $socket; + + my ($start, $step, $names, $data) = RRDs::fetch($rrd, $cf, @args); + + my $err = RRDs::error; + die "RRD error: $err\n" if $err; + + die "got wrong time resolution ($step != $reso)\n" + if $step != $reso; + + my $res = []; + my $fields = scalar(@$names); + for my $line (@$data) { + my $entry = { 'time' => $start }; + $start += $step; + for (my $i = 0; $i < $fields; $i++) { + my $name = $names->[$i]; + if (defined(my $val = $line->[$i])) { + $entry->{$name} = $val; + } else { + # leave empty fields undefined + # maybe make this configurable? + } + } + push @$res, $entry; + } + + return $res; +} + +sub create_rrd_graph { + my ($rrdname, $timeframe, $ds, $cf) = @_; + + # Using RRD graph is clumsy - maybe it + # is better to simply fetch the data, and do all display + # related things with javascript (new extjs html5 graph library). + + my $rrddir = "/var/lib/rrdcached/db"; + + my $rrd = "$rrddir/$rrdname"; + + my @ids = PVE::Tools::split_list($ds); + + my $ds_txt = join('_', @ids); + + my $filename = "${rrd}_${ds_txt}.png"; + + my $setup = { + hour => [ 60, 60 ], + day => [ 60*30, 70 ], + week => [ 60*180, 70 ], + month => [ 60*720, 70 ], + year => [ 60*10080, 70 ], + }; + + my ($reso, $count) = @{$setup->{$timeframe}}; + + my @args = ( + "--imgformat" => "PNG", + "--border" => 0, + "--height" => 200, + "--width" => 800, + "--start" => - $reso*$count, + "--end" => 'now' , + "--lower-limit" => 0, + ); + + my $socket = "/var/run/rrdcached.sock"; + push @args, "--daemon" => "unix:$socket" if -S $socket; + + my @coldef = ('#00ddff', '#ff0000'); + + $cf = "AVERAGE" if !$cf; + + my $i = 0; + foreach my $id (@ids) { + my $col = $coldef[$i++] || die "fixme: no color definition"; + push @args, "DEF:${id}=$rrd:${id}:$cf"; + my $dataid = $id; + if ($id eq 'cpu' || $id eq 'iowait') { + push @args, "CDEF:${id}_per=${id},100,*"; + $dataid = "${id}_per"; + } + push @args, "LINE2:${dataid}${col}:${id}"; + } + + push @args, '--full-size-mode'; + + # we do not really store data into the file + my $res = RRDs::graphv('-', @args); + + my $err = RRDs::error; + die "RRD error: $err\n" if $err; + + return { filename => $filename, image => $res->{image} }; +} + +1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel