diff --git a/Makefile b/Makefile index f5c3d00..3907b7b 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ show-roots: show-time: -@$(CHRONY_STATUS) && $(CHRONY_STATS) - -@watch -d -n 2 "$(CHRONY_STATUS) && echo "--" && $(CHRONY_STATS) && echo "--" && $(CHRONY_STATS_SOURCES)" + -@watch -d -n 2 "$(CHRONY_STATUS) && echo "-- Statistiques générales :" && $(CHRONY_STATS) && echo "-- Statistiques sur les sources :" && $(CHRONY_STATS_SOURCES) && echo "-- Statistiques sur les clients :" && chronyc clients" store-repair: $(TIME) nix-store --verify --check-contents --repair diff --git a/services/monitoring-munin.nix b/services/monitoring-munin.nix index ebde24e..6591a85 100644 --- a/services/monitoring-munin.nix +++ b/services/monitoring-munin.nix @@ -30,6 +30,14 @@ mkIf flags.munin { ignore_file ^sensors_-wrapped$ ignore_file ^.sensors_-wrapped$ ''; + extraPlugins = { + chrony = /etc/nixos/base/services/munin-chrony; + chrony_tracking_stratum = /etc/nixos/base/services/munin-chrony-tracking-stratum; + chrony_tracking_ppm = /etc/nixos/base/services/munin-chrony-tracking-ppm; + chrony_tracking_time_ = /etc/nixos/base/services/munin-chrony-tracking-time; + chrony_tracking_time_root = /etc/nixos/base/services/munin-chrony-tracking-time-root; + chrony_tracking_update_time = /etc/nixos/base/services/munin-chrony-tracking-update-time; + }; }; systemd.services.munin-node = { path = with pkgs; [ munin lm_sensors ]; diff --git a/services/munin-chrony b/services/munin-chrony new file mode 100755 index 0000000..811b7ec --- /dev/null +++ b/services/munin-chrony @@ -0,0 +1,123 @@ +#!/bin/sh + +: <<=cut + +=head1 NAME + +parse Chrony Tracking output for timeserver status information + +=head1 APPLICABLE SYSTEMS + +Any system with a local chronyd service. + +=head1 CONFIGURATION + +No configuration. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +Revision 0.1 2008/08/23 13:06:00 joti + + First version only chronyc tracking, autodetection included. + +Revision 0.2 2008/10/11 16:09:00 joti + + Added scaling of other values to match with frequency, added more description to fields + +Revision 0.3 2014/02/16 zjttoefs + + reduce forking by using awk + do not limit output precision + add stratum monitoring + detect slow/fast time or freqency and adjust sign of value accordingly + remove commented out code + +Revision 0.4 2016/11/10 Lars Kruse + + rewrite field handling + use "which" for "chronyc" location + switch from "bash" to "sh" + fix exit code of failing "autoconf" + +=head1 AUTHOR + + joti + zjttoefs + Lars Kruse + +=cut + +CHRONYC="$(which chronyc | head -1)" + +# Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. +# field definitions: +# - munin fieldname +# - factor for graph visualization (all values are supposed to reach a similar dimension) +# - regular expression of the chrony output line (may not contain whitespace, case insensitive) +# - label (may include "%d" for including the factor; may contain whitespace) +fields="stratum 1 ^Stratum Stratum + systime 1000000 ^System.time System Time (us) + offsetlast 1000000 ^Last.offset Last Offset (us) + offsetrms 1000000 ^RMS.offset RMS Offset (us) + frequency 1 ^Frequency Frequency (ppm) + residualfreq 1 ^Residual.freq Residual Freq (ppm) + skew 1 ^Skew Skew (ppm) + rootdelay 1000000 ^Root.delay Root Delay (us) + rootdispersion 1000000 ^Root.dispersion Root Dispersion (us) + updateinterval 1 ^Update.interval Update Interval (s)" + +# chrony example output (v2.4.1): +# Reference ID : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) +# Stratum : 2 +# Ref time (UTC) : Thu Nov 10 22:39:50 2016 +# System time : 0.000503798 seconds slow of NTP time +# Last offset : +0.000254355 seconds +# RMS offset : 0.002186779 seconds +# Frequency : 17.716 ppm slow +# Residual freq : +0.066 ppm +# Skew : 4.035 ppm +# Root delay : 0.042980 seconds +# Root dispersion : 0.005391 seconds +# Update interval : 258.4 seconds +# Leap status : Normal + + +if [ "$1" = "autoconf" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then + echo yes + else + echo "no (missing 'chronyc' executable)" + fi + exit 0 +fi + +if [ "$1" = "config" ]; then + echo 'graph_title Chrony Tracking Stats' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel (time,ppm)' + echo 'graph_category time' + echo 'graph_scale no' + echo "$fields" | while read fieldname factor regex label; do + # insert the factor, if "%d" is part of the label + printf "${fieldname}.label $label\n" "$factor" + echo "${fieldname}.type GAUGE" + done + exit 0 +fi + +chrony_status="$("$CHRONYC" tracking)" +echo "$fields" | while read fieldname factor regex label; do + status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" + if [ -z "$status_line" ]; then + value="U" + else + # the keyword "slow" indicates negative values + value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" + fi + echo "${fieldname}.value $value" +done diff --git a/services/munin-chrony-tracking-ppm b/services/munin-chrony-tracking-ppm new file mode 100755 index 0000000..da1d022 --- /dev/null +++ b/services/munin-chrony-tracking-ppm @@ -0,0 +1,116 @@ +#!/bin/sh + +: <<=cut + +=head1 NAME + +parse Chrony Tracking output for timeserver status information + +=head1 APPLICABLE SYSTEMS + +Any system with a local chronyd service. + +=head1 CONFIGURATION + +No configuration. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +Revision 0.1 2008/08/23 13:06:00 joti + + First version only chronyc tracking, autodetection included. + +Revision 0.2 2008/10/11 16:09:00 joti + + Added scaling of other values to match with frequency, added more description to fields + +Revision 0.3 2014/02/16 zjttoefs + + reduce forking by using awk + do not limit output precision + add stratum monitoring + detect slow/fast time or freqency and adjust sign of value accordingly + remove commented out code + +Revision 0.4 2016/11/10 Lars Kruse + + rewrite field handling + use "which" for "chronyc" location + switch from "bash" to "sh" + fix exit code of failing "autoconf" + +=head1 AUTHOR + + joti + zjttoefs + Lars Kruse + +=cut + +CHRONYC="$(which chronyc | head -1)" + +# Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. +# field definitions: +# - munin fieldname +# - factor for graph visualization (all values are supposed to reach a similar dimension) +# - regular expression of the chrony output line (may not contain whitespace, case insensitive) +# - label (may include "%d" for including the factor; may contain whitespace) +fields="frequency 1 ^Frequency Local Clock Frequency Drift (ppm) + residualfreq 1 ^Residual.freq Residual Freq (ppm) + skew 1 ^Skew Skew (ppm)" + +# chrony example output (v2.4.1): +# Reference ID : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) +# Stratum : 2 +# Ref time (UTC) : Thu Nov 10 22:39:50 2016 +# System time : 0.000503798 seconds slow of NTP time +# Last offset : +0.000254355 seconds +# RMS offset : 0.002186779 seconds +# Frequency : 17.716 ppm slow +# Residual freq : +0.066 ppm +# Skew : 4.035 ppm +# Root delay : 0.042980 seconds +# Root dispersion : 0.005391 seconds +# Update interval : 258.4 seconds +# Leap status : Normal + + +if [ "$1" = "autoconf" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then + echo yes + else + echo "no (missing 'chronyc' executable)" + fi + exit 0 +fi + +if [ "$1" = "config" ]; then + echo 'graph_title Chrony Tracking Stats - Frequencies stability' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel (ppm)' + echo 'graph_category time' + echo 'graph_scale no' + echo "$fields" | while read fieldname factor regex label; do + # insert the factor, if "%d" is part of the label + printf "${fieldname}.label $label\n" "$factor" + echo "${fieldname}.type GAUGE" + done + exit 0 +fi + +chrony_status="$("$CHRONYC" tracking)" +echo "$fields" | while read fieldname factor regex label; do + status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" + if [ -z "$status_line" ]; then + value="U" + else + # the keyword "slow" indicates negative values + value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" + fi + echo "${fieldname}.value $value" +done diff --git a/services/munin-chrony-tracking-stratum b/services/munin-chrony-tracking-stratum new file mode 100755 index 0000000..bf25239 --- /dev/null +++ b/services/munin-chrony-tracking-stratum @@ -0,0 +1,116 @@ +#!/bin/sh + +: <<=cut + +=head1 NAME + +parse Chrony Tracking output for timeserver status information + +=head1 APPLICABLE SYSTEMS + +Any system with a local chronyd service. + +=head1 CONFIGURATION + +No configuration. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +Revision 0.1 2008/08/23 13:06:00 joti + + First version only chronyc tracking, autodetection included. + +Revision 0.2 2008/10/11 16:09:00 joti + + Added scaling of other values to match with frequency, added more description to fields + +Revision 0.3 2014/02/16 zjttoefs + + reduce forking by using awk + do not limit output precision + add stratum monitoring + detect slow/fast time or freqency and adjust sign of value accordingly + remove commented out code + +Revision 0.4 2016/11/10 Lars Kruse + + rewrite field handling + use "which" for "chronyc" location + switch from "bash" to "sh" + fix exit code of failing "autoconf" + +=head1 AUTHOR + + joti + zjttoefs + Lars Kruse + +=cut + +CHRONYC="$(which chronyc | head -1)" + +# Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. +# field definitions: +# - munin fieldname +# - factor for graph visualization (all values are supposed to reach a similar dimension) +# - regular expression of the chrony output line (may not contain whitespace, case insensitive) +# - label (may include "%d" for including the factor; may contain whitespace) +fields="stratum 1 ^Stratum Stratum" + +# chrony example output (v2.4.1): +# Reference ID : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) +# Stratum : 2 +# Ref time (UTC) : Thu Nov 10 22:39:50 2016 +# System time : 0.000503798 seconds slow of NTP time +# Last offset : +0.000254355 seconds +# RMS offset : 0.002186779 seconds +# Frequency : 17.716 ppm slow +# Residual freq : +0.066 ppm +# Skew : 4.035 ppm +# Root delay : 0.042980 seconds +# Root dispersion : 0.005391 seconds +# Update interval : 258.4 seconds +# Leap status : Normal + + +if [ "$1" = "autoconf" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then + echo yes + else + echo "no (missing 'chronyc' executable)" + fi + exit 0 +fi + +if [ "$1" = "config" ]; then + echo 'graph_title Chrony Tracking Stats - Stratum' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel (stratum)' + echo 'graph_category time' + echo 'graph_scale no' + echo 'stratum.warning 8' + echo 'stratum.critical 11' + echo "$fields" | while read fieldname factor regex label; do + # insert the factor, if "%d" is part of the label + printf "${fieldname}.label $label\n" "$factor" + echo "${fieldname}.type GAUGE" + done + exit 0 +fi + +chrony_status="$("$CHRONYC" tracking)" +echo "$fields" | while read fieldname factor regex label; do + status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" + if [ -z "$status_line" ]; then + value="U" + else + # the keyword "slow" indicates negative values + value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" + fi + echo "${fieldname}.value $value" +done diff --git a/services/munin-chrony-tracking-time b/services/munin-chrony-tracking-time new file mode 100755 index 0000000..cae65ee --- /dev/null +++ b/services/munin-chrony-tracking-time @@ -0,0 +1,118 @@ +#!/bin/sh + +: <<=cut + +=head1 NAME + +parse Chrony Tracking output for timeserver status information + +=head1 APPLICABLE SYSTEMS + +Any system with a local chronyd service. + +=head1 CONFIGURATION + +No configuration. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +Revision 0.1 2008/08/23 13:06:00 joti + + First version only chronyc tracking, autodetection included. + +Revision 0.2 2008/10/11 16:09:00 joti + + Added scaling of other values to match with frequency, added more description to fields + +Revision 0.3 2014/02/16 zjttoefs + + reduce forking by using awk + do not limit output precision + add stratum monitoring + detect slow/fast time or freqency and adjust sign of value accordingly + remove commented out code + +Revision 0.4 2016/11/10 Lars Kruse + + rewrite field handling + use "which" for "chronyc" location + switch from "bash" to "sh" + fix exit code of failing "autoconf" + +=head1 AUTHOR + + joti + zjttoefs + Lars Kruse + +=cut + +CHRONYC="$(which chronyc | head -1)" + +# Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. +# field definitions: +# - munin fieldname +# - factor for graph visualization (all values are supposed to reach a similar dimension) +# - regular expression of the chrony output line (may not contain whitespace, case insensitive) +# - label (may include "%d" for including the factor; may contain whitespace) +fields="systime 1000000 ^System.time System Time (us) + offsetlast 1000000 ^Last.offset Last Offset (us) + offsetrms 1000000 ^RMS.offset RMS Offset (us) + rootdelay 1000000 ^Root.delay Root Delay (us) + rootdispersion 1000000 ^Root.dispersion Root Dispersion (us)" + +# chrony example output (v2.4.1): +# Reference ID : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) +# Stratum : 2 +# Ref time (UTC) : Thu Nov 10 22:39:50 2016 +# System time : 0.000503798 seconds slow of NTP time +# Last offset : +0.000254355 seconds +# RMS offset : 0.002186779 seconds +# Frequency : 17.716 ppm slow +# Residual freq : +0.066 ppm +# Skew : 4.035 ppm +# Root delay : 0.042980 seconds +# Root dispersion : 0.005391 seconds +# Update interval : 258.4 seconds +# Leap status : Normal + + +if [ "$1" = "autoconf" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then + echo yes + else + echo "no (missing 'chronyc' executable)" + fi + exit 0 +fi + +if [ "$1" = "config" ]; then + echo 'graph_title Chrony Tracking Stats - Time' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel (time)' + echo 'graph_category time' + echo 'graph_scale no' + echo "$fields" | while read fieldname factor regex label; do + # insert the factor, if "%d" is part of the label + printf "${fieldname}.label $label\n" "$factor" + echo "${fieldname}.type GAUGE" + done + exit 0 +fi + +chrony_status="$("$CHRONYC" tracking)" +echo "$fields" | while read fieldname factor regex label; do + status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" + if [ -z "$status_line" ]; then + value="U" + else + # the keyword "slow" indicates negative values + value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" + fi + echo "${fieldname}.value $value" +done diff --git a/services/munin-chrony-tracking-time-root b/services/munin-chrony-tracking-time-root new file mode 100644 index 0000000..fa898fc --- /dev/null +++ b/services/munin-chrony-tracking-time-root @@ -0,0 +1,115 @@ +#!/bin/sh + +: <<=cut + +=head1 NAME + +parse Chrony Tracking output for timeserver status information + +=head1 APPLICABLE SYSTEMS + +Any system with a local chronyd service. + +=head1 CONFIGURATION + +No configuration. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +Revision 0.1 2008/08/23 13:06:00 joti + + First version only chronyc tracking, autodetection included. + +Revision 0.2 2008/10/11 16:09:00 joti + + Added scaling of other values to match with frequency, added more description to fields + +Revision 0.3 2014/02/16 zjttoefs + + reduce forking by using awk + do not limit output precision + add stratum monitoring + detect slow/fast time or freqency and adjust sign of value accordingly + remove commented out code + +Revision 0.4 2016/11/10 Lars Kruse + + rewrite field handling + use "which" for "chronyc" location + switch from "bash" to "sh" + fix exit code of failing "autoconf" + +=head1 AUTHOR + + joti + zjttoefs + Lars Kruse + +=cut + +CHRONYC="$(which chronyc | head -1)" + +# Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. +# field definitions: +# - munin fieldname +# - factor for graph visualization (all values are supposed to reach a similar dimension) +# - regular expression of the chrony output line (may not contain whitespace, case insensitive) +# - label (may include "%d" for including the factor; may contain whitespace) +fields="rootdelay 1000000 ^Root.delay Root Delay (us) + rootdispersion 1000000 ^Root.dispersion Root Dispersion (us)" + +# chrony example output (v2.4.1): +# Reference ID : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) +# Stratum : 2 +# Ref time (UTC) : Thu Nov 10 22:39:50 2016 +# System time : 0.000503798 seconds slow of NTP time +# Last offset : +0.000254355 seconds +# RMS offset : 0.002186779 seconds +# Frequency : 17.716 ppm slow +# Residual freq : +0.066 ppm +# Skew : 4.035 ppm +# Root delay : 0.042980 seconds +# Root dispersion : 0.005391 seconds +# Update interval : 258.4 seconds +# Leap status : Normal + + +if [ "$1" = "autoconf" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then + echo yes + else + echo "no (missing 'chronyc' executable)" + fi + exit 0 +fi + +if [ "$1" = "config" ]; then + echo 'graph_title Chrony Tracking Stats - Root Time' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel (time)' + echo 'graph_category time' + echo 'graph_scale no' + echo "$fields" | while read fieldname factor regex label; do + # insert the factor, if "%d" is part of the label + printf "${fieldname}.label $label\n" "$factor" + echo "${fieldname}.type GAUGE" + done + exit 0 +fi + +chrony_status="$("$CHRONYC" tracking)" +echo "$fields" | while read fieldname factor regex label; do + status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" + if [ -z "$status_line" ]; then + value="U" + else + # the keyword "slow" indicates negative values + value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" + fi + echo "${fieldname}.value $value" +done diff --git a/services/munin-chrony-tracking-update-time b/services/munin-chrony-tracking-update-time new file mode 100755 index 0000000..1136b04 --- /dev/null +++ b/services/munin-chrony-tracking-update-time @@ -0,0 +1,114 @@ +#!/bin/sh + +: <<=cut + +=head1 NAME + +parse Chrony Tracking output for timeserver status information + +=head1 APPLICABLE SYSTEMS + +Any system with a local chronyd service. + +=head1 CONFIGURATION + +No configuration. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 VERSION + +Revision 0.1 2008/08/23 13:06:00 joti + + First version only chronyc tracking, autodetection included. + +Revision 0.2 2008/10/11 16:09:00 joti + + Added scaling of other values to match with frequency, added more description to fields + +Revision 0.3 2014/02/16 zjttoefs + + reduce forking by using awk + do not limit output precision + add stratum monitoring + detect slow/fast time or freqency and adjust sign of value accordingly + remove commented out code + +Revision 0.4 2016/11/10 Lars Kruse + + rewrite field handling + use "which" for "chronyc" location + switch from "bash" to "sh" + fix exit code of failing "autoconf" + +=head1 AUTHOR + + joti + zjttoefs + Lars Kruse + +=cut + +CHRONYC="$(which chronyc | head -1)" + +# Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. +# field definitions: +# - munin fieldname +# - factor for graph visualization (all values are supposed to reach a similar dimension) +# - regular expression of the chrony output line (may not contain whitespace, case insensitive) +# - label (may include "%d" for including the factor; may contain whitespace) +fields="updateinterval 1 ^Update.interval Update Interval (s)" + +# chrony example output (v2.4.1): +# Reference ID : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) +# Stratum : 2 +# Ref time (UTC) : Thu Nov 10 22:39:50 2016 +# System time : 0.000503798 seconds slow of NTP time +# Last offset : +0.000254355 seconds +# RMS offset : 0.002186779 seconds +# Frequency : 17.716 ppm slow +# Residual freq : +0.066 ppm +# Skew : 4.035 ppm +# Root delay : 0.042980 seconds +# Root dispersion : 0.005391 seconds +# Update interval : 258.4 seconds +# Leap status : Normal + + +if [ "$1" = "autoconf" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then + echo yes + else + echo "no (missing 'chronyc' executable)" + fi + exit 0 +fi + +if [ "$1" = "config" ]; then + echo 'graph_title Chrony Tracking Stats - Update interval' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel (time)' + echo 'graph_category time' + echo 'graph_scale no' + echo "$fields" | while read fieldname factor regex label; do + # insert the factor, if "%d" is part of the label + printf "${fieldname}.label $label\n" "$factor" + echo "${fieldname}.type GAUGE" + done + exit 0 +fi + +chrony_status="$("$CHRONYC" tracking)" +echo "$fields" | while read fieldname factor regex label; do + status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" + if [ -z "$status_line" ]; then + value="U" + else + # the keyword "slow" indicates negative values + value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" + fi + echo "${fieldname}.value $value" +done