Skip to content

Instantly share code, notes, and snippets.

@numist
Last active August 2, 2017 04:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save numist/69098c3a0fe69ce59373ccc7d753ea1e to your computer and use it in GitHub Desktop.
Save numist/69098c3a0fe69ce59373ccc7d753ea1e to your computer and use it in GitHub Desktop.
Parse input from `ping 8.8.8.8 | ts '%s'` and print outage statistics

Prints outage statistics from ping output

Usage

ping 8.8.8.8 | ts '%s' | ./outageReport.rb

Examples:

Packet loss

Obviously, packet loss constitutes an outage, but most clients can tolerate a small amount. This script detects when packet loss exceeds the configured time limit before treating it as an outage:

Input:

1501637139 64 bytes from 8.8.8.8: icmp_seq=47 ttl=58 time=7.515 ms
1501637140 64 bytes from 8.8.8.8: icmp_seq=48 ttl=58 time=7.949 ms
1501637141 64 bytes from 8.8.8.8: icmp_seq=49 ttl=58 time=51.983 ms
1501637142 64 bytes from 8.8.8.8: icmp_seq=50 ttl=58 time=13.050 ms
1501637143 64 bytes from 8.8.8.8: icmp_seq=51 ttl=58 time=7.875 ms
1501637146 Request timeout for icmp_seq 53
1501637147 Request timeout for icmp_seq 54
1501637148 Request timeout for icmp_seq 55
1501637149 Request timeout for icmp_seq 56
1501637150 Request timeout for icmp_seq 57
1501637151 Request timeout for icmp_seq 58
1501637152 Request timeout for icmp_seq 59
1501637153 Request timeout for icmp_seq 60
1501637154 Request timeout for icmp_seq 61
1501637155 Request timeout for icmp_seq 62
1501637156 Request timeout for icmp_seq 63
1501637157 Request timeout for icmp_seq 64
1501637157 64 bytes from 8.8.8.8: icmp_seq=52 ttl=58 time=13197.407 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=53 ttl=58 time=12192.565 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=54 ttl=58 time=11189.791 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=55 ttl=58 time=10187.665 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=56 ttl=58 time=9187.467 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=58 ttl=58 time=7180.813 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=57 ttl=58 time=8183.078 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=59 ttl=58 time=6180.347 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=60 ttl=58 time=5180.142 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=61 ttl=58 time=4179.883 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=62 ttl=58 time=3175.131 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=64 ttl=58 time=1174.728 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=63 ttl=58 time=2174.950 ms
1501637157 64 bytes from 8.8.8.8: icmp_seq=65 ttl=58 time=169.345 ms
1501637158 64 bytes from 8.8.8.8: icmp_seq=66 ttl=58 time=5.968 ms
1501637159 64 bytes from 8.8.8.8: icmp_seq=67 ttl=58 time=13.919 ms
1501637160 64 bytes from 8.8.8.8: icmp_seq=68 ttl=58 time=38.827 ms

Output:

Outage: Tue 01 Aug 2017 18:25:44 PDT → Tue 01 Aug 2017 18:25:57 PDT (13 seconds)

Routing issues

Same as above. If ping doesn't see a timely response within the configured time limit, an outage is recorded.

Input:

