You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
| #!/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 <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="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
 |