#!/usr/bin/awk -f
BEGIN {
- PINGSLOTS=5
+ print "THRESHOLD=" THRESHOLD
+ print "FUDGE=" FUDGE
+ print "PINGSLOTS=" SLOTS
split(PING_PEERS, pps, " ")
for (pp in pps) {
pn = pps[pp]
print "ping peer: " pn
slotindex[pn]=0
+ have_baseline[pn]=0
+ ping_avgs[pn]=-1
+ ping_prev[pn]=-1
}
}
+
# 1.1.1.1 : [0], 1288 bytes, 10.3 ms (10.3 avg, 0% loss)
# 192.168.1.50 : [0], timed out (NaN avg, 100% loss)
/[0-9] bytes, [0-9]*.[0-9]* ms / {
seq=$3
bytes=$4
lat=$6
- #printf("%s %db in %.2fms\n", pn, bytes, lat)
- slotindex[pn]++
- pingslot=pn ":" slotindex[pn]
- pingstats[pingslot]=lat
-
- if(slotindex[pn] % PINGSLOTS == 0) {
- # print "slotindex reset for " pn
- slotindex[pn]=0
+ if (! (pn in slotindex)) {
+ print "BOGUS PEER: " pn
+ exit 1
}
- for (ps in pingstats) {
- print ps " " pingstats[ps]
+ #printf("%s %db in %.2fms\n", pn, bytes, lat)
+ update_pingstats(pn, lat)
+ if(have_baseline[pn]) {
+ last2avg = (((ping_prev[pn] + lat) / 2.0))
+ thresh_fudged = (FUDGE + (ping_avgs[pn] * THRESHOLD))
+ if (last2avg > thresh_fudged ) {
+ print "LATENCY ++ " last2avg " " thresh_fudged " prev=" ping_prev[pn] " lat=" lat " host=" pn
+ } else {
+ print "LATENCY == " last2avg " " thresh_fudged " prev=" ping_prev[pn] " lat=" lat " host=" pn
+ }
+ } else {
+ # print "NODATA"
}
+ ping_prev[pn]=lat
}
+
function update_pingstats(peername, latency) {
-print peername " at " latency
+ slotindex[peername]++
+ pingslot=peername ":" slotindex[peername]
+ pingstats[pingslot]=latency
+ if(slotindex[peername] % PINGSLOTS == 0) {
+ have_baseline[peername]=1
+ slotindex[peername]=0
+ update_ping_avgs(peername)
+ # print peername " avg " ping_avgs[peername] " cur " latency
+ }
+}
+
+
+function update_ping_avgs(peername) {
+ ping_sum = 0
+ for (k = 0; k<=PINGSLOTS; ++k) {
+ ps = peername ":" k
+ ping_sum += pingstats[ps]
+ }
+ ping_avg = ping_sum / PINGSLOTS
+ # print "AVG over " PINGSLOTS " samples for peer " peername " sum=" ping_sum " avg=" ping_avg
+ ping_avgs[pn] = ping_avg
}
END {
+ # Usually not reached.
}
#!/bin/sh
+THRESHOLD=1.2
+FUDGE_MS=2.0
PING_PEERS='1.1.1.1 8.8.8.8'
+PING_GW_IPV4=yes
+PING_GW_IPV6=no
+PING_SLOTS_PER_PEER=5
+PING_INTERVAL=500
-def_gw_v4=$(traceroute -n -m 1 1.1.1.1 | awk '{if("1" == $1){print $2}}')
-fping --loop --retry=1 --size=1280 --period=500 --random "${def_gw_v4}" ${PING_PEERS} | awk -v PING_PEERS="${def_gw_v4} ${PING_PEERS}" -f __lagdetect.awk
+
+
+#####################
+# DO NOT EDIT BELOW #
+#####################
+
+set -u
+for t in traceroute fping
+do
+type "$t" || exit 1
+done
+
+_def_gw_v4=$(traceroute -n -m 1 1.1.1.1 | awk '{if("1" == $1){print $2}}')
+
+fping --loop --retry=1 --size=1280 --period="${PING_INTERVAL}" --random "${_def_gw_v4}" ${PING_PEERS} 2>/dev/null \
+| awk \
+ -v THRESHOLD="${THRESHOLD}" \
+ -v PINGSLOTS="${PING_SLOTS_PER_PEER}" \
+ -v FUDGE="${FUDGE_MS}" \
+ -v PING_PEERS="${_def_gw_v4} ${PING_PEERS}" \
+ -f __lagdetect.awk