#!/bin/sh
# -*- sh -*-
#
# v0.1 - 2024-09-05
#
# Plugin installation:
# wget "https://pasternok.org/sources/load2.sh?raw" -O /etc/munin/plugins/load2
# chmod +x /etc/munin/plugins/load2
# systemctl restart munin-node

: << =cut

=head1 NAME

load2 - Plugin to monitor the load average on a system.

=head1 CONFIGURATION

The following environment variables are used by this plugin:

=over 4

=item load<int>_warning <float>

Threshold for when to report a warning

=item load<int>_critical <float>

Threshold for when to report a critical

=back

=head2 EXAMPLE CONFIGURATION

 [load2]
  env.load1_warning 5
  env.load1_critical 10

=head1 NOTES

If run with the "autoconf"-parameter, give our opinion on whether we
should be run on this system or not. This is optional, and only used
by munin-config. In the case of this plugin, we should most probably
always be included.

=head1 MAGIC MARKERS

 #%# family=auto
 #%# capabilities=autoconf

=cut

. "$MUNIN_LIBDIR/plugins/plugin.sh"

if [ "$1" = "autoconf" ]; then
        echo yes
        exit 0
fi

# If run with the "config"-parameter, give out information on how the
# graphs should look.

if [ "$1" = "config" ]; then

        # The host name this plugin is for. (Can be overridden to have
        # one machine answer for several)

        # The title of the graph
        echo 'graph_title Load average'
        # Arguments to "rrdtool graph". In this case, tell it that the
        # lower limit of the graph is '0', and that 1k=1000 (not 1024)
        echo 'graph_args --base 1000 -l 0'
        # The Y-axis label
        echo 'graph_vlabel processes in the run queue'
        # We want Cur/Min/Avg/Max unscaled (i.e. 0.42 load instead of
        # 420 milliload)
        echo 'graph_scale no'
        # Graph category. Defaults to 'other'
        echo 'graph_category system'
        # The fields. "label" is used in the legend. "label" is the only
        # required subfield.
        echo 'load1.label 1 minute average'
        echo 'load5.label 5 minute average'
        echo 'load15.label 15 minute average'
        echo 'total.label Total'
        # Visualization config
        echo 'load1.draw AREA'
        echo 'load1.min 0'
        echo 'load1.colour EACC00'
        echo 'load5.draw STACK'
        echo 'load5.min 0'
        echo 'load5.colour EA8F00'
        echo 'load15.draw STACK'
        echo 'load15.min 0'
        echo 'load15.colour FF0000'
        echo 'total.colour 000000'
        # These two read the environment for warning values for the field
        # "load<int>".  If "load<int>_warning" or "warning" aren't set in the
        # environment, no warning levels are set.  Likewise for "load<int>_critical"
        # and "critical".
        for i in 1 5 15
        do
                print_warning load$i
                print_critical load$i
        done
        # This one is purely to add an explanation to the web page. The first
        # one is for the graph itself, while the other ones are for the fields
        # "load*".
        echo 'graph_info The load average of the machine describes how many processes are in the run-queue (scheduled to run "immediately").'
        echo 'load1.info 1 minute load average'
        echo 'load5.info 5 minute load average'
        echo 'load15.info 15 minute load average'
        echo 'total.info total load average'

        # Last, if run with the "config"-parameter, quit here (don't
        # display any data)
        exit 0
fi

# If not run with any parameters at all (or only unknown ones), do the
# real work - i.e. display the data. Almost always this will be
# "value" subfield for every data field.

loadavg_data=$(cat /proc/loadavg)
echo -n "load1.value "
echo $loadavg_data | cut -f1 -d' '
echo -n "load5.value "
echo $loadavg_data | cut -f2 -d' '
echo -n "load15.value "
echo $loadavg_data | cut -f3 -d' '
echo -n "total.value "
echo $loadavg_data | awk '{print $1 + $2 + $3}'