From 6cb29a3bf34ba50db4c28a7356f4a19ef66067d6 Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Thu, 10 Nov 2016 23:19:38 +0100 Subject: [PATCH 1/6] [chrony] switch from bash to sh; fix shell style issues --- plugins/time/chrony | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/time/chrony b/plugins/time/chrony index 96e3ce0f..33469f05 100755 --- a/plugins/time/chrony +++ b/plugins/time/chrony @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # # Script to parse Chrony Tracking Output # @@ -52,11 +52,11 @@ if [ "$1" = "config" ]; then echo 'graph_category time' i=0 for a in $fields ; do - i=$(expr $i + 1); - word=`echo $fieldnames | cut -f $i -d '='`; - factor=`echo $fieldfactors | cut -f $i -d ' '`; + i=$((i + 1)) + word="$(echo "$fieldnames" | cut -f "$i" -d '=')" + factor="$(echo "$fieldfactors" | cut -f "$i" -d ' ')" echo "$a.label $word$factor)"; - echo "$a.type GAUGE"; + echo "$a.type GAUGE" done exit 0 fi From 6fd9d9072b2fc897fb81a9effd9ac6a858cef382 Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Thu, 10 Nov 2016 23:39:45 +0100 Subject: [PATCH 2/6] [chrony] format POD documentation --- plugins/time/chrony | 75 +++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/plugins/time/chrony b/plugins/time/chrony index 33469f05..5df6765b 100755 --- a/plugins/time/chrony +++ b/plugins/time/chrony @@ -1,37 +1,54 @@ #!/bin/sh -# -# Script to parse Chrony Tracking Output -# -# Parameters understood: -# -# config (required) -# autoconf (optional - used by munin-config) -# -# $log$ -# 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 -# -# Magic markers (optional - used by munin-config and installation scripts): -# -#%# family=auto -#%# capabilities=autoconf -#Modify this to fit other chronyc path +: <<=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 + +=head1 AUTHOR + + joti + zjttoefs + +=cut + +# Modify this to fit other chronyc path CHRONYC=/usr/bin/chronyc -#Frequency has extremely higher values than other. Therefore they are fitted by scaling. Adjust the factors here +# Frequency has extremely higher values than other. Therefore they are fitted by scaling. Adjust the factors here fieldfactors="1 1000 1 100 100 1000 1000" -#fieldfactors="1 1000000 0.1 100 10 10 10" fields="stratum systime frequency residualfreq skew rootdelay rootdispersion" fieldnames="Stratum (=System Time (seconds,x=Frequency (ppm,x=Residual Freq (ppm,x=Skew (ppm,x=Root delay(seconds,x=Root dispersion (seconds,x" From cfd1612aa511e1a4172f48443f69dbd5c5c5be71 Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Thu, 10 Nov 2016 23:50:31 +0100 Subject: [PATCH 3/6] [chrony] determine path of "chronyc" via "which" --- plugins/time/chrony | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/time/chrony b/plugins/time/chrony index 5df6765b..d58b3e05 100755 --- a/plugins/time/chrony +++ b/plugins/time/chrony @@ -44,8 +44,7 @@ Revision 0.3 2014/02/16 zjttoefs =cut -# Modify this to fit other chronyc path -CHRONYC=/usr/bin/chronyc +CHRONYC="$(which chronyc | head -1)" # Frequency has extremely higher values than other. Therefore they are fitted by scaling. Adjust the factors here fieldfactors="1 1000 1 100 100 1000 1000" @@ -53,7 +52,7 @@ fields="stratum systime frequency residualfreq skew rootdelay rootdispersion" fieldnames="Stratum (=System Time (seconds,x=Frequency (ppm,x=Residual Freq (ppm,x=Skew (ppm,x=Root delay(seconds,x=Root dispersion (seconds,x" if [ "$1" = "autoconf" ]; then - if [ -f "$CHRONYC" ]; then + if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then echo yes exit 0 else @@ -79,7 +78,7 @@ if [ "$1" = "config" ]; then fi # remove non-needed output lines, remove labels, rescale and label values while detecting slow/fast keywords -chronyc tracking | sed -e 1d -e 3d -e "s/.*://" | \ +"$CHRONYC" tracking | sed -e 1d -e 3d -e "s/.*://" | \ awk -v FAC="$fieldfactors" -v NAM="$fields" \ 'BEGIN { split(FAC,factors," "); split(NAM,names," "); } { /slow/ ? SIGN=-1 : SIGN=1 ; print names[NR]".value ",SIGN*$1*factors[NR]}' From 728b105318b7850560bc8476406e2fefed93b9ee Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Thu, 10 Nov 2016 23:51:56 +0100 Subject: [PATCH 4/6] [chrony] fix error status and message for 'autoconf' --- plugins/time/chrony | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/time/chrony b/plugins/time/chrony index d58b3e05..917e8b3e 100755 --- a/plugins/time/chrony +++ b/plugins/time/chrony @@ -54,11 +54,10 @@ fieldnames="Stratum (=System Time (seconds,x=Frequency (ppm,x=Residual Freq (ppm if [ "$1" = "autoconf" ]; then if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then echo yes - exit 0 else - echo "no (no $CHRONYC)" - exit 1 + echo "no (missing 'chronyc' executable)" fi + exit 0 fi if [ "$1" = "config" ]; then From 89ddacb3c49108aac4ed6df0cc3f40a0791e75db Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Thu, 10 Nov 2016 23:54:57 +0100 Subject: [PATCH 5/6] [chrony] fix whitespace issues --- plugins/time/chrony | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/time/chrony b/plugins/time/chrony index 917e8b3e..e10ddd3e 100755 --- a/plugins/time/chrony +++ b/plugins/time/chrony @@ -61,10 +61,10 @@ if [ "$1" = "autoconf" ]; then fi if [ "$1" = "config" ]; then - echo 'graph_title Chrony Tracking Stats' - echo 'graph_args --base 1000 -l 0' - echo 'units (seconds,ppm)' - echo 'graph_category time' + echo 'graph_title Chrony Tracking Stats' + echo 'graph_args --base 1000 -l 0' + echo 'units (seconds,ppm)' + echo 'graph_category time' i=0 for a in $fields ; do i=$((i + 1)) @@ -73,11 +73,11 @@ if [ "$1" = "config" ]; then echo "$a.label $word$factor)"; echo "$a.type GAUGE" done - exit 0 + exit 0 fi # remove non-needed output lines, remove labels, rescale and label values while detecting slow/fast keywords "$CHRONYC" tracking | sed -e 1d -e 3d -e "s/.*://" | \ awk -v FAC="$fieldfactors" -v NAM="$fields" \ - 'BEGIN { split(FAC,factors," "); split(NAM,names," "); } - { /slow/ ? SIGN=-1 : SIGN=1 ; print names[NR]".value ",SIGN*$1*factors[NR]}' + 'BEGIN { split(FAC,factors," "); split(NAM,names," "); + { /slow/ ? SIGN=-1 : SIGN=1 ; print names[NR]".value ",SIGN*$1*factors[NR]}' From fb4a95730d8a244f42c501d2b10b1a06b13d340b Mon Sep 17 00:00:00 2001 From: Lars Kruse Date: Fri, 11 Nov 2016 00:29:45 +0100 Subject: [PATCH 6/6] [chrony] simplify field handling --- plugins/time/chrony | 72 +++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/plugins/time/chrony b/plugins/time/chrony index e10ddd3e..314860f6 100755 --- a/plugins/time/chrony +++ b/plugins/time/chrony @@ -37,19 +37,52 @@ Revision 0.3 2014/02/16 zjttoefs 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. Adjust the factors here -fieldfactors="1 1000 1 100 100 1000 1000" -fields="stratum systime frequency residualfreq skew rootdelay rootdispersion" -fieldnames="Stratum (=System Time (seconds,x=Frequency (ppm,x=Residual Freq (ppm,x=Skew (ppm,x=Root delay(seconds,x=Root dispersion (seconds,x" +# 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 1000 ^System.time System Time (x%d) + frequency 1 ^Frequency Frequency (ppm) + residualfreq 100 ^Residual.freq Residual Freq (ppm, x%d) + skew 100 ^Skew Skew (ppm, x%d) + rootdelay 1000 ^Root.delay Root delay (seconds, x%d) + rootdispersion 1000 ^Root.dispersion Root dispersion (seconds, x%d)" + +# 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 @@ -63,21 +96,24 @@ fi if [ "$1" = "config" ]; then echo 'graph_title Chrony Tracking Stats' echo 'graph_args --base 1000 -l 0' - echo 'units (seconds,ppm)' + echo 'graph_vlabel (seconds,ppm)' echo 'graph_category time' - i=0 - for a in $fields ; do - i=$((i + 1)) - word="$(echo "$fieldnames" | cut -f "$i" -d '=')" - factor="$(echo "$fieldfactors" | cut -f "$i" -d ' ')" - echo "$a.label $word$factor)"; - echo "$a.type GAUGE" - done + 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 -# remove non-needed output lines, remove labels, rescale and label values while detecting slow/fast keywords -"$CHRONYC" tracking | sed -e 1d -e 3d -e "s/.*://" | \ - awk -v FAC="$fieldfactors" -v NAM="$fields" \ - 'BEGIN { split(FAC,factors," "); split(NAM,names," "); - { /slow/ ? SIGN=-1 : SIGN=1 ; print names[NR]".value ",SIGN*$1*factors[NR]}' +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