2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00

[chrony] simplify field handling

This commit is contained in:
Lars Kruse 2016-11-11 00:29:45 +01:00
parent 89ddacb3c4
commit fb4a95730d

View File

@ -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 <devel@sumpfralle.de>
=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"
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