People have asked how I get the NTP statistics plotted by MRTG. Well I got the idea from Piotr Trojanek who had the following code for Unix: #!/bin/sh ntpq -c rv \ |tail -n 1 \ |sed 's/[a-z=,]//g' \ |mawk '{printf "%d\n%d\n", int(($1 > 0) ? $1 : -$1), int(($2 > 0) ? $2 : -$2)}' ntpdc -c sysstats \ |mawk '{TOTSEC = $3; H = int(TOTSEC/3600); TOTSEC -= H*3600; M = int(TOTSEC/60); TOTSEC -= M*60; printf "%02d:%02d:%02d\n", H, M, TOTSEC; exit 0}' echo "ntp_host" as the command to be run from MRTG, but as I am running Windows, I substituted a Perl script for the Unix script. The first step is to get MRTG to take its data from a command line rather than an SNMP query. You do this by placing the command to run in back-quotes as the argument to an MRTG "Target" statement. Then you need to write the command or script to write the four values MRTG is expecting to standard output. --------------------------------------------------------------- Extract from mrtg.cfg --------------------------------------------------------------- Target[odin_ntp]: `perl GetNTP.pl odin` MaxBytes[odin_ntp]: 100 MaxBytes2[odin_ntp]: 200 Unscaled[odin_ntp]: dwmy Timezone[odin_ntp]: UTC TimeStrPos[odin_ntp]: RU TimeStrFmt[odin_ntp]: %Y-%b-%d Title[odin_ntp]: NTP statistics for Odin - offset from NTP Options[odin_ntp]: integer, gauge, nopercent, growright YLegend[odin_ntp]: offset+100 ms ShortLegend[odin_ntp]: ms LegendI[odin_ntp]: LegendO[odin_ntp]: offset:  Legend1[odin_ntp]: n/a Legend2[odin_ntp]: time offset in ms, with 100ms offset added to ensure it's positive! PageTop[odin_ntp]:

NTP -- PC Odin

Perl script run to manipulate NTPQ output - file: GetNTP.pl ----------------------------------------------------------- $ntp_str = `ntpq -c rv $ARGV[0]`; $val = (split(/\,/,$ntp_str))[20]; $val =~ s/offset=//i; $val = int ($val + 100); if ($val < 0) { $val = 0; } print "0\n"; print "$val\n"; print "0\n"; print "0\n"; ----------------------------------------------------------- Update 2004-Mar-13: Thanks to Jim O'Boyle, who mentioned that I could use parameter-passing from the mrtg.cfg to avoid hard-coding the node name into GetNTP.pl. The version above includes his update. Thanks, Jim! ----------------------------------------------------------- Update 2006-Jul-10: In February, I added a simple stratum 1 server, and added a different version of the Perl script to cover the more limited range of +/-20 microseconds (displayed as 0..40us). By July, the GPS was failing more often (tree leaf growth?), so I modified the script to limit on both positive and negative excursions (as without the GPS the server could be hundreds of microseconds out). $ntp_str = `ntpq -c rv $ARGV[0]`; $val = (split(/\,/,$ntp_str))[20]; $val =~ s/offset=//i; $val = 1000.0 * $val; # convert to microseconds $report = int ($val + 20); if ($report < 0) { $report = 0; } if ($report > 40) { $report = 40; } print "0\n"; print "$report\n"; print "0\n"; print "0\n"; ----------------------------------------------------------- Update 2009-Mar-14 By making the MaxBytes and MaxBytes2 values different, you can get MaxBytes plotted as a red dotted line on the graph, nicely indicating the nominal value if you make MaxBytes half MaxBytes2. So for a 100ms offset from zero for example, you could change the lines to: MaxBytes[odin_ntp]: 100 MaxBytes2[odin_ntp]: 200 ----------------------------------------------------------- Update 2011-Dec-11 Under Windows Vista and Windows-7, you may find the local host name resolving to an IPv6 address, even if IPv6 is not enabled on the adapters. In that case, use 127.0.0.1 as the local host address: Target[odin_ntp]: `perl GetNTP.pl 127.0.0.1`