Repository
Munin (contrib)
Last change
2020-10-24
Graph Categories
Capabilities
Keywords
Language
Shell
License
GPL-2.0-only

multibandwidth

Name

multibandwidth - Plugin to monitor the bandwidth between localhost and several hosts.

Applicable Systems

All systems with “bing” installed.

Requirements

bing installed.

You can install bing by using (Ubuntu/Debian): apt-get install bing

Configuration

The following example configuration shows all settings. Only “hosts” is required for minimal configuration.

[multibandwidth]
user root
env.hosts example.org example2.org example3.org
env.samples 15
env.small_packet_size 44
env.big_packet_size 108
env.max_valid_bps 15728640
  • env.hosts: space separated list of hostnames or IPs of the hosts to calculate the bandwidth. This setting is required.
  • env.samples: Reset stats after sending this number of ECHO_REQUEST packets. Defaults to 15 samples.
  • env.small_packet_size: Specifies the number of data bytes to be sent in the small packets. The default and minimum value is 44.
  • env.big_packet_size: Specifies the number of data bytes to be sent in the big packets. The default is 108. The size should be chosen so that big packet roundtrip times are long enough to be accurately measured.
  • env.max_valid_bps: bing have some random spikes. This variable is used to indicate the maximum value of mbps that can be recorded (in bps). Defaults to the empty string (no validity check).

Magic Markers

#%# capabilities=autoconf

Version

1.1.17

Author

Jose Manuel Febrer Cortés <https://www.linkedin.com/in/jfebrer/>

Marco Bertola’s help <https://www.linkedin.com/in/bertolamarco/>

License

GPLv2

#!/bin/sh

. "$MUNIN_LIBDIR/plugins/plugin.sh"

: <<=cut

=head1 NAME

multibandwidth - Plugin to monitor the bandwidth between localhost and several hosts.

=head1 APPLICABLE SYSTEMS

All systems with "bing" installed.

=head1 REQUIREMENTS

bing installed.

You can install bing by using (Ubuntu/Debian): apt-get install bing

=head1 CONFIGURATION

The following example configuration shows all settings. Only "hosts" is required for
minimal configuration.

 [multibandwidth]
 user root
 env.hosts example.org example2.org example3.org
 env.samples 15
 env.small_packet_size 44
 env.big_packet_size 108
 env.max_valid_bps 15728640

=over 4

=item env.hosts: space separated list of hostnames or IPs of the hosts to calculate the bandwidth.
        This setting is required.

=item env.samples: Reset stats after sending this number of ECHO_REQUEST packets.
        Defaults to 15 samples.

=item env.small_packet_size: Specifies the number of data bytes to be sent in the small
        packets. The default and minimum value is 44.

=item env.big_packet_size: Specifies the number of data bytes to be sent in the big
        packets. The default is 108. The size should be chosen so that big packet roundtrip times
        are long enough to be accurately measured.

=item env.max_valid_bps: bing have some random spikes. This variable is used to indicate
        the maximum value of mbps that can be recorded (in bps).
        Defaults to the empty string (no validity check).

=back


=head1 MAGIC MARKERS

 #%# capabilities=autoconf

=head1 VERSION

1.1.17

=head1 AUTHOR

Jose Manuel Febrer Cortés <https://www.linkedin.com/in/jfebrer/>

Marco Bertola’s help <https://www.linkedin.com/in/bertolamarco/>

=head1 LICENSE

GPLv2

=cut


hosts=${hosts:-}
samples=${samples:-15}
small_packet_size=${small_packet_size:-44}
big_packet_size=${big_packet_size:-108}
max_valid_bps=${max_valid_bps:-15728640}


case $1 in
   config)
        echo graph_title MultiBandwidth
        echo 'graph_vlabel bps'
        echo 'graph_args --base 1024 -l 0'
        echo 'graph_scale yes'
        echo 'graph_category network'
        echo 'graph_info This graph shows the bandwidth between localhost and several hosts'
        for host in $hosts; do
                fieldname="host_$(clean_fieldname "$host")"
                echo "$fieldname.label $host"
                echo "$fieldname.draw LINE2"
                echo "$fieldname.info Bandwidth statistics for $host"
        done
        exit 0
        ;;
    autoconf)
        if command -v bing 2>/dev/null; then
                echo 'yes'
        else
                echo 'no (bing not installed)'
        fi
        exit 0
        ;;
esac


# Calculating the bandwidth
for host in $hosts; do
        fieldname="host_$(clean_fieldname "$host")"

        SPEED=$(timeout 6 bing localhost "$host" -n -c 1 -e "$samples" -s "$small_packet_size" -S "$big_packet_size" 2>/dev/null \
                | grep "estimated link" -A 2 \
                | grep bps \
                | awk '{print $2}' \
                | cut -d "b" -f1)

        if echo "$SPEED" | grep -q "M"; then
                RATE=$(echo "$SPEED" | awk '{ print int($1 * 1024 * 1024); }')
        elif echo "$SPEED" | grep -q "K"; then
                RATE=$(echo "$SPEED" | awk '{ print int($1 * 1024); }')
        elif echo "$SPEED" | grep -q "G"; then
                RATE=$(echo "$SPEED" | awk '{ print int($1 * 1024 * 1024 * 1024); }')
        else
                RATE="U"
                echo "Error: no data (timeout)" >&2
        fi
        if [ -n "$max_valid_bps" ] && [ "$RATE" -gt "$max_valid_bps" ]; then
                # the value is outside of the allowed range; discard it
                RATE="U"
        fi
        echo "${fieldname}.value $RATE"
done