1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-22 02:51:03 +00:00

CPU usage graph, skip list, some cleanup

- xenskip option to skip graph types
  env.xenskip "<space separated module list>"
  Modules: cput, cpup, mem, disk, net
- CPU percentage graph added
This commit is contained in:
ivan 2013-01-30 19:34:30 +01:00
parent 8fbe0ebe27
commit 332c74d720

View file

@ -19,6 +19,9 @@ configuration:
[xen-multi] [xen-multi]
user root user root
env.xenskip "<space separated module list>"
Modules: cput, cpup, mem, disk, net
Then restart munin-node and you're done. Then restart munin-node and you're done.
@ -34,10 +37,14 @@ NOTE: xentop always reports 0 for dom0's disk IOs and network traffic, but
both graphs show its entry all the same, so each domain can keep its own color both graphs show its entry all the same, so each domain can keep its own color
along the different graphs. along the different graphs.
=head2 CPU usage =head2 CPU time
This graph shows a percentage of the CPU time used by each domain. This graph shows a percentage of the CPU time used by each domain.
=head2 CPU usage
This graph shows a percentage of the CPU percentage used by each domain.
=head2 Memory usage =head2 Memory usage
This graph shows the amount of memory (in bytes) used by each domain. This graph shows the amount of memory (in bytes) used by each domain.
@ -66,6 +73,7 @@ Michael Renner for the C<diskstats> plugin which I borrowed some code from.
=head1 AUTHOR =head1 AUTHOR
Raphael HALIMI <raphael.halimi@gmail.com> Raphael HALIMI <raphael.halimi@gmail.com>
Modified by Krisztian IVANCSO <github-ivan@ivancso.net>
=head1 LICENSE =head1 LICENSE
@ -76,6 +84,8 @@ GPLv2
use strict; use strict;
use Munin::Plugin; use Munin::Plugin;
my $XEN_SKIP = $ENV{xenskip} || "";
# autoconf - quite simple # autoconf - quite simple
if ($ARGV[0] eq "autoconf") { if ($ARGV[0] eq "autoconf") {
if (`which xentop`) { if (`which xentop`) {
@ -101,7 +111,7 @@ if ($ARGV[0] eq "autoconf") {
sub trim_label { sub trim_label {
my ($type, $label) = @_; my $data_characters; my ($type, $label) = @_; my $data_characters;
my ($graph_width, $graph_border_width, $padding_characters, $pixels_per_character) = (400,97,10,6); my ($graph_width, $graph_border_width, $padding_characters, $pixels_per_character) = (497,3,5,6);
if ($type eq 'pos') {$data_characters = 32;} elsif ($type eq 'neg') {$data_characters = 64;} else {return $label;} if ($type eq 'pos') {$data_characters = 32;} elsif ($type eq 'neg') {$data_characters = 64;} else {return $label;}
my $available_characters = abs(($graph_width+$graph_border_width)/$pixels_per_character)-$padding_characters-$data_characters; my $available_characters = abs(($graph_width+$graph_border_width)/$pixels_per_character)-$padding_characters-$data_characters;
@ -117,9 +127,9 @@ sub trim_label {
} }
# Global variables # Global variables
my (%domains,$domain,$munindomain,$cpusecs,$memk,$nettxk,$netrxk,$vbdrd,$vbdwr); my (%domains,$domain,@domainlist,$munindomain,$cpusecs,$cpupercent,$memk,$nettxk,$netrxk,$vbdrd,$vbdwr);
open (XENTOP,"xentop -b -f -i1 |") or die "Could not execute xentop, $!"; open (XENTOP,"xentop -b -f -i2 |") or die "Could not execute xentop, $!";
# Now we build a hash of hashes to store information # Now we build a hash of hashes to store information
while (<XENTOP>) { while (<XENTOP>) {
@ -129,7 +139,7 @@ while (<XENTOP>) {
next if /^NAME/; next if /^NAME/;
# We define only what we need # We define only what we need
($domain,undef,$cpusecs,undef,$memk,undef,undef,undef,undef,undef,$nettxk,$netrxk,undef,undef,$vbdrd,$vbdwr,undef,undef,undef) = split(/\s+/); ($domain,undef,$cpusecs,$cpupercent,$memk,undef,undef,undef,undef,undef,$nettxk,$netrxk,undef,undef,$vbdrd,$vbdwr,undef,undef,undef) = split(/\s+/);
# We have to store the sanitised domain name in a separate variable # We have to store the sanitised domain name in a separate variable
$domains{$domain}{'munindomain'} = clean_fieldname($domain); $domains{$domain}{'munindomain'} = clean_fieldname($domain);
@ -137,6 +147,7 @@ while (<XENTOP>) {
# We need the remaining data only for a normal run # We need the remaining data only for a normal run
if ($ARGV[0] eq "") { if ($ARGV[0] eq "") {
$domains{$domain}{'cpusecs'} = $cpusecs; $domains{$domain}{'cpusecs'} = $cpusecs;
$domains{$domain}{'cpupercent'} = $cpupercent;
$domains{$domain}{'mem'} = $memk; $domains{$domain}{'mem'} = $memk;
$domains{$domain}{'nettx'} = $nettxk; $domains{$domain}{'nettx'} = $nettxk;
$domains{$domain}{'netrx'} = $netrxk; $domains{$domain}{'netrx'} = $netrxk;
@ -145,71 +156,94 @@ while (<XENTOP>) {
} }
} }
@domainlist = sort(keys(%domains));
# #
# config - quite simple, too # config - quite simple, too
# #
if ($ARGV[0] eq "config") { if ($ARGV[0] eq "config") {
print "multigraph xen_cpu_time\n"; if ($XEN_SKIP !~ /cput/) {
print "graph_title Xen domains CPU time\n"; print "multigraph xen_cpu_time\n";
print "graph_args --base 1000 -l 0\n"; print "graph_title Xen domains CPU time\n";
print "graph_vlabel %\n"; print "graph_args --base 1000 -l 0\n";
print "graph_scale no\n"; print "graph_vlabel cpu seconds\n";
print "graph_category xen\n"; print "graph_scale no\n";
print "graph_info This graph shows CPU time for each Xen domain.\n"; print "graph_category xen\n";
for $domain (sort(keys(%domains))) { print "graph_info This graph shows CPU time for each Xen domain.\n";
print "$domains{$domain}{'munindomain'}_cpu_time.label ".trim_label('pos',$domain)."\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu_time.type DERIVE\n"; print "$domains{$domain}{'munindomain'}_cpu_time.label ".trim_label('pos',$domain)."\n";
print "$domains{$domain}{'munindomain'}_cpu_time.cdef $domains{$domain}{'munindomain'}_cpu_time,100,*\n"; print "$domains{$domain}{'munindomain'}_cpu_time.type DERIVE\n";
print "$domains{$domain}{'munindomain'}_cpu_time.min 0\n"; print "$domains{$domain}{'munindomain'}_cpu_time.cdef $domains{$domain}{'munindomain'}_cpu_time,100,*\n";
print "$domains{$domain}{'munindomain'}_cpu_time.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_cpu_time.min 0\n";
print "$domains{$domain}{'munindomain'}_cpu_time.draw AREASTACK\n";
}
} }
print "\nmultigraph xen_mem\n"; if ($XEN_SKIP !~ /cpup/) {
print "graph_title Xen domains memory usage\n"; print "\nmultigraph xen_cpu\n";
print "graph_args --base 1024 -l 0\n"; print "graph_title Xen domains CPU utilization\n";
print "graph_vlabel bytes\n"; print "graph_args --base 1000 -l 0 --upper-limit 100\n";
print "graph_category xen\n"; print "graph_vlabel %\n";
print "graph_info This graph shows memory usage for each Xen domain.\n"; print "graph_scale no\n";
for $domain (sort(keys(%domains))) { print "graph_category xen\n";
print "$domains{$domain}{'munindomain'}_mem.label ".trim_label('pos',$domain)."\n"; print "graph_info This graph shows CPU utilization for each Xen domain.\n";
print "$domains{$domain}{'munindomain'}_mem.cdef $domains{$domain}{'munindomain'}_mem,1024,*\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_mem.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_cpu.label ".trim_label('pos',$domain)."\n";
print "$domains{$domain}{'munindomain'}_cpu.draw AREASTACK\n"
}
} }
print "\nmultigraph xen_net\n"; if ($XEN_SKIP !~ /mem/) {
print "graph_title Xen domains network traffic\n"; print "\nmultigraph xen_mem\n";
print "graph_args --base 1000\n"; print "graph_title Xen domains memory usage\n";
print "graph_vlabel bits per \${graph_period} in (-) / out (+)\n"; print "graph_args --base 1024 -l 0\n";
print "graph_category xen\n"; print "graph_vlabel bytes\n";
print "graph_info This graph shows network traffic for each Xen domain.\n"; print "graph_category xen\n";
for $domain (sort(keys(%domains))) { print "graph_info This graph shows memory usage for each Xen domain.\n";
print "$domains{$domain}{'munindomain'}_netrx.label none\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_netrx.cdef $domains{$domain}{'munindomain'}_netrx,8192,*\n"; print "$domains{$domain}{'munindomain'}_mem.label ".trim_label('pos',$domain)."\n";
print "$domains{$domain}{'munindomain'}_netrx.type COUNTER\n"; print "$domains{$domain}{'munindomain'}_mem.cdef $domains{$domain}{'munindomain'}_mem,1024,*\n";
print "$domains{$domain}{'munindomain'}_netrx.graph no\n"; print "$domains{$domain}{'munindomain'}_mem.draw AREASTACK\n";
print "$domains{$domain}{'munindomain'}_nettx.label ".trim_label('neg',$domain)."\n"; }
print "$domains{$domain}{'munindomain'}_nettx.cdef $domains{$domain}{'munindomain'}_nettx,8192,*\n";
print "$domains{$domain}{'munindomain'}_nettx.type COUNTER\n";
print "$domains{$domain}{'munindomain'}_nettx.draw AREASTACK\n";
print "$domains{$domain}{'munindomain'}_nettx.negative $domains{$domain}{'munindomain'}_netrx\n";
} }
print "\nmultigraph xen_disk\n"; if ($XEN_SKIP !~ /net/) {
print "graph_title Xen domains disk IOs\n"; print "\nmultigraph xen_net\n";
print "graph_args --base 1000\n"; print "graph_title Xen domains network traffic\n";
print "graph_vlabel IOs per \${graph_period} read (-) / write (+)\n"; print "graph_args --base 1000\n";
print "graph_category xen\n"; print "graph_vlabel bits per \${graph_period} in (-) / out (+)\n";
print "graph_info This graph shows disk IOs for each Xen domain.\n"; print "graph_category xen\n";
for $domain (sort(keys(%domains))) { print "graph_info This graph shows network traffic for each Xen domain.\n";
print "$domains{$domain}{'munindomain'}_vbdrd.label none\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_vbdrd.type COUNTER\n"; print "$domains{$domain}{'munindomain'}_netrx.label none\n";
print "$domains{$domain}{'munindomain'}_vbdrd.graph no\n"; print "$domains{$domain}{'munindomain'}_netrx.cdef $domains{$domain}{'munindomain'}_netrx,8192,*\n";
print "$domains{$domain}{'munindomain'}_vbdwr.label ".trim_label('neg',$domain)."\n"; print "$domains{$domain}{'munindomain'}_netrx.type COUNTER\n";
print "$domains{$domain}{'munindomain'}_vbdwr.type COUNTER\n"; print "$domains{$domain}{'munindomain'}_netrx.graph no\n";
print "$domains{$domain}{'munindomain'}_vbdwr.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_nettx.label ".trim_label('neg',$domain)."\n";
print "$domains{$domain}{'munindomain'}_vbdwr.negative $domains{$domain}{'munindomain'}_vbdrd\n"; print "$domains{$domain}{'munindomain'}_nettx.cdef $domains{$domain}{'munindomain'}_nettx,8192,*\n";
print "$domains{$domain}{'munindomain'}_nettx.type COUNTER\n";
print "$domains{$domain}{'munindomain'}_nettx.draw AREASTACK\n";
print "$domains{$domain}{'munindomain'}_nettx.negative $domains{$domain}{'munindomain'}_netrx\n";
}
}
if ($XEN_SKIP !~ /disk/) {
print "\nmultigraph xen_disk\n";
print "graph_title Xen domains disk IOs\n";
print "graph_args --base 1000\n";
print "graph_vlabel IOs per \${graph_period} read (-) / write (+)\n";
print "graph_category xen\n";
print "graph_info This graph shows disk IOs for each Xen domain.\n";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_vbdrd.label none\n";
print "$domains{$domain}{'munindomain'}_vbdrd.type COUNTER\n";
print "$domains{$domain}{'munindomain'}_vbdrd.graph no\n";
print "$domains{$domain}{'munindomain'}_vbdwr.label ".trim_label('neg',$domain)."\n";
print "$domains{$domain}{'munindomain'}_vbdwr.type COUNTER\n";
print "$domains{$domain}{'munindomain'}_vbdwr.draw AREASTACK\n";
print "$domains{$domain}{'munindomain'}_vbdwr.negative $domains{$domain}{'munindomain'}_vbdrd\n";
}
} }
exit 0; exit 0;
@ -220,24 +254,40 @@ if ($ARGV[0] eq "config") {
# Normal run # Normal run
# #
print "multigraph xen_cpu_time\n"; if ($XEN_SKIP !~ /cput/) {
for $domain (sort(keys(%domains))) { print "multigraph xen_cpu_time\n";
print "$domains{$domain}{'munindomain'}_cpu_time.value $domains{$domain}{'cpusecs'}\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu_time.value $domains{$domain}{'cpusecs'}\n";
}
} }
print "\nmultigraph xen_mem\n"; if ($XEN_SKIP !~ /cpup/) {
for $domain (sort(keys(%domains))) { print "\nmultigraph xen_cpu\n";
print "$domains{$domain}{'munindomain'}_mem.value $domains{$domain}{'mem'}\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu.value $domains{$domain}{'cpupercent'}\n";
}
} }
print "\nmultigraph xen_net\n"; if ($XEN_SKIP !~ /mem/) {
for $domain (sort(keys(%domains))) { print "\nmultigraph xen_mem\n";
print "$domains{$domain}{'munindomain'}_nettx.value $domains{$domain}{'nettx'}\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_netrx.value $domains{$domain}{'netrx'}\n"; print "$domains{$domain}{'munindomain'}_mem.value $domains{$domain}{'mem'}\n";
}
} }
print "\nmultigraph xen_disk\n"; if ($XEN_SKIP !~ /net/) {
for $domain (sort(keys(%domains))) { print "\nmultigraph xen_net\n";
print "$domains{$domain}{'munindomain'}_vbdrd.value $domains{$domain}{'vbdrd'}\n"; for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_vbdwr.value $domains{$domain}{'vbdwr'}\n"; print "$domains{$domain}{'munindomain'}_nettx.value $domains{$domain}{'nettx'}\n";
print "$domains{$domain}{'munindomain'}_netrx.value $domains{$domain}{'netrx'}\n";
}
} }
if ($XEN_SKIP !~ /disk/) {
print "\nmultigraph xen_disk\n";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_vbdrd.value $domains{$domain}{'vbdrd'}\n";
print "$domains{$domain}{'munindomain'}_vbdwr.value $domains{$domain}{'vbdwr'}\n";
}
}