1501638843 64 bytes from 8.8.8.8: icmp_seq=1168 ttl=58 time=14.141 ms
1501638844 64 bytes from 8.8.8.8: icmp_seq=1169 ttl=58 time=8.878 ms
1501638845 64 bytes from 8.8.8.8: icmp_seq=1170 ttl=58 time=23.842 ms
1501638846 64 bytes from 8.8.8.8: icmp_seq=1171 ttl=58 time=47.570 ms
1501638847 64 bytes from 8.8.8.8: icmp_seq=1172 ttl=58 time=24.188 ms
1501638848 64 bytes from 8.8.8.8: icmp_seq=1173 ttl=58 time=14.684 ms
1501638849 64 bytes from 8.8.8.8: icmp_seq=1174 ttl=58 time=34.612 ms
1501638850 64 bytes from 8.8.8.8: icmp_seq=1175 ttl=58 time=10.801 ms
1501638851 64 bytes from 8.8.8.8: icmp_seq=1176 ttl=58 time=7.987 ms
1501638852 64 bytes from 8.8.8.8: icmp_seq=1177 ttl=58 time=9.692 ms
1501638853 64 bytes from 8.8.8.8: icmp_seq=1178 ttl=58 time=19.036 ms
1501638854 64 bytes from 8.8.8.8: icmp_seq=1179 ttl=58 time=9.332 ms
1501638855 64 bytes from 8.8.8.8: icmp_seq=1180 ttl=58 time=34.473 ms
1501638859 Request timeout for icmp_seq 1183
1501638860 Request timeout for icmp_seq 1184
1501638861 Request timeout for icmp_seq 1185
1501638862 Request timeout for icmp_seq 1186
1501638863 Request timeout for icmp_seq 1187
1501638864 Request timeout for icmp_seq 1188
1501638865 Request timeout for icmp_seq 1189
1501638866 Request timeout for icmp_seq 1190
1501638867 Request timeout for icmp_seq 1191
1501638868 Request timeout for icmp_seq 1192
1501638869 Request timeout for icmp_seq 1193
1501638870 Request timeout for icmp_seq 1194
1501638871 Request timeout for icmp_seq 1195
1501638872 Request timeout for icmp_seq 1196
1501638873 Request timeout for icmp_seq 1197
1501638874 Request timeout for icmp_seq 1198
1501638875 Request timeout for icmp_seq 1199
1501638876 Request timeout for icmp_seq 1200
1501638877 Request timeout for icmp_seq 1201
1501638878 Request timeout for icmp_seq 1202
1501638879 Request timeout for icmp_seq 1203
1501638880 Request timeout for icmp_seq 1204
1501638881 Request timeout for icmp_seq 1205
1501638882 Request timeout for icmp_seq 1206
1501638883 Request timeout for icmp_seq 1207
1501638884 Request timeout for icmp_seq 1208
1501638885 Request timeout for icmp_seq 1209
1501638885 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638885 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638885  4  5  00 5400 125c   0 0000  3f  01 2d00 172.17.128.44  8.8.8.8
1501638885
1501638885 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638885 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638885  4  5  00 5400 06cd   0 0000  3f  01 388f 172.17.128.44  8.8.8.8
1501638885
1501638886 Request timeout for icmp_seq 1210
1501638887 Request timeout for icmp_seq 1211
1501638888 Request timeout for icmp_seq 1212
1501638888 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638888 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638888  4  5  00 5400 bd15   0 0000  3f  01 8246 172.17.128.44  8.8.8.8
1501638888
1501638888 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638888 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638888  4  5  00 5400 4c62   0 0000  3f  01 f2f9 172.17.128.44  8.8.8.8
1501638888
1501638888 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638888 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638888  4  5  00 5400 0838   0 0000  3f  01 3724 172.17.128.44  8.8.8.8
1501638888
1501638889 Request timeout for icmp_seq 1213
1501638890 Request timeout for icmp_seq 1214
1501638891 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638891 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638891  4  5  00 5400 4a6a   0 0000  3f  01 f4f1 172.17.128.44  8.8.8.8
1501638891
1501638891 Request timeout for icmp_seq 1215
1501638892 Request timeout for icmp_seq 1216
1501638893 Request timeout for icmp_seq 1217
1501638894 Request timeout for icmp_seq 1218
1501638894 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638894 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638894  4  5  00 5400 24cf   0 0000  3f  01 1a8d 172.17.128.44  8.8.8.8
1501638894
1501638895 Request timeout for icmp_seq 1219
1501638896 Request timeout for icmp_seq 1220
1501638897 Request timeout for icmp_seq 1221
1501638897 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638897 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638897  4  5  00 5400 efb6   0 0000  3f  01 4fa5 172.17.128.44  8.8.8.8
1501638897
1501638898 Request timeout for icmp_seq 1222
1501638899 Request timeout for icmp_seq 1223
1501638900 Request timeout for icmp_seq 1224
1501638900 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638900 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638900  4  5  00 5400 3e10   0 0000  3f  01 014c 172.17.128.44  8.8.8.8
1501638900
1501638901 Request timeout for icmp_seq 1225
1501638902 Request timeout for icmp_seq 1226
1501638903 Request timeout for icmp_seq 1227
1501638903 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638903 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638903  4  5  00 5400 7709   0 0000  3f  01 c852 172.17.128.44  8.8.8.8
1501638903
1501638904 Request timeout for icmp_seq 1228
1501638905 Request timeout for icmp_seq 1229
1501638906 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638906 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638906  4  5  00 5400 4708   0 0000  3f  01 f853 172.17.128.44  8.8.8.8
1501638906
1501638906 Request timeout for icmp_seq 1230
1501638907 Request timeout for icmp_seq 1231
1501638908 Request timeout for icmp_seq 1232
1501638909 Request timeout for icmp_seq 1233
1501638910 Request timeout for icmp_seq 1234
1501638911 Request timeout for icmp_seq 1235
1501638912 Request timeout for icmp_seq 1236
1501638912 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638912 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638912  4  5  00 5400 b61a   0 0000  3f  01 8941 172.17.128.44  8.8.8.8
1501638912
1501638913 Request timeout for icmp_seq 1237
1501638914 Request timeout for icmp_seq 1238
1501638915 Request timeout for icmp_seq 1239
1501638915 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638915 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638915  4  5  00 5400 74ec   0 0000  3f  01 ca6f 172.17.128.44  8.8.8.8
1501638915
1501638915 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638915 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638915  4  5  00 5400 257e   0 0000  3f  01 19de 172.17.128.44  8.8.8.8
1501638915
1501638916 Request timeout for icmp_seq 1240
1501638917 Request timeout for icmp_seq 1241
1501638918 Request timeout for icmp_seq 1242
1501638918 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638918 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638918  4  5  00 5400 5f2c   0 0000  3f  01 e02f 172.17.128.44  8.8.8.8
1501638918
1501638919 Request timeout for icmp_seq 1243
1501638920 Request timeout for icmp_seq 1244
1501638921 Request timeout for icmp_seq 1245
1501638921 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638921 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638921  4  5  00 5400 d0c1   0 0000  3f  01 6e9a 172.17.128.44  8.8.8.8
1501638921
1501638921 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638921 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638921  4  5  00 5400 4073   0 0000  3f  01 fee8 172.17.128.44  8.8.8.8
1501638921
1501638922 Request timeout for icmp_seq 1246
1501638923 Request timeout for icmp_seq 1247
1501638924 Request timeout for icmp_seq 1248
1501638924 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638924 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638924  4  5  00 5400 0072   0 0000  3f  01 3eea 172.17.128.44  8.8.8.8
1501638924
1501638925 Request timeout for icmp_seq 1249
1501638926 Request timeout for icmp_seq 1250
1501638927 Request timeout for icmp_seq 1251
1501638927 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638927 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638927  4  5  00 5400 6798   0 0000  3f  01 d7c3 172.17.128.44  8.8.8.8
1501638927
1501638927 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638927 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638927  4  5  00 5400 95f4   0 0000  3f  01 a967 172.17.128.44  8.8.8.8
1501638927
1501638928 Request timeout for icmp_seq 1252
1501638929 Request timeout for icmp_seq 1253
1501638930 Request timeout for icmp_seq 1254
1501638930 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638930 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638930  4  5  00 5400 b021   0 0000  3f  01 8f3a 172.17.128.44  8.8.8.8
1501638930
1501638930 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638930 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638930  4  5  00 5400 88fd   0 0000  3f  01 b65e 172.17.128.44  8.8.8.8
1501638930
1501638931 Request timeout for icmp_seq 1255
1501638932 Request timeout for icmp_seq 1256
1501638933 Request timeout for icmp_seq 1257
1501638933 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638933 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638933  4  5  00 5400 570b   0 0000  3f  01 e850 172.17.128.44  8.8.8.8
1501638933
1501638933 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638933 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638933  4  5  00 5400 bd59   0 0000  3f  01 8202 172.17.128.44  8.8.8.8
1501638933
1501638934 Request timeout for icmp_seq 1258
1501638935 Request timeout for icmp_seq 1259
1501638936 Request timeout for icmp_seq 1260
1501638936 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638936 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638936  4  5  00 5400 0193   0 0000  3f  01 3dc9 172.17.128.44  8.8.8.8
1501638936
1501638936 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638936 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638936  4  5  00 5400 70bf   0 0000  3f  01 ce9c 172.17.128.44  8.8.8.8
1501638936
1501638936 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638936 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638936  4  5  00 5400 d348   0 0000  3f  01 6c13 172.17.128.44  8.8.8.8
1501638936
1501638937 Request timeout for icmp_seq 1261
1501638938 Request timeout for icmp_seq 1262
1501638939 Request timeout for icmp_seq 1263
1501638939 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638939 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638939  4  5  00 5400 57d7   0 0000  3f  01 e784 172.17.128.44  8.8.8.8
1501638939
1501638939 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638939 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638939  4  5  00 5400 212a   0 0000  3f  01 1e32 172.17.128.44  8.8.8.8
1501638939
1501638940 Request timeout for icmp_seq 1264
1501638941 Request timeout for icmp_seq 1265
1501638942 Request timeout for icmp_seq 1266
1501638942 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638942 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638942  4  5  00 5400 98cd   0 0000  3f  01 a68e 172.17.128.44  8.8.8.8
1501638942
1501638942 92 bytes from setup.ubnt.com (172.17.128.1): Destination Host Unreachable
1501638942 Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
1501638942  4  5  00 5400 e303   0 0000  3f  01 5c58 172.17.128.44  8.8.8.8
1501638942
1501638943 Request timeout for icmp_seq 1267
1501638944 Request timeout for icmp_seq 1268
1501638945 Request timeout for icmp_seq 1269
1501638945 64 bytes from 8.8.8.8: icmp_seq=1270 ttl=58 time=113.553 ms
1501638946 64 bytes from 8.8.8.8: icmp_seq=1271 ttl=58 time=8.225 ms
1501638947 64 bytes from 8.8.8.8: icmp_seq=1272 ttl=58 time=48.282 ms
1501638948 64 bytes from 8.8.8.8: icmp_seq=1273 ttl=58 time=18.647 ms
1501638949 64 bytes from 8.8.8.8: icmp_seq=1274 ttl=58 time=25.219 ms

