#!/usr/bin/perl # =head1 NAGIOS MULTIGRAPH A Plugin to monitor Nagios Servers and their Performance (Multigraph) =head1 MUNIN CONFIGURATION [nagios_multi_*] user root env.binary /usr/local/nagios/bin/nagiostats *default* env.passive off *default* =head2 MUNIN ENVIRONMENT CONFIGURATION EXPLANATION binary = location of your nagiostats binary including binary passive = tell the plugin to graph passive results =head1 NODE CONFIGURATION Make sure the nagiostats binary exists and is executable by root or by the user specified that the plugin will run as. Available root graphs and subgraphs contained in this Plugin. services => I This graphs the current service problems. svcchkdetail => This graph shows current services warning,critical,unknown,checked,scheduled,flapping,down svcchkext => This graph shows the service check execution times svcchklat => This graph shows the service check latency times svcchksc => This graph shows the service check state change % hosts => I This graphs the current host problems. hostchkdetail => This graph shows current hosts down,unreachable,checked,scheduled,flapping,down hostchkext => This graph shows the host check execution times hostchklat => This graph shows the host check latency times hostchksc => This graph shows the host check state change % checks => I This graphs the current host problems. extcmdcount => This graph shows external command buffer availability / usage hostchkactcount => This graph shows the active host checks for the last 1,5,15,60M hostchkpsvcount => This graph shows the passive host checks for the last 1,5,15,60M * depends on passive flag, which defaults to off, and forces these graphs to not be drawn svcchkactcount => This graph shows the active service checks for the last 1,5,15,60M svcchkpsvcount => This graph shows the passive service checks for the last 1,5,15,60M * depends on passive flag, which defaults to off, and forces these graphs to not be drawn =head1 MUNIN PLUGIN DOCUMENTATION This is just some helpful links for plugin troubleshooting. http://munin-monitoring.org/wiki/Documentation#Plugins http://munin-monitoring.org/wiki/protocol-config =head1 AUTHOR Matt West < https://github.com/mhwest13/Nagios-Munin-Plugin > =head1 LICENSE GPLv2 =head1 MAGIC MARKERS #%# family=auto #%# capabilities=autoconf suggest =cut use strict; use warnings; use Munin::Plugin; use File::Basename; if (basename($0) !~ /^nagios_multi_/) { print "This script needs to be named nagios_multi_ and have symlinks which start the same.\n"; exit 1; } # tell munin about our multigraph capabilties need_multigraph(); # import binary information or use default setting my $binary = $ENV{binary} || '/usr/local/nagios/bin/nagiostats'; unless ((-e $binary) && (-x $binary)) { # err, I'm unable to run the binary specified print "no: Unable to execute $binary\n"; exit 1; } # import passive flag or use default setting my $passive = $ENV{passive} || 'off'; =head1 Graph Declarations This block of code builds up all of the graph info for all root / sub graphs. %graphs: is a container for all of the graph definition information. In here is where you'll find the configuration information for munin's graphing procedure. Format: $graph{graph_name} => { config => { You'll find the main graph config stored here { key => value }, { ... }, }, keys => [ 'Name', 'Name', 'Name', ... ], datasrc => [ Name: name given to data value Attr: Attribute and value, attribute must be valid plugin argument { name => 'Name', info => 'info about graph' }, { ... }, ], results => { You'll find the results info from a stats call stored here { key => value }, { ... }, }, } =cut my %graphs; # main graph for service checks $graphs{services} = { config => { args => '--lower-limit 0', vlabel => 'Service Problems', category => 'nagios', title => 'Service Problems', info => 'Current Service Problems by Alert Status', }, keys => [ 'NUMSVCOK', 'NUMSVCWARN', 'NUMSVCUNKN', 'NUMSVCCRIT' ], datasrc => [ { name => 'NUMSVCOK', label => 'Up', min => '0', type => 'GAUGE', info => 'number of services which are Ok.', graph => 'no', draw => 'LINE2' }, { name => 'NUMSVCWARN', label => 'Warning', min => '0', type => 'GAUGE', info => 'number of services which are Warning.', draw => 'LINE2' }, { name => 'NUMSVCUNKN', label => 'Unknown', min => '0', type => 'GAUGE', info => 'number of services which are Unknown.', draw => 'LINE2' }, { name => 'NUMSVCCRIT', label => 'Critical', min => '0', type => 'GAUGE', info => 'number of services which are Critical.', draw => 'LINE2' }, ], }; # multi-graph for service check detail information ( sub graph of service problems graph ) $graphs{svcchkdetail} = { config => { args => '--lower-limit 0', vlabel => 'Total Number of Service Checks', category => 'details', title => 'Detailed Service Info', info => 'Detailed Service Check Information', }, keys => [ 'NUMSVCWARN', 'NUMSVCUNKN', 'NUMSVCCRIT', 'NUMSVCCHECKED', 'NUMSVCSCHEDULED', 'NUMSVCFLAPPING', 'NUMSVCDOWNTIME' ], datasrc => [ { name => 'NUMSVCWARN', label => 'Warning', min => '0', type => 'GAUGE', info => 'number of services which are Warning.', draw => 'LINE2' }, { name => 'NUMSVCUNKN', label => 'Unknown', min => '0', type => 'GAUGE', info => 'number of services which are Unknown.', draw => 'LINE2' }, { name => 'NUMSVCCRIT', label => 'Critical', min => '0', type => 'GAUGE', info => 'number of services which are Critical.', draw => 'LINE2' }, { name => 'NUMSVCCHECKED', label => 'Checked', min => '0', type => 'GAUGE', info => 'total number of services that have been checked since start.', draw => 'LINE2' }, { name => 'NUMSVCSCHEDULED', label => 'Scheduled', min => '0', type => 'GAUGE', info => 'total number of services that are currently scheduled to be checked.', draw => 'LINE2' }, { name => 'NUMSVCFLAPPING', label => 'Flapping', min => '0', type => 'GAUGE', info => 'total number of services that are currently flapping.', draw => 'LINE2' }, { name => 'NUMSVCDOWNTIME', label => 'Scheduled Downtime', min => '0', type => 'GAUGE', info => 'total number of services that are currently in scheduled downtime.', draw => 'LINE2' }, ], }; # multi-graph for service check % state change ( sub graph of service problems graph ) $graphs{svcchksc} = { config => { args => '--lower-limit 0 --upper-limit 100', vlabel => '%', category => 'statechange', title => 'Service State Change', info => 'Total Percent of State Change between checks', }, keys => [ 'MINSVCPSC', 'MAXSVCPSC', 'AVGSVCPSC' ], datasrc => [ { name => 'MINSVCPSC', label => 'Min', min => '0', type => 'GAUGE', info => 'min service check % state change.', draw => 'AREA' }, { name => 'MAXSVCPSC', label => 'Max', min => '0', type => 'GAUGE', info => 'max service check % state change.', draw => 'AREA' }, { name => 'AVGSVCPSC', label => 'Average', min => '0', type => 'GAUGE', info => 'avg service check % state change.', draw => 'LINE2' }, ], }; # multi-graph for service check latency and execution times ( sub graph of service problems graph ) $graphs{svcchklat} = { config => { args => '--lower-limit 0', vlabel => 'time (ms)', category => 'latency', title => 'Service Check Latency Times', info => 'Service Check Latency Times', }, keys => [ 'MINACTSVCLAT', 'MAXACTSVCLAT', 'AVGACTSVCLAT' ], datasrc => [ { name => 'MINACTSVCLAT', label => 'Min Latency', min => '0', type => 'GAUGE', info => 'min active service check latency (ms).', draw => 'LINE2' }, { name => 'MAXACTSVCLAT', label => 'Max Latency', min => '0', type => 'GAUGE', info => 'max active service check latency (ms).', draw => 'LINE2' }, { name => 'AVGACTSVCLAT', label => 'Average Latency', min => '0', type => 'GAUGE', info => 'avg active service check latency (ms).', draw => 'LINE2' }, ], }; # multi-graph for service check execution time ( sub graph of service problems graph ) $graphs{svcchkext} = { config => { args => '--lower-limit 0', vlabel => 'time (ms)', category => 'execution', title => 'Service Check Execution Times', info => 'Service Check Execution Times', }, keys => [ 'MINACTSVCEXT', 'MAXACTSVCEXT', 'AVGACTSVCEXT' ], datasrc => [ { name => 'MINACTSVCEXT', label => 'Min Execution', min => '0', type => 'GAUGE', info => 'min active service check execution time (ms).', draw => 'LINE2' }, { name => 'MAXACTSVCEXT', label => 'Max Execution', min => '0', type => 'GAUGE', info => 'max active service check execution time (ms).', draw => 'LINE2' }, { name => 'AVGACTSVCEXT', label => 'Average Execution', min => '0', type => 'GAUGE', info => 'avg active service check execution time (ms).', draw => 'LINE2' }, ], }; # main graph for host problems $graphs{hosts} = { config => { args => '--lower-limit 0', vlabel => 'Host Problems', category => 'nagios', title => 'Host Problems', info => 'Current Host Problems by Alert Status', }, keys => [ 'NUMHSTUP', 'NUMHSTDOWN', 'NUMHSTUNR' ], datasrc => [ { name => 'NUMHSTUP', label => 'Up', min => '0', type => 'GAUGE', info => 'number of hosts up.', graph => 'no', draw => 'LINE2' }, { name => 'NUMHSTDOWN', label => 'Down', min => '0', type => 'GAUGE', info => 'number of hosts which are down.', draw => 'LINE2' }, { name => 'NUMHSTUNR', label => 'Unknown', min => '0', type => 'GAUGE', info => 'number of hosts which are Unreachable.', draw => 'LINE2' }, ], }; # multi-graph for host check detail information ( sub graph of host problems graph ) $graphs{hostchkdetail} = { config => { args => '--lower-limit 0', vlabel => 'Total Number of Host Checks', category => 'details', title => 'Detailed Host Info', info => 'Detailed Host Check Information', }, keys => [ 'NUMHSTDOWN', 'NUMHSTUNR', 'NUMHSTCHECKED', 'NUMHSTSCHEDULED', 'NUMHSTFLAPPING', 'NUMHSTDOWNTIME' ], datasrc => [ { name => 'NUMHSTDOWN', label => 'Down', min => '0', type => 'GAUGE', info => 'number of hosts which are down.', draw => 'LINE2' }, { name => 'NUMHSTUNR', label => 'Unknown', min => '0', type => 'GAUGE', info => 'number of hosts which are Unreachable.', draw => 'LINE2' }, { name => 'NUMHSTCHECKED', label => 'Checked', min => '0', type => 'GAUGE', info => 'total number of hosts that have been checked since start.', draw => 'LINE2' }, { name => 'NUMHSTSCHEDULED', label => 'Scheduled', min => '0', type => 'GAUGE', info => 'total number of hosts that are currently scheduled to be checked.', draw => 'LINE2' }, { name => 'NUMHSTFLAPPING', label => 'Flapping', min => '0', type => 'GAUGE', info => 'total number of hosts that are currently flapping.', draw => 'LINE2' }, { name => 'NUMHSTDOWNTIME', label => 'Downtime', min => '0', type => 'GAUGE', info => 'total number of hosts that are currently in scheduled downtime.', draw => 'LINE2' }, ], }; # multi-graph for host check % state change ( sub graph of host problems graph ) $graphs{hostchksc} = { config => { args => '--lower-limit 0 --upper-limit 100', vlabel => '%', category => 'statechange', title => 'Host State Change', info => 'Total Percent of State Change between checks', }, keys => [ 'MINHSTPSC', 'MAXHSTPSC', 'AVGHSTPSC' ], datasrc => [ { name => 'MINHSTPSC', label => 'Min', min => '0', type => 'GAUGE', info => 'min host check % state change.', draw => 'AREA' }, { name => 'MAXHSTPSC', label => 'Max', min => '0', type => 'GAUGE', info => 'max host check % state change.', draw => 'AREA' }, { name => 'AVGHSTPSC', label => 'Average', min => '0', type => 'GAUGE', info => 'avg host check % state change.', draw => 'LINE2' }, ], }; # multi-graph for host check latency times ( sub graph of host problems graph ) $graphs{hostchklat} = { config => { args => '--lower-limit 0', vlabel => 'time (ms)', category => 'latency', title => 'Host Check Latency Times', info => 'Host Check Latency Times', }, keys => [ 'MINACTHSTLAT', 'MAXACTHSTLAT', 'AVGACTHSTLAT' ], datasrc => [ { name => 'MINACTHSTLAT', label => 'Min Latency', min => '0', type => 'GAUGE', info => 'min active host check latency (ms).', draw => 'LINE2' }, { name => 'MAXACTHSTLAT', label => 'Max Latency', min => '0', type => 'GAUGE', info => 'max active host check latency (ms).', draw => 'LINE2' }, { name => 'AVGACTHSTLAT', label => 'Average Latency', min => '0', type => 'GAUGE', info => 'avg active host check latency (ms).', draw => 'LINE2' }, ], }; # multi-graph for host check execution times ( sub graph of host problems graph ) $graphs{hostchkext} = { config => { args => '--lower-limit 0', vlabel => 'time (ms)', category => 'execution', title => 'Host Check Execution Times', info => 'Host Check Execution Times', }, keys => [ 'MINACTHSTEXT', 'MAXACTHSTEXT', 'AVGACTHSTEXT' ], datasrc => [ { name => 'MINACTHSTEXT', label => 'Min Execution', min => '0', type => 'GAUGE', info => 'min active host check execution time (ms).', draw => 'LINE2' }, { name => 'MAXACTHSTEXT', label => 'Max Execution', min => '0', type => 'GAUGE', info => 'max active host check execution time (ms).', draw => 'LINE2' }, { name => 'AVGACTHSTEXT', label => 'Average Execution', min => '0', type => 'GAUGE', info => 'avg active host check execution time (ms).', draw => 'LINE2' }, ], }; # main graph for host / service check counts $graphs{checks} = { config => { args => '--lower-limit 0', vlabel => 'Total Number of Checks', category => 'nagios', title => 'Totals', info => 'Total Number of Service and Host Checks', }, keys => [ 'NUMSERVICES', 'NUMHOSTS' ], datasrc => [ { name => 'NUMSERVICES', label => 'Number of Services', min => '0', type => 'GAUGE', info => 'total number of services.', draw => 'LINE2' }, { name => 'NUMHOSTS', label => 'Number of Hosts', min => '0', type => 'GAUGE', info => 'total number of hosts.', draw => 'LINE2' }, ], }; # multi-graph for number of host checks in x mins ( sub graph of checks graph ) $graphs{hostchkactcount} = { config => { args => '--lower-limit 0', vlabel => 'Number Host Checks', category => 'active', title => 'Host Checks', info => 'Total Number of Active Host Checks', order => 'NUMHSTACTCHK60M NUMHSTACTCHK15M NUMHSTACTCHK5M NUMHSTACTCHK1M', }, keys => [ 'NUMHSTACTCHK1M', 'NUMHSTACTCHK5M', 'NUMHSTACTCHK15M', 'NUMHSTACTCHK60M' ], datasrc => [ { name => 'NUMHSTACTCHK1M', label => 'Active Checks 1m', min => '0', type => 'GAUGE', info => 'number of hosts actively checked in last 1 minutes.', draw => 'AREA' }, { name => 'NUMHSTACTCHK5M', label => 'Active Checks 5m', min => '0', type => 'GAUGE', info => 'number of hosts actively checked in last 5 minutes.', draw => 'AREA' }, { name => 'NUMHSTACTCHK15M', label => 'Active Checks 15m', min => '0', type => 'GAUGE', info => 'number of hosts actively checked in last 15 minutes.', draw => 'AREA' }, { name => 'NUMHSTACTCHK60M', label => 'Active Checks 60m', min => '0', type => 'GAUGE', info => 'number of hosts actively checked in last 60 minutes.', draw => 'AREA' }, ], }; # multi-graph for number of host checks in x mins ( sub graph of checks graph ) $graphs{hostchkpsvcount} = { config => { args => '--lower-limit 0', vlabel => 'Number Host Checks', category => 'passive', title => 'Host Checks', info => 'Total Number of Passive Host Checks', order => 'NUMHSTPSVCHK60M NUMHSTPSVCHK15M NUMHSTPSVCHK5M NUMHSTPSVCHK1M', }, keys => [ 'NUMHSTPSVCHK1M', 'NUMHSTPSVCHK5M', 'NUMHSTPSVCHK15M', 'NUMHSTPSVCHK60M' ], datasrc => [ { name => 'NUMHSTPSVCHK1M', label => 'Passive Checks 1m', min => '0', type => 'GAUGE', info => 'number of hosts passively checked in last 1 minutes.', draw => 'AREA' }, { name => 'NUMHSTPSVCHK5M', label => 'Passive Checks 5m', min => '0', type => 'GAUGE', info => 'number of hosts passively checked in last 5 minutes.', draw => 'AREA' }, { name => 'NUMHSTPSVCHK15M', label => 'Passive Checks 15m', min => '0', type => 'GAUGE', info => 'number of hosts passively checked in last 15 minutes.', draw => 'AREA' }, { name => 'NUMHSTPSVCHK60M', label => 'Passive Checks 60m', min => '0', type => 'GAUGE', info => 'number of hosts passively checked in last 60 minutes.', draw => 'AREA' }, ], }; # multi-graph for number of service checks in x mins ( sub graph of checks graph ) $graphs{svcchkactcount} = { config => { args => '--lower-limit 0', vlabel => 'Number of Service Checks', category => 'active', title => 'Service Checks', info => 'Total Number of Active Service Checks', order => 'NUMSVCACTCHK60M NUMSVCACTCHK15M NUMSVCACTCHK5M NUMSVCACTCHK1M', }, keys => [ 'NUMSVCACTCHK1M', 'NUMSVCACTCHK5M', 'NUMSVCACTCHK15M', 'NUMSVCACTCHK60M' ], datasrc => [ { name => 'NUMSVCACTCHK1M', label => 'Active Checks 1m', min => '0', type => 'GAUGE', info => 'number of services actively checked in last 1 minutes.', draw => 'AREA' }, { name => 'NUMSVCACTCHK5M', label => 'Active Checks 5m', min => '0', type => 'GAUGE', info => 'number of services actively checked in last 5 minutes.', draw => 'AREA' }, { name => 'NUMSVCACTCHK15M', label => 'Active Checks 15m', min => '0', type => 'GAUGE', info => 'number of services actively checked in last 15 minutes.', draw => 'AREA' }, { name => 'NUMSVCACTCHK60M', label => 'Active Checks 60m', min => '0', type => 'GAUGE', info => 'number of services actively checked in last 60 minutes.', draw => 'AREA' }, ], }; # multi-graph for number of service checks in x mins ( sub graph of checks graph ) $graphs{svcchkpsvcount} = { config => { args => '--lower-limit 0', vlabel => 'Number of Service Checks', category => 'passive', title => 'Service Checks', info => 'Total Number of Passive Service Checks', order => 'NUMSVCPSVCHK60M NUMSVCPSVCHK15M NUMSVCPSVCHK5M NUMSVCPSVCHK1M', }, keys => [ 'NUMSVCPSVCHK1M', 'NUMSVCPSVCHK5M', 'NUMSVCPSVCHK15M', 'NUMSVCPSVCHK60M' ], datasrc => [ { name => 'NUMSVCPSVCHK1M', label => 'Passive Checks 1m', min => '0', type => 'GAUGE', info => 'number of services passively checked in last 1 minutes.', draw => 'AREA' }, { name => 'NUMSVCPSVCHK5M', label => 'Passive Checks 5m', min => '0', type => 'GAUGE', info => 'number of services passively checked in last 5 minutes.', draw => 'AREA' }, { name => 'NUMSVCPSVCHK15M', label => 'Passive Checks 15m', min => '0', type => 'GAUGE', info => 'number of services passively checked in last 15 minutes.', draw => 'AREA' }, { name => 'NUMSVCPSVCHK60M', label => 'Passive Checks 60m', min => '0', type => 'GAUGE', info => 'number of services passively checked in last 60 minutes.', draw => 'AREA' }, ], }; # multi-graph for external command count ( sub graph of checks graph ) $graphs{extcmdcount} = { config => { args => '--lower-limit 0', vlabel => 'Number of Ext Command Slots', category => 'externalcmds', title => 'External Commands', info => 'External Command Buffer Slot Information', }, keys => [ 'TOTCMDBUF', 'USEDCMDBUF', 'HIGHCMDBUF', 'NUMEXTCMDS1M', 'NUMEXTCMDS5M', 'NUMEXTCMDS15M' ], datasrc => [ { name => 'TOTCMDBUF', label => 'Total', min => '0', type => 'GAUGE', info => 'total number of external command buffer slots available.', draw => 'AREA' }, { name => 'USEDCMDBUF', label => 'Current Used', min => '0', type => 'GAUGE', info => 'number of external command buffer slots currently in use.', draw => 'LINE2' }, { name => 'HIGHCMDBUF', label => 'Peak Used', min => '0', type => 'GAUGE', info => 'highest number of external command buffer slots ever in use.', draw => 'LINE2' }, { name => 'NUMEXTCMDS1M', label => 'Used last 1m', min => '0', type => 'GAUGE', info => 'number of external commands processed in last 1 minutes.', draw => 'LINE2' }, { name => 'NUMEXTCMDS5M', label => 'Used last 5m', min => '0', type => 'GAUGE', info => 'number of external commands processed in last 5 minutes.', draw => 'LINE2' }, { name => 'NUMEXTCMDS15M', label => 'Used last 15m', min => '0', type => 'GAUGE', info => 'number of external commands processed in last 15 minutes.', draw => 'LINE2' }, ], }; =head1 Munin Checks These checks look for config / autoconf / suggest params =head2 Config Check This block of code looks at the argument that is possibly supplied, should it be config, it then checks to make sure the plugin specified exists, assuming it does, it will run the do_config subroutine for the plugin specified, otherwise it dies complaining about an unknown plugin. =cut if (defined $ARGV[0] && $ARGV[0] eq 'config') { # Lets take the plugin from the execution name. $0 =~ /nagios_multi_(.+)*/; my $plugin = $1; # And lets make sure we have a plugin called that. die 'Unknown Plugin Specified: ' . ($plugin ? $plugin : '') unless $graphs{$plugin}; # Now lets go ahead and print out our config. do_config($plugin); exit 0; } =head2 Autoconf Check This block of code looks at the argument that is possibly supplied, should it be autoconf, we are going to print yes at this point since we've already tested for our binary to exist and be executable, the process will then exit. =cut if (defined $ARGV[0] && $ARGV[0] eq 'autoconf') { # well we can execute the binary, so plugin should be good from here... print "yes\n"; exit 0; } =head2 Suggest Check This block of code looks at the argument that is possibly supplied, should it be suggest, we are going to print the possible plugins which can be specified. Note we only specify the root graphs for the multigraphs, since the rest of the subgraphs will appear "behind" the root graphs. =cut if (defined $ARGV[0] && $ARGV[0] eq 'suggest') { # well we can execute the binary, so print possible root multigraph plugin names my @rootplugins = ('services','hosts','checks'); foreach my $plugin (@rootplugins) { print "$plugin\n"; } exit 0; } =head1 Subroutines Begin Subroutine calls to output data / config information =head2 fetch_output This subroutine is the main call for printing data for the plugin. No parameters are taken as this is the default call if no arguments are supplied from the command line. =cut fetch_output(); sub fetch_output { # Lets figure out what plugin they want to run, and check that it exists $0 =~ /nagios_multi_(.+)*/; my $plugin = $1; die 'Unknown Plugin Specified: ' . ($plugin ? $plugin : '') unless $graphs{$plugin}; # Lets set up our subgraphs array with all of the graphs which are extensions # of the root graph / plugin my @subgraphs; if ($plugin eq 'services') { @subgraphs = ('svcchkdetail','svcchksc','svcchklat','svcchkext'); } elsif ($plugin eq 'hosts') { @subgraphs = ('hostchkdetail','hostchksc','hostchklat','hostchkext'); } elsif ($plugin eq 'checks') { @subgraphs = ('svcchkactcount','hostchkactcount','extcmdcount'); if ($passive =~ /on/i) { push(@subgraphs,'svcchkpsvcount'); push(@subgraphs,'hostchkpsvcount'); } } # Lets just double check the plugin you specified is a root graph / plugin if (grep $_ eq $plugin, @subgraphs) { die "Error: $plugin is not a valid root graph, valid graphs are: @subgraphs\n"; } # Lets print out the data for our sub graphs / plugins foreach my $subgraph (@subgraphs) { print_sub_output($plugin,$subgraph); } # Lets print out the data for our main graph / plugin print_root_output($plugin); return; } =head2 print_root_output This block of code prints out the return values for our root graphs. It takes one parameter $plugin. Returns when completed $plugin; main(root) graph we are calling up to print data values for Example: print_root_output($plugin); =cut sub print_root_output { # Lets get our plugin, set our graph information, and print for Munin to process my ($plugin) = (@_); my $graph = $graphs{$plugin}; print "multigraph nagios_$plugin\n"; # Getting keys to pass to nagiostats for data retrieval # call up fetch_nagios_stats with the keys we just got. my @keys = @{$graph->{keys}}; fetch_nagios_stats($plugin,@keys); # print the results for the keys with the name for Munin to process foreach my $dsrc (@{$graph->{datasrc}}) { my $output = 0; my %datasrc = %$dsrc; while ( my ($key, $value) = each(%datasrc)) { next if ($key ne 'name'); print "$dsrc->{name}.value $graph->{results}->{$value}\n"; } } return; } =head2 print_sub_output This block of code prints out the return values for our root graphs. It takes one parameter $plugin. Returns when completed $plugin; main(root) being called, used for multigraph output $subgraph; graph we are actually trying to print data values for Example: print_sub_output($plugin,$subgraph); =cut sub print_sub_output { # Lets get our plugin, set our graph information, and print for Munin to process my ($plugin,$subgraph) = (@_); my $graph = $graphs{$subgraph}; print "multigraph nagios_$plugin\.$subgraph\n"; # Getting keys to pass to nagiostats for data retrieval # call up fetch_nagios_stats with the keys we just got. my @keys = @{$graph->{keys}}; fetch_nagios_stats($subgraph,@keys); # print the results for the keys with the name for Munin to process foreach my $dsrc (@{$graph->{datasrc}}) { my $output = 0; my %datasrc = %$dsrc; while ( my ($key, $value) = each(%datasrc)) { next if ($key ne 'name'); print "$dsrc->{name}.value $graph->{results}->{$value}\n"; } } return; } =head2 do_config This is the main call issued assuming we call up config and plugin specified exists The subroutine takes one parameter $plugin, and returns when completed. $plugin; main(root) graph being called Example: do_config($plugin); =cut sub do_config { # Lets get our plugin and set subgraphs to undef my ($plugin) = (@_); my @subgraphs; if ($plugin eq 'services') { # update subgraphs since our plugin is services @subgraphs = ('svcchkdetail','svcchksc','svcchklat','svcchkext'); } elsif ($plugin eq 'hosts') { # update subgraphs since our plugin is hosts @subgraphs = ('hostchkdetail','hostchksc','hostchklat','hostchkext'); } elsif ($plugin eq 'checks') { # update subgraphs since our plugin is checks @subgraphs = ('svcchkactcount','hostchkactcount','extcmdcount'); if ($passive =~ /on/i) { push(@subgraphs,'svcchkpsvcount'); push(@subgraphs,'hostchkpsvcount'); } } # Now that we know what graphs to reference, lets print out their config info foreach my $subgraph (@subgraphs) { print_sub_config($plugin,$subgraph); } # Now lets print out the config information for our root graph print_root_config($plugin); return; } =head2 print_sub_config This subroutine prints out the config information for all of the subgraphs. It takes two parameters, $plugin and $subgraph $plugin; main(root) graph used for multigraph call $subgraph; subgraph being called up. Example: print_sub_config($plugin,$subgraph); =cut sub print_sub_config { # Lets get our plugin and subgraph, after that print for Munin to process it. my ($plugin,$subgraph) = (@_); my $graph = $graphs{$subgraph}; print "multigraph nagios_$plugin.$subgraph\n"; # Lets print our subgraph's main config info. my %graphconf = %{$graph->{config}}; while ( my ($key, $value) = each(%graphconf)) { print "graph_$key $value\n"; } # Lets print our subgraph's per graph config info. foreach my $dsrc (@{$graph->{datasrc}}) { my %datasrc = %$dsrc; while ( my ($key, $value) = each(%datasrc)) { next if ($key eq 'name'); print "$dsrc->{name}.$key $value\n"; } } return; } =head2 print_root_config This subroutine prints out the config information for all of the main(root) graphs. It takes one parameters, $plugin $plugin; main(root) graph used for multigraph call Example: print_root_config($plugin); =cut sub print_root_config { # Lets get our plugin and graph, after that print for Munin to process it. my ($plugin) = (@_); my $graph = $graphs{$plugin}; print "multigraph nagios_$plugin\n"; # Lets print out graph's main config info. my %graphconf = %{$graph->{config}}; while ( my ($key, $value) = each(%graphconf)) { print "graph_$key $value\n"; } # Lets print our graphs per graph config info. foreach my $dsrc (@{$graph->{datasrc}}) { my %datasrc = %$dsrc; while ( my ($key, $value) = each(%datasrc)) { next if ($key eq 'name'); print "$dsrc->{name}.$key $value\n"; } } return; } =head2 fetch_nagios_stats This subroutine actually runs the nagiostats binary with the keys specified in an array Two parameters are passed, $plugin and @keys, and it will return when complete. $plugin; graph we are calling up, we use this to store the results in the hash for easy recall later. @keys; keys we want the values for from nagiostats binary. Example: fetch_nagios_stats($plugin,@keys); =cut sub fetch_nagios_stats { # Lets get our current plugin and list of keys we want info for, as well as reference our graph my ($plugin,@keys) = (@_); my $graph = $graphs{$plugin}; # Lets set our command to include our binary plus options, as well as join our array with ,'s my $command = $binary . " -m -d " . join(",",@keys); # Lets open the command and pipe it out for easy reading by line open(CMD, "$command |") or die "Unable to execute command: $command\n"; # While a return exists from the command, store the value in the key specified while (my $line = ) { chomp($line); my $key = shift(@keys); $graph->{results}->{$key} = $line; } return; }