1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-21 18:41:03 +00:00

Added detailed filtering capabilities for systemd_units

This commit is contained in:
Kael Shipman 2018-10-19 15:27:53 -05:00
parent c4d7d834ab
commit dcfcbc2faa

View file

@ -13,21 +13,38 @@ Linux systems with systemd installed.
=head1 CONFIGURATION =head1 CONFIGURATION
None needed. You may optionally pass warning and critical values for any of the possible states (active, No configuration is required for this plugin. You may optionally pass warning and critical values for any
reloading, inactive, failed, activating, deactivating) like so: of the possible states (active, reloading, inactive, failed, activating, deactivating), and you may
additionally pass both global and state-specific include/exclude filters to include only units you care
about and/or exclude units you don't care about.
(Note that for failed units, default warning and critical values are set to 0 and 10, respectively. No other
states have default levels set.)
Value calculations for each state are made using the following algorithm (all filters performed using \`egrep\`):
1. Global include rules are applied on the output of \`systemctl list-units --all --no-legend\`;
2. Global exclude rules are then applied to the result of that;
3. Then, for each state, this global output is further filtered by include, then exclude rules for the state;
4. Then the result is filtered for the given state and the remaining units counted and listed.
An example configuration might be something like this:
[systemd_units] [systemd_units]
env.failed_warning 0 env.failed_warning 0
env.failed_critical 5 env.failed_critical 5
env.inactive_warning 10 env.inactive_warning 10
env.inactive_critical 20 env.inactive_critical 20
env.exclude boring
Note that for failed units, default warning and critical values are set to 0 and 10, respectively. No other env.inactive_exclude sleepy
states have default levels set.
In the example above, we've overridden the default warning and critical levels for failed units, added warning
and critical levels for inactive units, then filtered out boring units from all results and filtered out sleepy
units from results for the inactive state.
=head1 AUTHOR =head1 AUTHOR
Olivier Mehani <shtrom+munin@ssji.net> Olivier Mehani <shtrom+munin@ssji.net> with contributions from Kael Shipman <kael.shipman@gmail.com>
=head1 LICENSE =head1 LICENSE
@ -51,6 +68,10 @@ states="active \
failed \ failed \
activating \ activating \
deactivating" deactivating"
include="${include:-.*}"
exclude="${exclude:-^$}"
autoconf() { autoconf() {
which systemctl >/dev/null && \ which systemctl >/dev/null && \
systemctl --state=failed --no-pager --no-legend >/dev/null 2>&1 && echo yes || echo "no (No systemctl or error running it)" systemctl --state=failed --no-pager --no-legend >/dev/null 2>&1 && echo yes || echo "no (No systemctl or error running it)"
@ -73,11 +94,29 @@ EOF
} }
fetch () { fetch () {
tmp=$(systemctl --no-pager --no-legend --all | awk '{print $1, $3}') # Get all units, filtering by global include/exclude rules
local state_include state_exclude state_tmp tmp
tmp=$(systemctl --no-pager --no-legend --all | egrep "$include" | egrep -v "$exclude" | awk '{print $1, $3}')
# For each state, echo the number of units and some extra info, filtering for state-specific include/excludes
for state in $states ; do for state in $states ; do
count=$(echo "$tmp" | grep -c "$state$") # Get state-specific include/excludes, if present
state_include="$(eval echo "\$${state}_include")"
state_exclude="$(eval echo "\$${state}_exclude")"
state_tmp="$tmp"
# Filter
if [ -n "$state_include" ]; then
state_tmp="$(echo "$state_tmp" | egrep "$state_include")"
fi
if [ -n "$state_exclude" ]; then
state_tmp="$(echo "$state_tmp" | egrep -v "$state_exclude")"
fi
# Count and output
count=$(echo "$state_tmp" | grep -c "$state$")
echo "$state.value $count" echo "$state.value $count"
extinfo=$(echo "$tmp" | grep "$state$" | cut -d " " -f 1 | tr '\n' ' ') extinfo=$(echo "$state_tmp" | grep "$state$" | cut -d " " -f 1 | tr '\n' ' ')
if [ -n "$extinfo" ]; then if [ -n "$extinfo" ]; then
echo "$state.extinfo" "$extinfo" echo "$state.extinfo" "$extinfo"
fi fi