1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-25 02:18:08 +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,46 +156,66 @@ while (<XENTOP>) {
} }
} }
@domainlist = sort(keys(%domains));
# #
# config - quite simple, too # config - quite simple, too
# #
if ($ARGV[0] eq "config") { if ($ARGV[0] eq "config") {
if ($XEN_SKIP !~ /cput/) {
print "multigraph xen_cpu_time\n"; print "multigraph xen_cpu_time\n";
print "graph_title Xen domains CPU time\n"; print "graph_title Xen domains CPU time\n";
print "graph_args --base 1000 -l 0\n"; print "graph_args --base 1000 -l 0\n";
print "graph_vlabel %\n"; print "graph_vlabel cpu seconds\n";
print "graph_scale no\n"; print "graph_scale no\n";
print "graph_category xen\n"; print "graph_category xen\n";
print "graph_info This graph shows CPU time for each Xen domain.\n"; print "graph_info This graph shows CPU time for each Xen domain.\n";
for $domain (sort(keys(%domains))) { for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu_time.label ".trim_label('pos',$domain)."\n"; print "$domains{$domain}{'munindomain'}_cpu_time.label ".trim_label('pos',$domain)."\n";
print "$domains{$domain}{'munindomain'}_cpu_time.type DERIVE\n"; print "$domains{$domain}{'munindomain'}_cpu_time.type DERIVE\n";
print "$domains{$domain}{'munindomain'}_cpu_time.cdef $domains{$domain}{'munindomain'}_cpu_time,100,*\n"; print "$domains{$domain}{'munindomain'}_cpu_time.cdef $domains{$domain}{'munindomain'}_cpu_time,100,*\n";
print "$domains{$domain}{'munindomain'}_cpu_time.min 0\n"; print "$domains{$domain}{'munindomain'}_cpu_time.min 0\n";
print "$domains{$domain}{'munindomain'}_cpu_time.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_cpu_time.draw AREASTACK\n";
} }
}
if ($XEN_SKIP !~ /cpup/) {
print "\nmultigraph xen_cpu\n";
print "graph_title Xen domains CPU utilization\n";
print "graph_args --base 1000 -l 0 --upper-limit 100\n";
print "graph_vlabel %\n";
print "graph_scale no\n";
print "graph_category xen\n";
print "graph_info This graph shows CPU utilization for each Xen domain.\n";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu.label ".trim_label('pos',$domain)."\n";
print "$domains{$domain}{'munindomain'}_cpu.draw AREASTACK\n"
}
}
if ($XEN_SKIP !~ /mem/) {
print "\nmultigraph xen_mem\n"; print "\nmultigraph xen_mem\n";
print "graph_title Xen domains memory usage\n"; print "graph_title Xen domains memory usage\n";
print "graph_args --base 1024 -l 0\n"; print "graph_args --base 1024 -l 0\n";
print "graph_vlabel bytes\n"; print "graph_vlabel bytes\n";
print "graph_category xen\n"; print "graph_category xen\n";
print "graph_info This graph shows memory usage for each Xen domain.\n"; print "graph_info This graph shows memory usage for each Xen domain.\n";
for $domain (sort(keys(%domains))) { for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_mem.label ".trim_label('pos',$domain)."\n"; print "$domains{$domain}{'munindomain'}_mem.label ".trim_label('pos',$domain)."\n";
print "$domains{$domain}{'munindomain'}_mem.cdef $domains{$domain}{'munindomain'}_mem,1024,*\n"; print "$domains{$domain}{'munindomain'}_mem.cdef $domains{$domain}{'munindomain'}_mem,1024,*\n";
print "$domains{$domain}{'munindomain'}_mem.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_mem.draw AREASTACK\n";
} }
}
if ($XEN_SKIP !~ /net/) {
print "\nmultigraph xen_net\n"; print "\nmultigraph xen_net\n";
print "graph_title Xen domains network traffic\n"; print "graph_title Xen domains network traffic\n";
print "graph_args --base 1000\n"; print "graph_args --base 1000\n";
print "graph_vlabel bits per \${graph_period} in (-) / out (+)\n"; print "graph_vlabel bits per \${graph_period} in (-) / out (+)\n";
print "graph_category xen\n"; print "graph_category xen\n";
print "graph_info This graph shows network traffic for each Xen domain.\n"; print "graph_info This graph shows network traffic for each Xen domain.\n";
for $domain (sort(keys(%domains))) { for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_netrx.label none\n"; print "$domains{$domain}{'munindomain'}_netrx.label none\n";
print "$domains{$domain}{'munindomain'}_netrx.cdef $domains{$domain}{'munindomain'}_netrx,8192,*\n"; print "$domains{$domain}{'munindomain'}_netrx.cdef $domains{$domain}{'munindomain'}_netrx,8192,*\n";
print "$domains{$domain}{'munindomain'}_netrx.type COUNTER\n"; print "$domains{$domain}{'munindomain'}_netrx.type COUNTER\n";
@ -195,14 +226,16 @@ if ($ARGV[0] eq "config") {
print "$domains{$domain}{'munindomain'}_nettx.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_nettx.draw AREASTACK\n";
print "$domains{$domain}{'munindomain'}_nettx.negative $domains{$domain}{'munindomain'}_netrx\n"; print "$domains{$domain}{'munindomain'}_nettx.negative $domains{$domain}{'munindomain'}_netrx\n";
} }
}
if ($XEN_SKIP !~ /disk/) {
print "\nmultigraph xen_disk\n"; print "\nmultigraph xen_disk\n";
print "graph_title Xen domains disk IOs\n"; print "graph_title Xen domains disk IOs\n";
print "graph_args --base 1000\n"; print "graph_args --base 1000\n";
print "graph_vlabel IOs per \${graph_period} read (-) / write (+)\n"; print "graph_vlabel IOs per \${graph_period} read (-) / write (+)\n";
print "graph_category xen\n"; print "graph_category xen\n";
print "graph_info This graph shows disk IOs for each Xen domain.\n"; print "graph_info This graph shows disk IOs for each Xen domain.\n";
for $domain (sort(keys(%domains))) { for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_vbdrd.label none\n"; print "$domains{$domain}{'munindomain'}_vbdrd.label none\n";
print "$domains{$domain}{'munindomain'}_vbdrd.type COUNTER\n"; print "$domains{$domain}{'munindomain'}_vbdrd.type COUNTER\n";
print "$domains{$domain}{'munindomain'}_vbdrd.graph no\n"; print "$domains{$domain}{'munindomain'}_vbdrd.graph no\n";
@ -211,6 +244,7 @@ if ($ARGV[0] eq "config") {
print "$domains{$domain}{'munindomain'}_vbdwr.draw AREASTACK\n"; print "$domains{$domain}{'munindomain'}_vbdwr.draw AREASTACK\n";
print "$domains{$domain}{'munindomain'}_vbdwr.negative $domains{$domain}{'munindomain'}_vbdrd\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";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu_time.value $domains{$domain}{'cpusecs'}\n"; 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";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_cpu.value $domains{$domain}{'cpupercent'}\n";
}
}
if ($XEN_SKIP !~ /mem/) {
print "\nmultigraph xen_mem\n";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_mem.value $domains{$domain}{'mem'}\n"; print "$domains{$domain}{'munindomain'}_mem.value $domains{$domain}{'mem'}\n";
}
} }
print "\nmultigraph xen_net\n"; if ($XEN_SKIP !~ /net/) {
for $domain (sort(keys(%domains))) { print "\nmultigraph xen_net\n";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_nettx.value $domains{$domain}{'nettx'}\n"; print "$domains{$domain}{'munindomain'}_nettx.value $domains{$domain}{'nettx'}\n";
print "$domains{$domain}{'munindomain'}_netrx.value $domains{$domain}{'netrx'}\n"; print "$domains{$domain}{'munindomain'}_netrx.value $domains{$domain}{'netrx'}\n";
}
} }
print "\nmultigraph xen_disk\n"; if ($XEN_SKIP !~ /disk/) {
for $domain (sort(keys(%domains))) { print "\nmultigraph xen_disk\n";
for $domain (@domainlist) {
print "$domains{$domain}{'munindomain'}_vbdrd.value $domains{$domain}{'vbdrd'}\n"; print "$domains{$domain}{'munindomain'}_vbdrd.value $domains{$domain}{'vbdrd'}\n";
print "$domains{$domain}{'munindomain'}_vbdwr.value $domains{$domain}{'vbdwr'}\n"; print "$domains{$domain}{'munindomain'}_vbdwr.value $domains{$domain}{'vbdwr'}\n";
}
} }