xref: /freebsd-src/contrib/ntp/scripts/stats/peer.awk (revision cfe30d02adda7c3b5c76156ac52d50d8cab325d9)
1*c0b746e5SOllivier Robert# awk program to scan peerstats files and report errors/statistics
2*c0b746e5SOllivier Robert#
3*c0b746e5SOllivier Robert# usage: awk -f peer.awk peerstats
4*c0b746e5SOllivier Robert#
5*c0b746e5SOllivier Robert# format of peerstats record
6*c0b746e5SOllivier Robert#  MJD    sec    ident   stat  offset (s)  delay (s)  disp (s)
7*c0b746e5SOllivier Robert# 49235 11.632 128.4.2.7 f414  -0.000041    0.21910   0.00084
8*c0b746e5SOllivier Robert#
9*c0b746e5SOllivier Robert# format of output dataset (time values in milliseconds)
10*c0b746e5SOllivier Robert# peerstats.19960706
11*c0b746e5SOllivier Robert#        ident     cnt     mean     rms      max     delay     dist     disp
12*c0b746e5SOllivier Robert# ==========================================================================
13*c0b746e5SOllivier Robert# 140.173.112.2     85   -0.509    1.345    4.606   80.417   49.260    1.092
14*c0b746e5SOllivier Robert# 128.4.1.20      1364    0.058    0.364    4.465    3.712   10.540    1.101
15*c0b746e5SOllivier Robert# 140.173.16.1    1415   -0.172    0.185    1.736    3.145    5.020    0.312
16*c0b746e5SOllivier Robert#...
17*c0b746e5SOllivier Robert#
18*c0b746e5SOllivier RobertBEGIN {
19*c0b746e5SOllivier Robert	n = 0
20*c0b746e5SOllivier Robert	MAXDISTANCE = 1.0
21*c0b746e5SOllivier Robert}
22*c0b746e5SOllivier Robert#
23*c0b746e5SOllivier Robert# scan all records in file
24*c0b746e5SOllivier Robert#
25*c0b746e5SOllivier Robert# we toss out all distances greater than one second on the assumption the
26*c0b746e5SOllivier Robert# peer is in initial acquisition
27*c0b746e5SOllivier Robert#
28*c0b746e5SOllivier Robert{
29*c0b746e5SOllivier Robert	if (NF >= 7 && ($7 + $6 / 2) < MAXDISTANCE) {
30*c0b746e5SOllivier Robert		i = n
31*c0b746e5SOllivier Robert		for (j = 0; j < n; j++) {
32*c0b746e5SOllivier Robert			if ($3 == peer_ident[j])
33*c0b746e5SOllivier Robert				i = j
34*c0b746e5SOllivier Robert		}
35*c0b746e5SOllivier Robert		if (i == n) {
36*c0b746e5SOllivier Robert			peer_ident[i] = $3
37*c0b746e5SOllivier Robert			peer_tmax[i] = peer_dist[i] = -1e9
38*c0b746e5SOllivier Robert			peer_tmin[i] = 1e9
39*c0b746e5SOllivier Robert			n++
40*c0b746e5SOllivier Robert		}
41*c0b746e5SOllivier Robert		peer_count[i]++
42*c0b746e5SOllivier Robert		if ($5 > peer_tmax[i])
43*c0b746e5SOllivier Robert			peer_tmax[i] = $5
44*c0b746e5SOllivier Robert		if ($5 < peer_tmin[i])
45*c0b746e5SOllivier Robert			peer_tmin[i] = $5
46*c0b746e5SOllivier Robert		dist = $7 + $6 / 2
47*c0b746e5SOllivier Robert		if (dist > peer_dist[i])
48*c0b746e5SOllivier Robert			peer_dist[i] = dist
49*c0b746e5SOllivier Robert		peer_time[i] += $5
50*c0b746e5SOllivier Robert		peer_time_rms[i] += $5 * $5
51*c0b746e5SOllivier Robert		peer_delay[i] += $6
52*c0b746e5SOllivier Robert		peer_disp[i] +=  $7
53*c0b746e5SOllivier Robert	}
54*c0b746e5SOllivier Robert} END {
55*c0b746e5SOllivier Robert	printf "       ident     cnt     mean     rms      max     delay     dist     disp\n"
56*c0b746e5SOllivier Robert	printf "==========================================================================\n"
57*c0b746e5SOllivier Robert	for (i = 0; i < n; i++) {
58*c0b746e5SOllivier Robert		peer_time[i] /= peer_count[i]
59*c0b746e5SOllivier Robert                peer_time_rms[i] = sqrt(peer_time_rms[i] / peer_count[i] - peer_time[i] * peer_time[i])
60*c0b746e5SOllivier Robert		peer_delay[i] /= peer_count[i]
61*c0b746e5SOllivier Robert		peer_disp[i] /= peer_count[i]
62*c0b746e5SOllivier Robert		peer_tmax[i] = peer_tmax[i] - peer_time[i]
63*c0b746e5SOllivier Robert		peer_tmin[i] = peer_time[i] - peer_tmin[i]
64*c0b746e5SOllivier Robert		if (peer_tmin[i] > peer_tmax[i])
65*c0b746e5SOllivier Robert			peer_tmax[i] = peer_tmin[i]
66*c0b746e5SOllivier Robert		printf "%-15s%5d%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f\n", peer_ident[i], peer_count[i], peer_time[i] * 1e3, peer_time_rms[i] * 1e3, peer_tmax[i] * 1e3, peer_delay[i] * 1e3, peer_dist[i] * 1e3, peer_disp[i] * 1e3
67*c0b746e5SOllivier Robert	}
68*c0b746e5SOllivier Robert}
69