Munin
Installation
Packages
The package "munin" needs to be installed on the "server", the machine that is collecting the data from all the client machines where "munin-node" is installed:
apt-get install munin munin-node # Debian, Ubuntu yum install munin munin-node # Fedora port install munin # MacOS
Note: For Munin to work on MacOS, we need to create a user (and a group):
sudo dscl . create /Groups/munin PrimaryGroupId 4949 sudo dscl . create /Users/munin UniqueId 4949 sudo dscl . create /Users/munin PrimaryGroupId 4949 sudo dscl . create /Users/munin UserShell /bin/false sudo dscl . create /Users/munin NFSHomeDirectory /nohome sudo dscl . create /Users/munin RealName Munin sudo dscl . create /Groups/munin GroupMembership munin
Source
The following prerequisites should be installed before building Munin:
apt-get install librrds-perl libhtml-template-perl liblog-log4perl-perl \ libnet-ssleay-perl libnet-snmp-perl libnet-server-perl
Install a munin user:
useradd -d /var/lib/munin -m -r -s /bin/false -U munin
git clone git://github.com/munin-monitoring/munin.git munin-git cd munin-git
Edit Makefile.config, e.g. like this:
PREFIX = $(DESTDIR)/opt/munin CONFDIR = $(PREFIX)/etc DBDIR = $(PREFIX)/var/lib STATEDIR = $(PREFIX)/var/run PERLLIB = $(PREFIX)$(PERLSITELIB)
Build & install:
make sudo make install
Configuration
munin.conf
This configuration file is really minimal and only holds something like this:
graph_period minute # contact.email.command mail -s "Munin: ${var:host}" admin@example.com # contact.email.always_send warning critical includedir /etc/munin/munin-conf.d
munin-conf.d/node-foo.conf
A configuration file for each host:
[node-foo.example.com] address 10.0.0.12 port 4949 use_node_name yes load.load.warning 15 load.load.critical 20
munin-node.conf
Each client should have a configuration similar to this:
log_level 4 log_file /var/log/munin/munin-node.log pid_file /var/run/munin/munin-node.pid background 1 setsid 1 user root group root # Files to ignore when locating plugins. ignore_file ~$ ignore_file DEADJOE$ ignore_file \.bak$ ignore_file %$ ignore_file \.dpkg-(tmp|new|old|dist)$ ignore_file \.rpm(save|new)$ ignore_file \.pod$ # Override local hostname, usually not needed # host_name node-foo.example.com # Regular expression of hosts that may query the munin-node process # May be replaced by cidr_allow which is much more readable. allow ^127\.0\.0\.1$ allow ^10\.0\.0\.2$ cidr_allow 10.2.0.0/24 # Address to bind to host 10.0.0.33 port 4949
plugins/
The active plugins are being linked in /etc/munin/plugins:
$ pwd /etc/munin/plugins $ ls -lgo lrwxrwxrwx. 1 28 Jul 4 02:42 cpu -> /usr/share/munin/plugins/cpu lrwxrwxrwx. 1 27 Jul 4 02:42 df -> /usr/share/munin/plugins/df lrwxrwxrwx. 1 28 Jul 4 02:42 if_eth0 -> /usr/share/munin/plugins/if_ lrwxrwxrwx. 1 43 Jul 4 02:42 du_multidirs -> /usr/local/share/munin/plugins/du_multidirs lrwxrwxrwx. 1 35 Jul 4 02:42 interrupts -> /usr/share/munin/plugins/interrupts lrwxrwxrwx. 1 31 Jul 4 02:42 iostat -> /usr/share/munin/plugins/iostat lrwxrwxrwx. 1 33 Jul 4 02:42 irqstats -> /usr/share/munin/plugins/irqstats lrwxrwxrwx. 1 29 Jul 4 02:42 load -> /usr/share/munin/plugins/load lrwxrwxrwx. 1 31 Jul 4 02:42 memory -> /usr/share/munin/plugins/memory lrwxrwxrwx. 1 40 Jul 4 02:42 multiping -> /usr/local/share/munin/plugins/multiping lrwxrwxrwx. 1 32 Jul 4 02:42 multips -> /usr/share/munin/plugins/multips lrwxrwxrwx. 1 38 Jul 4 02:42 mysql_queries -> /usr/share/munin/plugins/mysql_queries lrwxrwxrwx. 1 32 Jul 4 02:42 netstat -> /usr/share/munin/plugins/netstat lrwxrwxrwx. 1 42 Jul 4 02:42 postfix_mailqueue -> /usr/share/munin/plugins/postfix_mailqueue lrwxrwxrwx. 1 42 Jul 4 02:42 postfix_mailstats -> /usr/share/munin/plugins/postfix_mailstats lrwxrwxrwx. 1 43 Jul 4 02:42 postfix_mailvolume -> /usr/share/munin/plugins/postfix_mailvolume lrwxrwxrwx. 1 34 Jul 4 02:42 processes -> /usr/share/munin/plugins/processes lrwxrwxrwx. 1 31 Jul 4 02:42 vmstat -> /usr/share/munin/plugins/vmstat
plugin-conf.d/
Some plugins might require some configuration directives:
$ cat munin-node [df*] env.exclude none unknown iso9660 squashfs udf romfs ramfs debugfs tmpfs env.warning 92 env.critical 98 [smart_*] user root [...]
Usage
Usually the server will query all the client nodes via a cronjob:
$ cat /etc/cron.d/munin */5 * * * * munin if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi
Each plugin can be queried manually as well:
$ sudo -u munin munin-run load load.value 0.66
Or, via direct interaction with munin-node:
$ echo fetch if_eth0 | nc node-foo 4949 # munin node at node-foo.example.org down.value 1897882515 up.value 129492565
When munin-node cannot be started as a daemon, we can emulate inetd behaviour:
while [ ! -f /tmp/no_munin ]; do nc -e /bin/munin-node -l -p 4949; done