From 66fd4a05eff5b6665abd76b79ba71661d4fbb351 Mon Sep 17 00:00:00 2001 From: Rhonda D'Vine Date: Tue, 17 Nov 2015 14:16:02 +0100 Subject: [PATCH] munin plugin for BalanceNG The script fetches the data from bng's SNMP interface and thus dynamicly adapts to bng's configuration. This means that no further configuration is needed after enabling the plugin. --- plugins/balanceng/bng | 274 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100755 plugins/balanceng/bng diff --git a/plugins/balanceng/bng b/plugins/balanceng/bng new file mode 100755 index 00000000..5515dbd9 --- /dev/null +++ b/plugins/balanceng/bng @@ -0,0 +1,274 @@ +#!/usr/bin/perl + +# munin plugin for BalanceNG +# https://www.inlab.de/load-balancer/index.html +# +# (w) 2015 by Rhonda D'Vine +# (c) 2015 by strg.at GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; version 2 dated June, +# 1991. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +use warnings; +use strict; + +use Munin::Plugin; + +my $host; + +my %servers; +my %targets; + +# we support autoconf +#%# family=auto +#%# capabilities=autoconf suggest + +# Check for multigraph capabilities +need_multigraph(); + +# Handle munin 'autoconf' command +do_autoconf() if ( $ARGV[0] && $ARGV[0] eq 'autoconf' ); + +# Fetch data values +do_fetch_values(); + +# Handle munin 'config' command +# This can only be done after getting the data +if ( defined $ARGV[0] && $ARGV[0] eq 'config' ) { + do_config(); +} + + +generate_output(); + +exit 0; + +sub do_autoconf { # {{{ check if we can offer autoconf + print (-x '/sbin/bng' ? "yes\n" : "no\n"); + exit 0; +} # }}} + +sub do_fetch_values { # {{{ fetch all the names and values needed + + ## MIBs from https://www.inlab.de/load-balancer/BalanceNG-V3-Manual.pdf + + # node name + open READ, "/sbin/bng -g .1.3.6.1.4.1.2771.1.5 |" || die "$0: can't fork bng: $!\n"; + ; + ; + $host = ; + chomp $host; + close READ; + + my $next; + + # server names + $next = '.1.3.6.1.4.1.2771.1.60.3'; + while (open READ, "/sbin/bng -n $next |") { + $next = ; + chomp $next; + + if ($next !~ /^\.1\.3\.6\.1\.4\.1\.2771\.1\.60\.3/) { + close READ; + last; + } + + ; + my $name = ; + chomp $name; + push @{$servers{name}}, clean_fieldname($name); + + close READ; + } + + # server sent bytes + $next = '.1.3.6.1.4.1.2771.1.60.15'; + while (open READ, "/sbin/bng -n $next |") { + $next = ; + chomp $next; + + if ($next !~ /^\.1\.3\.6\.1\.4\.1\.2771\.1\.60\.15/) { + close READ; + last; + } + + ; + my $name = ; + chomp $name; + push @{$servers{sent}}, $name; + $servers{senttotal} += $name; + + close READ; + } + + # server recv bytes + $next = '.1.3.6.1.4.1.2771.1.60.17'; + while (open READ, "/sbin/bng -n $next |") { + $next = ; + chomp $next; + + if ($next !~ /^\.1\.3\.6\.1\.4\.1\.2771\.1\.60\.17/) { + close READ; + last; + } + + ; + my $name = ; + chomp $name; + push @{$servers{recv}}, $name; + $servers{recvtotal} += $name; + + close READ; + } + + # target names + $next = '.1.3.6.1.4.1.2771.1.70.3'; + while (open READ, "/sbin/bng -n $next |") { + $next = ; + chomp $next; + + if ($next !~ /^\.1\.3\.6\.1\.4\.1\.2771\.1\.70\.3/) { + close READ; + last; + } + + ; + my $name = ; + chomp $name; + push @{$targets{name}}, clean_fieldname($name); + + close READ; + } + + # target sent bytes + $next = '.1.3.6.1.4.1.2771.1.70.27'; + while (open READ, "/sbin/bng -n $next |") { + $next = ; + chomp $next; + + if ($next !~ /^\.1\.3\.6\.1\.4\.1\.2771\.1\.70\.27/) { + close READ; + last; + } + + ; + my $name = ; + chomp $name; + push @{$targets{sent}}, $name; + $targets{senttotal} += $name; + + close READ; + } + + # target recv bytes + $next = '.1.3.6.1.4.1.2771.1.70.29'; + while (open READ, "/sbin/bng -n $next |") { + $next = ; + chomp $next; + + if ($next !~ /^\.1\.3\.6\.1\.4\.1\.2771\.1\.70\.29/) { + close READ; + last; + } + + ; + my $name = ; + chomp $name; + push @{$targets{recv}}, $name; + $targets{recvtotal} += $name; + + close READ; + } + +} # }}} + +sub do_config { # {{{ write out the configuration + print <<"EOF"; +multigraph bng +graph_title Bng Throughput +graph_order sent recv +graph_args --base 1000 -l 0 +graph_vlabel Packets/\${graph_period} +graph_category network +graph_info this graph shows the outbound traffic for $host + +sent.label Sent +sent.draw AREA +sent.type DERIVE +sent.min 0 +recv.label Received +recv.draw AREA +recv.type DERIVE +recv.min 0 + +EOF + + foreach my $interface (@{$servers{name}}, @{$targets{name}}) { + print <<"EOF"; +multigraph bng.${interface} + +graph_title Interface $interface traffic +graph_order sent recv +graph_args --base 1000 -l 0 +graph_vlabel Packets/\${graph_period} +graph_category network +graph_info this graph shows the total traffic for ${interface} + +sent.label ${interface}_Sent +sent.draw AREA +sent.type DERIVE +sent.min 0 +recv.label ${interface}_Received +recv.draw AREA +recv.type DERIVE +recv.min 0 + +EOF + } + + exit 0; +} # }}} + +sub generate_output { # {{{ write out the data + print <<"EOF"; +multigraph bng +sent.value $servers{senttotal} +recv.value $servers{recvtotal} +EOF + + my $i; + $i = 0; + foreach my $interface (@{$servers{name}}) { + print <<"EOF"; +multigraph bng.${interface} +sent.value $servers{sent}[$i] +recv.value $servers{recv}[$i] +EOF + $i++; + } + + $i = 0; + foreach my $interface (@{$targets{name}}) { + print <<"EOF"; +multigraph bng.${interface} +sent.value $targets{sent}[$i] +recv.value $targets{recv}[$i] +EOF + $i++; + } + +} # }}} + +# vim:fdm=marker: