aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xfiles/munin/vserver_cpu_3
-rw-r--r--files/munin/vserver_loadavg3
-rwxr-xr-xfiles/munin/vserver_resources3
-rw-r--r--files/munin/xen-multi243
-rw-r--r--manifests/openvpn.pp4
-rw-r--r--manifests/vserver.pp10
-rw-r--r--manifests/xen.pp60
7 files changed, 296 insertions, 30 deletions
diff --git a/files/munin/vserver_cpu_ b/files/munin/vserver_cpu_
index 981f262..8ce3a95 100755
--- a/files/munin/vserver_cpu_
+++ b/files/munin/vserver_cpu_
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
#
# Copyright (C) 2006-2008 Holger Levsen and Micah Anderson
#
@@ -63,6 +63,7 @@
VSERVERS="$vservers"
+# FIXME: using arrays is a bashism
INFO=(`sed 's/.*:\t//' /proc/virtual/info 2>/dev/null || echo '<none>'`)
KCIN="$[ 16#${INFO[2]} ]";
diff --git a/files/munin/vserver_loadavg b/files/munin/vserver_loadavg
index 43ce5e1..147eff9 100644
--- a/files/munin/vserver_loadavg
+++ b/files/munin/vserver_loadavg
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
#
# Copyright (C) 2007 Andrei Morgan
# Copyright (C) 2008 Micah Anderson
@@ -56,6 +56,7 @@ fi
# if vservers are specified, use them; the default is to use all.
VSERVERS="$vservers"
+# FIXME: using arrays is a bashism
INFO=(`sed 's/.*:\t//' /proc/virtual/info 2>/dev/null || echo '<none>'`)
KCIN="$[ 16#${INFO[2]} ]";
diff --git a/files/munin/vserver_resources b/files/munin/vserver_resources
index 495614f..05dfecb 100755
--- a/files/munin/vserver_resources
+++ b/files/munin/vserver_resources
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
#
# Copyright (C) 2006-2008 Holger Levsen and Micah Anderson
#
@@ -127,6 +127,7 @@ VSERVERS="$vservers"
LIMITS="$limits"
RESOURCE="$resource"
+# FIXME: using arrays is a bashism
INFO=(`sed 's/.*:\t//' /proc/virtual/info 2>/dev/null || echo '<none>'`)
KCIN="$[ 16#${INFO[2]} ]";
diff --git a/files/munin/xen-multi b/files/munin/xen-multi
new file mode 100644
index 0000000..c57a2b8
--- /dev/null
+++ b/files/munin/xen-multi
@@ -0,0 +1,243 @@
+#! /usr/bin/perl
+
+# -*- perl -*-
+
+=head1 NAME
+
+xen_multi - Munin multigraph plugin to monitor Xen domains activity
+
+=head1 APPLICABLE SYSTEMS
+
+This plugin should work on any system running a Xen hypervisor and where xentop
+is installed. It also needs Munin 1.4.0 or higher, since it uses AREASTACK
+(available from 1.3.3) and multigraph (available from 1.4.0).
+
+=head1 CONFIGURATION
+
+xentop requires superuser privileges, so you need to include in your
+configuration:
+
+ [xen-multi]
+ user root
+
+Then restart munin-node and you're done.
+
+=head1 INTERPRETATION
+
+This plugin produces four different graphs: CPU usage, memory usage, disk IOs
+and network traffic.
+
+In each graph, all Xen domains (including dom0) have their data stacked, giving
+an overall amount of ressources used.
+
+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
+along the different graphs.
+
+=head2 CPU usage
+
+This graph shows a percentage of the CPU time used by each domain.
+
+=head2 Memory usage
+
+This graph shows the amount of memory (in bytes) used by each domain.
+
+=head2 Disk IOs
+
+This graph shows the number of disk read and write operations for each domain.
+
+=head2 Network traffic
+
+This graph shows the amount of bits received and transmitted for each domain.
+
+=head1 ACKNOWLEDGEMENTS
+
+Michael Renner for the C<diskstats> plugin which I borrowed some code from.
+
+=head1 VERSION
+
+0.90
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=head1 AUTHOR
+
+Raphael HALIMI <raphael.halimi@gmail.com>
+
+=head1 LICENSE
+
+GPLv2
+
+=cut
+
+use strict;
+use Munin::Plugin;
+
+# autoconf - quite simple
+if ($ARGV[0] eq "autoconf") {
+ if (`which xentop`) {
+ print "yes\n";
+ } else {
+ print "no (xentop not found)\n";
+ }
+ exit 0;
+}
+
+
+#
+# Common steps for both "config" and a normal run
+#
+
+#
+# trim_label
+#
+# Trims a given label to it's non-wrapping size
+# $type = 'pos' for normal graphs and 'neg' for mirror graphs
+# pos: nnn.nnU_ times 4
+# neg: nnn.nnU/nnn.nnU_ times 4
+
+sub trim_label {
+ my ($type, $label) = @_; my $data_characters;
+ my ($graph_width, $graph_border_width, $padding_characters, $pixels_per_character) = (400,97,10,6);
+ 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;
+
+ # If the label is longer than the available space, we write as many
+ # characters as we can on both left and right, and two dots in the middle
+ if ( $available_characters < length $label ) {
+ my $center = ($available_characters-2)/2;
+ $label = substr($label,0,($center)) . '..' . substr($label,-$center);
+ }
+
+ return $label;
+}
+
+# Global variables
+my (%domains,$domain,$munindomain,$cpusecs,$memk,$nettxk,$netrxk,$vbdrd,$vbdwr);
+
+open (XENTOP,"xentop -b -f -i1 |") or die "Could not execute xentop, $!";
+
+# Now we build a hash of hashes to store information
+while (<XENTOP>) {
+ # Some cleaning first
+ s/^\s+//; chomp;
+ # Skip the headers
+ next if /^NAME/;
+
+ # 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+/);
+
+ # We have to store the sanitised domain name in a separate variable
+ $domains{$domain}{'munindomain'} = clean_fieldname($domain);
+
+ # We need the remaining data only for a normal run
+ if ($ARGV[0] eq "") {
+ $domains{$domain}{'cpusecs'} = $cpusecs;
+ $domains{$domain}{'mem'} = $memk;
+ $domains{$domain}{'nettx'} = $nettxk;
+ $domains{$domain}{'netrx'} = $netrxk;
+ $domains{$domain}{'vbdrd'} = $vbdrd;
+ $domains{$domain}{'vbdwr'} = $vbdwr;
+ }
+}
+
+
+#
+# config - quite simple, too
+#
+
+if ($ARGV[0] eq "config") {
+ print "multigraph xen_cpu_time\n";
+ print "graph_title Xen domains CPU time\n";
+ print "graph_args --base 1000 -l 0\n";
+ print "graph_vlabel %\n";
+ print "graph_scale no\n";
+ print "graph_category xen\n";
+ print "graph_info This graph shows CPU time for each Xen domain.\n";
+ for $domain (sort(keys(%domains))) {
+ 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.cdef $domains{$domain}{'munindomain'}_cpu_time,100,*\n";
+ print "$domains{$domain}{'munindomain'}_cpu_time.min 0\n";
+ print "$domains{$domain}{'munindomain'}_cpu_time.draw AREASTACK\n";
+ }
+
+ print "\nmultigraph xen_mem\n";
+ print "graph_title Xen domains memory usage\n";
+ print "graph_args --base 1024 -l 0\n";
+ print "graph_vlabel bytes\n";
+ print "graph_category xen\n";
+ print "graph_info This graph shows memory usage for each Xen domain.\n";
+ for $domain (sort(keys(%domains))) {
+ 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.draw AREASTACK\n";
+ }
+
+ print "\nmultigraph xen_net\n";
+ print "graph_title Xen domains network traffic\n";
+ print "graph_args --base 1000\n";
+ print "graph_vlabel bits per \${graph_period} in (-) / out (+)\n";
+ print "graph_category xen\n";
+ print "graph_info This graph shows network traffic for each Xen domain.\n";
+ for $domain (sort(keys(%domains))) {
+ 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.type COUNTER\n";
+ print "$domains{$domain}{'munindomain'}_netrx.graph no\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";
+ 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 (sort(keys(%domains))) {
+ 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;
+}
+
+
+#
+# Normal run
+#
+
+print "multigraph xen_cpu_time\n";
+for $domain (sort(keys(%domains))) {
+ print "$domains{$domain}{'munindomain'}_cpu_time.value $domains{$domain}{'cpusecs'}\n";
+}
+
+print "\nmultigraph xen_mem\n";
+for $domain (sort(keys(%domains))) {
+ print "$domains{$domain}{'munindomain'}_mem.value $domains{$domain}{'mem'}\n";
+}
+
+print "\nmultigraph xen_net\n";
+for $domain (sort(keys(%domains))) {
+ print "$domains{$domain}{'munindomain'}_nettx.value $domains{$domain}{'nettx'}\n";
+ print "$domains{$domain}{'munindomain'}_netrx.value $domains{$domain}{'netrx'}\n";
+}
+
+print "\nmultigraph xen_disk\n";
+for $domain (sort(keys(%domains))) {
+ print "$domains{$domain}{'munindomain'}_vbdrd.value $domains{$domain}{'vbdrd'}\n";
+ print "$domains{$domain}{'munindomain'}_vbdwr.value $domains{$domain}{'vbdwr'}\n";
+}
diff --git a/manifests/openvpn.pp b/manifests/openvpn.pp
index 7745d38..5aa8d92 100644
--- a/manifests/openvpn.pp
+++ b/manifests/openvpn.pp
@@ -14,10 +14,10 @@ class virtual::openvpn::base {
class virtual::openvpn::host_base inherits virtual::openvpn::base {
file {
"/var/lib/puppet/modules/virtual/openvpn/create_interface":
- source => "puppet://$server/modules/virtual/create_openvpn_interface",
+ source => "puppet:///modules/virtual/create_openvpn_interface",
mode => 0755, owner => root, group => 0;
"/var/lib/puppet/modules/virtual/openvpn/destroy_interface":
- source => "puppet://$server/modules/virtual/destroy_openvpn_interface",
+ source => "puppet:///modules/virtual/destroy_openvpn_interface",
mode => 0755, owner => root, group => 0;
}
}
diff --git a/manifests/vserver.pp b/manifests/vserver.pp
index 4d40b64..8f7437c 100644
--- a/manifests/vserver.pp
+++ b/manifests/vserver.pp
@@ -38,7 +38,7 @@ class vserver::host {
require => File["/etc/vservers"];
"/usr/local/bin/build_vserver":
- source => "puppet://$server/modules/virtual/vserver/build_vserver",
+ source => "puppet:///modules/virtual/vserver/build_vserver",
mode => 0755, owner => root, group => root,
require => [ Package['util-vserver'], Package[debootstrap]];
@@ -53,7 +53,7 @@ class vserver::host {
# perhaps we should use hashify.
# but i'm commenting this out until we learn how to properly use in case we want to use it.
#"/etc/cron.daily/vserver-hashify":
- # source => "puppet://$server/virtual/hashify.cron.daily",
+ # source => "puppet:///virtual/hashify.cron.daily",
# mode => 0755, owner => root, group => root;
}
@@ -77,15 +77,15 @@ class vserver::host {
default: {
file {
"/usr/local/share/munin-plugins/vserver_resources":
- source => "puppet://$server/modules/virtual/munin/vserver_resources",
+ source => "puppet:///modules/virtual/munin/vserver_resources",
mode => 0755, owner => root, group => root;
"/usr/local/share/munin-plugins/vserver_cpu_":
- source => "puppet://$server/modules/virtual/munin/vserver_cpu_",
+ source => "puppet:///modules/virtual/munin/vserver_cpu_",
mode => 0755, owner => root, group => root;
"/usr/local/share/munin-plugins/vserver_loadavg":
- source => "puppet://$server/modules/virtual/munin/vserver_loadavg",
+ source => "puppet:///modules/virtual/munin/vserver_loadavg",
mode => 0755, owner => root, group => root;
}
}
diff --git a/manifests/xen.pp b/manifests/xen.pp
index 301b316..516a59c 100644
--- a/manifests/xen.pp
+++ b/manifests/xen.pp
@@ -4,12 +4,17 @@
class munin::plugins::xen {
munin::remoteplugin {
- xen_mem:
- source => "puppet://$server/modules/virtual/munin/xen_mem",
- config => "user root";
+ xen-multi:
+ source => "puppet:///modules/virtual/munin/xen_mem",
+ config => "user root",
+ ensure => absent;
xen_vm:
- source => "puppet://$server/modules/virtual/munin/xen_vm",
- config => "user root";
+ source => "puppet:///modules/virtual/munin/xen_vm",
+ config => "user root",
+ ensure => absent;
+ 'xen-multi':
+ source => 'puppet:///modules/virtual/munin/xen-multi',
+ config => 'user root';
}
}
@@ -41,14 +46,13 @@ class xen::domain::base {
}
file{'/etc/xen/xend-config.sxp':
- source => [ "puppet://$server/files/virtual/xen/${fqdn}/config/xend-config.sxp",
- "puppet://$server/files/virtual/xen/config/${domain}/xend-config.sxp",
- "puppet://$server/files/virtual/xen/config/${operatingsystem}/xend-config.sxp",
- "puppet://$server/files/virtual/xen/config/${operatingsystem}/$lsbdistcodename/xend-config.sxp",
- "puppet://$server/files/virtual/xen/config/xend-config.sxp",
- "puppet://$server/modules/virtual/xen/config/${operatingsystem}/xend-config.sxp",
- "puppet://$server/modules/virtual/xen/config/${operatingsystem}/$lsbdistcodename/xend-config.sxp",
- "puppet://$server/modules/virtual/xen/config/xend-config.sxp" ],
+ source => [ "puppet:///modules/site_virtual/xen/config/${fqdn}/config/xend-config.sxp",
+ "puppet:///modules/site_virtual/xen/config/${domain}/xend-config.sxp",
+ "puppet:///modules/site_virtual/xen/config/${operatingsystem}/xend-config.sxp",
+ "puppet:///modules/site_virtual/xen/config/${operatingsystem}/${lsbdistcodeename}/xend-config.sxp",
+ "puppet:///modules/site_virtual/xen/config/xend-config.sxp",
+ "puppet:///modules/virtual/xen/config/${operatingsystem}/xend-config.sxp",
+ "puppet:///modules/virtual/xen/config/xend-config.sxp" ],
notify => Service['xend'],
owner => root, group => 0, mode => 0644;
}
@@ -64,13 +68,13 @@ class xen::domain::centos inherits xen::domain::base {
}
file{'/etc/sysconfig/xend':
- source => "puppet://$server/modules/virtual/xen/${operatingsystem}/sysconfig/xend",
+ source => "puppet:///modules/virtual/xen/${operatingsystem}/sysconfig/xend",
notify => Service['xend'],
owner => root, group => 0, mode => 0644;
}
file{'/etc/sysconfig/xendomains':
- source => "puppet://$server/modules/virtual/xen/${operatingsystem}/sysconfig/xendomains",
+ source => "puppet:///modules/virtual/xen/${operatingsystem}/sysconfig/xendomains",
owner => root, group => 0, mode => 0644;
}
@@ -88,11 +92,21 @@ class xen::domain::centos inherits xen::domain::base {
}
class xen::domain::debian inherits xen::domain::base {
- $xen_linux_system = $architecture ? {
- amd64 => "xen-linux-system-2.6.26-1-xen-amd64",
- i386 => "xen-linux-system-2.6.26-1-xen-686"
+ case $lsbdistcodename {
+ "lenny": {
+ $xen_linux_system = $architecture ? {
+ amd64 => "xen-linux-system-2.6.26-2-xen-amd64",
+ i386 => "xen-linux-system-2.6.26-2-xen-686"
+ }
+ }
+ "squeeze": {
+ $xen_linux_system = $architecture ? {
+ /(amd64|x86_64)/ => "xen-linux-system-2.6.32-5-xen-amd64",
+ i386 => "xen-linux-system-2.6.32-5-xen-686"
+ }
+ }
}
-
+
package {
"$xen_linux_system":
ensure => present,
@@ -129,12 +143,18 @@ class xen::dom0::debian inherits xen::dom0::base {
ensure => "4.1-1~bpo50+1",
}
}
+ squeeze: {
+ package {
+ "xen-tools":
+ ensure => installed;
+ }
+ }
}
file {
"/etc/xen-tools/xen-tools.conf":
owner => root, group => 0, mode => 0644,
- content => template("virtual/xen-tools.conf.erb"),
+ content => template("site_virtual/xen/${operatingsystem}/${lsbdistcodename}/xen-tools.conf.erb"),
require => Package['xen-tools'];
}
}