[! use strict; use HTML::Entities; use Proxmox::Utils; use MIME::Base64; use GD::Graph::lines; !] [- $fdat{__sarsel} = [['avg15', 'Average CPU load (15 min)'], ['pswch', 'Process Switches (per second)'], ['runq', 'Run Queue Length'], ['nrproc', 'Process Count'], ]; Execute ('date_selection.epl'); -]
[- if (!$fdat{sarfile}) { print OUT __("No data available."); return; } my $dir = '/var/www/proxmox/statistic/perf/'; my $out = ""; my ($data0, $data1); open (TMP, "atsar -f $fdat{sarfile} -P|"); my $max = 0; my $sel = $fdat{sarsel} || $fdat{__sarsel}[0][0]; my $intvalue = 1; my $found; while (my $line = ) { my $res = {}; my ($hour, $min); if (($hour, $min, $res->{pswch}, $res->{'runq'}, $res->{'nrproc'}, $res->{'avg1'}, $res->{'avg5'}, $res->{'avg15'}) = ($line =~ m/^(\d\d)\:(\d\d)\:\d\d\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)/)) { $found = 1; push @$data0, $hour; # hack: +0 to convert string to number (avoid problems with GD::GRAPH) my $v = $res->{"$sel"} + 0; push @$data1, $v; $intvalue = 0 if int ($v) != $v; $max = $v if $v && $max < $v; } } close (TMP); if (!$found) { print OUT __("No data available."); return; } $max = 1 if !$max; my @data = ($data0, $data1); my $graph = GD::Graph::lines->new (600, 400); my $txt = ''; foreach my $va (@{$fdat{__sarsel}}) { $txt = $va->[1] if $fdat{sarsel} eq $va->[0]; } my $prec = $max < 1 ? 100 : 10; my $rmax = int (($max * 1.1 + (1/$prec)) * $prec) / $prec; $graph->set( title => sprintf (decode_entities (("$txt (%s)")), $fdat{sardate}) , transparent => 0, y_long_ticks => 1, dclrs => [ qw(green lblue cyan lyellow lpurple lred lorange) ], y_min_value => 0, y_max_value => $rmax, y_number_format => '%.2f', x_labels_vertical => 1, x_label_skip => 6, ); if ($intvalue) { my $maxv = int ($max * 1.1); my $ytn = $max < 5 ? $max : 5; $graph->set(y_number_format => '%d', y_min_value => 0, y_max_value => $maxv, y_tick_number => $ytn); } $graph->set_legend(decode_entities ($sel)); $graph->plot(\@data); $out .= "

"; my $fn = 'cpuload.png'; open (TMP, ">$dir$fn") or die "Cannot open $fn for write: $!"; print TMP $graph->gd->png(); close TMP; $out .= "

"; print OUT $out; -]