]>
git.proxmox.com Git - pve-cluster.git/blob - data/PVE/RRD.pm
3 use strict
; use warnings
;
10 my ($rrdname, $timeframe, $cf) = @_;
12 my $rrddir = "/var/lib/rrdcached/db";
14 my $rrd = "$rrddir/$rrdname";
19 week
=> [ 60*180, 70 ],
20 month
=> [ 60*720, 70 ],
21 year
=> [ 60*10080, 70 ],
24 my ($reso, $count) = @{$setup->{$timeframe}};
25 my $ctime = $reso*int(time()/$reso);
26 my $req_start = $ctime - $reso*$count;
28 $cf = "AVERAGE" if !$cf;
36 my $socket = "/var/run/rrdcached.sock";
37 push @args, "--daemon" => "unix:$socket" if -S
$socket;
39 my ($start, $step, $names, $data) = RRDs
::fetch
($rrd, $cf, @args);
41 my $err = RRDs
::error
;
42 die "RRD error: $err\n" if $err;
44 die "got wrong time resolution ($step != $reso)\n"
48 my $fields = scalar(@$names);
49 for my $line (@$data) {
50 my $entry = { 'time' => $start };
52 for (my $i = 0; $i < $fields; $i++) {
53 my $name = $names->[$i];
54 if (defined(my $val = $line->[$i])) {
55 $entry->{$name} = $val;
57 # leave empty fields undefined
58 # maybe make this configurable?
67 sub create_rrd_graph
{
68 my ($rrdname, $timeframe, $ds, $cf) = @_;
70 # Using RRD graph is clumsy - maybe it
71 # is better to simply fetch the data, and do all display
72 # related things with javascript (new extjs html5 graph library).
74 my $rrddir = "/var/lib/rrdcached/db";
76 my $rrd = "$rrddir/$rrdname";
78 my @ids = PVE
::Tools
::split_list
($ds);
80 my $ds_txt = join('_', @ids);
82 my $filename = "${rrd}_${ds_txt}.png";
87 week
=> [ 60*180, 70 ],
88 month
=> [ 60*720, 70 ],
89 year
=> [ 60*10080, 70 ],
92 my ($reso, $count) = @{$setup->{$timeframe}};
95 "--imgformat" => "PNG",
99 "--start" => - $reso*$count,
101 "--lower-limit" => 0,
104 my $socket = "/var/run/rrdcached.sock";
105 push @args, "--daemon" => "unix:$socket" if -S
$socket;
107 my @coldef = ('#00ddff', '#ff0000');
109 $cf = "AVERAGE" if !$cf;
112 foreach my $id (@ids) {
113 my $col = $coldef[$i++] || die "fixme: no color definition";
114 push @args, "DEF:${id}=$rrd:${id}:$cf";
116 if ($id eq 'cpu' || $id eq 'iowait') {
117 push @args, "CDEF:${id}_per=${id},100,*";
118 $dataid = "${id}_per";
120 push @args, "LINE2:${dataid}${col}:${id}";
123 push @args, '--full-size-mode';
125 # we do not really store data into the file
126 my $res = RRDs
::graphv
('-', @args);
128 my $err = RRDs
::error
;
129 die "RRD error: $err\n" if $err;
131 return { filename
=> $filename, image
=> $res->{image
} };