Output:

Outage: Tue 01 Aug 2017 18:54:16 PDT → Tue 01 Aug 2017 18:55:45 PDT (89 seconds)

Ping delays

Sometimes packets don't need to be lost to cause problems for network clients. This script detects when ping has gone quiet for longer than the configured time limit and treats it as an outage, even if all the packets are ultimately returned:

Input:

1501637278 64 bytes from 8.8.8.8: icmp_seq=185 ttl=58 time=15.800 ms
1501637279 64 bytes from 8.8.8.8: icmp_seq=186 ttl=58 time=24.505 ms
1501637280 64 bytes from 8.8.8.8: icmp_seq=187 ttl=58 time=6.031 ms
1501637281 64 bytes from 8.8.8.8: icmp_seq=188 ttl=58 time=84.387 ms
1501637282 64 bytes from 8.8.8.8: icmp_seq=189 ttl=58 time=20.395 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=190 ttl=58 time=37444.904 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=191 ttl=58 time=36441.499 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=192 ttl=58 time=35440.944 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=193 ttl=58 time=34435.593 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=194 ttl=58 time=33435.026 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=195 ttl=58 time=32434.819 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=196 ttl=58 time=31430.860 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=197 ttl=58 time=30429.867 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=198 ttl=58 time=29426.645 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=199 ttl=58 time=28421.348 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=200 ttl=58 time=27416.681 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=201 ttl=58 time=26411.413 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=202 ttl=58 time=25410.934 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=203 ttl=58 time=24405.435 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=204 ttl=58 time=23401.240 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=205 ttl=58 time=22400.219 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=206 ttl=58 time=21398.362 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=207 ttl=58 time=20393.467 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=208 ttl=58 time=19392.627 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=209 ttl=58 time=18392.366 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=210 ttl=58 time=17390.512 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=211 ttl=58 time=16387.842 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=212 ttl=58 time=15384.778 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=213 ttl=58 time=14380.536 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=214 ttl=58 time=13375.321 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=215 ttl=58 time=12374.648 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=216 ttl=58 time=11374.399 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=217 ttl=58 time=10374.093 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=218 ttl=58 time=9369.363 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=219 ttl=58 time=8364.247 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=220 ttl=58 time=7363.538 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=221 ttl=58 time=6361.051 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=223 ttl=58 time=4352.909 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=224 ttl=58 time=3349.109 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=222 ttl=58 time=5356.932 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=225 ttl=58 time=2348.896 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=226 ttl=58 time=1348.741 ms
1501637320 64 bytes from 8.8.8.8: icmp_seq=227 ttl=58 time=347.410 ms
1501637321 64 bytes from 8.8.8.8: icmp_seq=228 ttl=58 time=21.089 ms
1501637322 64 bytes from 8.8.8.8: icmp_seq=229 ttl=58 time=9.637 ms
1501637323 64 bytes from 8.8.8.8: icmp_seq=230 ttl=58 time=11.660 ms
1501637324 64 bytes from 8.8.8.8: icmp_seq=231 ttl=58 time=6.765 ms
1501637325 64 bytes from 8.8.8.8: icmp_seq=232 ttl=58 time=18.374 ms
1501637326 64 bytes from 8.8.8.8: icmp_seq=233 ttl=58 time=17.651 ms

