mirror of
https://github.com/munin-monitoring/contrib.git
synced 2025-09-18 16:48:44 +00:00
Merge pull request #769 from sumpfralle/chronyd-improvements
[chrony] various improvements
This commit is contained in:
commit
71e8eb7ee5
1 changed files with 107 additions and 56 deletions
|
@ -1,68 +1,119 @@
|
||||||
#!/bin/bash
|
#!/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
|
||||||
CHRONYC=/usr/bin/chronyc
|
|
||||||
|
=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 <devel@sumpfralle.de>
|
||||||
|
|
||||||
|
=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 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
|
||||||
|
|
||||||
#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"
|
|
||||||
|
|
||||||
if [ "$1" = "autoconf" ]; then
|
if [ "$1" = "autoconf" ]; then
|
||||||
if [ -f "$CHRONYC" ]; then
|
if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then
|
||||||
echo yes
|
echo yes
|
||||||
exit 0
|
|
||||||
else
|
else
|
||||||
echo "no (no $CHRONYC)"
|
echo "no (missing 'chronyc' executable)"
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$1" = "config" ]; then
|
if [ "$1" = "config" ]; then
|
||||||
echo 'graph_title Chrony Tracking Stats'
|
echo 'graph_title Chrony Tracking Stats'
|
||||||
echo 'graph_args --base 1000 -l 0'
|
echo 'graph_args --base 1000 -l 0'
|
||||||
echo 'units (seconds,ppm)'
|
echo 'graph_vlabel (seconds,ppm)'
|
||||||
echo 'graph_category time'
|
echo 'graph_category time'
|
||||||
i=0
|
echo "$fields" | while read fieldname factor regex label; do
|
||||||
for a in $fields ; do
|
# insert the factor, if "%d" is part of the label
|
||||||
i=$(expr $i + 1);
|
printf "${fieldname}.label $label\n" "$factor"
|
||||||
word=`echo $fieldnames | cut -f $i -d '='`;
|
echo "${fieldname}.type GAUGE"
|
||||||
factor=`echo $fieldfactors | cut -f $i -d ' '`;
|
done
|
||||||
echo "$a.label $word$factor)";
|
exit 0
|
||||||
echo "$a.type GAUGE";
|
|
||||||
done
|
|
||||||
exit 0
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# remove non-needed output lines, remove labels, rescale and label values while detecting slow/fast keywords
|
chrony_status="$("$CHRONYC" tracking)"
|
||||||
chronyc tracking | sed -e 1d -e 3d -e "s/.*://" | \
|
echo "$fields" | while read fieldname factor regex label; do
|
||||||
awk -v FAC="$fieldfactors" -v NAM="$fields" \
|
status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)"
|
||||||
'BEGIN { split(FAC,factors," "); split(NAM,names," "); }
|
if [ -z "$status_line" ]; then
|
||||||
{ /slow/ ? SIGN=-1 : SIGN=1 ; print names[NR]".value ",SIGN*$1*factors[NR]}'
|
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue