From dcfcbc2faa8c6c99f90f8eebde06eb1bf23986b9 Mon Sep 17 00:00:00 2001 From: Kael Shipman Date: Fri, 19 Oct 2018 15:27:53 -0500 Subject: [PATCH] Added detailed filtering capabilities for systemd_units --- plugins/systemd/systemd_units | 65 ++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/plugins/systemd/systemd_units b/plugins/systemd/systemd_units index dc12d463..5b47fa5f 100755 --- a/plugins/systemd/systemd_units +++ b/plugins/systemd/systemd_units @@ -13,21 +13,38 @@ Linux systems with systemd installed. =head1 CONFIGURATION -None needed. You may optionally pass warning and critical values for any of the possible states (active, -reloading, inactive, failed, activating, deactivating) like so: +No configuration is required for this plugin. You may optionally pass warning and critical values for any +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] - env.failed_warning 0 - env.failed_critical 5 - env.inactive_warning 10 - env.inactive_critical 20 - -Note that for failed units, default warning and critical values are set to 0 and 10, respectively. No other -states have default levels set. + env.failed_warning 0 + env.failed_critical 5 + env.inactive_warning 10 + env.inactive_critical 20 + env.exclude boring + env.inactive_exclude sleepy + +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 -Olivier Mehani +Olivier Mehani with contributions from Kael Shipman =head1 LICENSE @@ -51,6 +68,10 @@ states="active \ failed \ activating \ deactivating" + +include="${include:-.*}" +exclude="${exclude:-^$}" + autoconf() { 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)" @@ -73,11 +94,29 @@ EOF } 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 - 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" - 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 echo "$state.extinfo" "$extinfo" fi