Output:

Outage: Tue 01 Aug 2017 18:28:03 PDT → Tue 01 Aug 2017 18:28:40 PDT (37 seconds)
#!/usr/bin/env ruby
# Parses input from `ping 8.8.8.8 | ts '%s'` and prints outage statistics
require 'active_support/time'
#
# Configuration:
#
# Don't report outages shorter than this number of seconds
FILTER_TIME = 10
# Output time zone
PACIFIC_TIME_ZONE = ActiveSupport::TimeZone.new("Pacific Time (US & Canada)")
# Output time format
TIME_FMT = "%a %d %b %Y %k:%M:%S %Z"
# Heuristic function for determining if a line represents a lack of connectivity
def is_outage_line?(line)
# The PING header line does not represent a connectivity problem
return false if line =~ /^[\d]+ PING/
# A ping response longer than the configured FILTER_TIME represents an outage
if line =~ /[\d]+ [\d]+ bytes from [\d]+\.[\d]+\.[\d]+\.[\d]+: icmp_seq=[\d]+ ttl=[\d]+ time=([\d.]+) ms/
return $1.to_f >= (FILTER_TIME * 1000)
end
# Any line not matching a ping response represents a connection problem
true
end
#
# Initialization:
#
timestamp = -1
# outage_started uses 0 as a sentinel value, indicating there is no current outage
outage_started = 0
#
# Main loop:
#
ARGF.each do |line|
# Remember the last good line, as it may represent the beginning of an outage
prev_timestamp = timestamp + 1
# Parse the timestamp out of this line
timestamp = line[/^([\d]+)/, 1].to_i or raise "Error: Line does not begin with timestamp: #{line}"
# Does this line demonstrate a lack of internet connection?
is_outage = is_outage_line?(line)
if outage_started == 0 && is_outage
outage_started = prev_timestamp
elsif outage_started > 0 && !is_outage
# The current line's timestamp represents the end of the outage
duration = timestamp - outage_started
# Get the start and end times in terms of the output time zone
start_time = Time.at(outage_started).utc.to_datetime.in_time_zone(PACIFIC_TIME_ZONE)
end_time = Time.at(timestamp).utc.to_datetime.in_time_zone(PACIFIC_TIME_ZONE)
puts "Outage: #{start_time.strftime(TIME_FMT)} → #{end_time.strftime(TIME_FMT)} (#{duration} seconds)" if duration >= FILTER_TIME
outage_started = 0
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment