master
go 77 lines 1.47 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package pinger
4
5 import (
6 "time"
7
8 probing "github.com/prometheus-community/pro-bing"
9 )
10
11 func deriveSample(host string, stats *probing.Statistics, track bool, states *stateStore, cfg AnalysisConfig) Sample {
12 sample := Sample{
13 Host: host,
14 PacketsSent: int64(stats.PacketsSent),
15 PacketsRecv: int64(stats.PacketsRecv),
16 PacketLossPct: stats.PacketLoss,
17 RTT: deriveRTT(stats),
18 }
19
20 sample.Jitter = deriveJitter(host, stats, track, states, cfg)
21
22 return sample
23 }
24
25 func deriveRTT(stats *probing.Statistics) RTTSummary {
26 if stats.PacketsRecv == 0 {
27 return RTTSummary{}
28 }
29
30 return RTTSummary{
31 Valid: true,
32 Min: stats.MinRtt,
33 Max: stats.MaxRtt,
34 Avg: stats.AvgRtt,
35 StdDev: stats.StdDevRtt,
36 }
37 }
38
39 func deriveJitter(host string, stats *probing.Statistics, track bool, states *stateStore, cfg AnalysisConfig) JitterSummary {
40 if len(stats.Rtts) < 2 {
41 return JitterSummary{}
42 }
43
44 mean := calcMeanJitter(stats.Rtts)
45 js := JitterSummary{
46 InstantValid: true,
47 Mean: mean,
48 }
49
50 if !track {
51 return js
52 }
53
54 ewma, sma := states.update(host, mean, cfg)
55 js.SmoothedValid = true
56 js.EWMA = ewma
57 js.SMA = sma
58
59 return js
60 }
61
62 func calcMeanJitter(rtts []time.Duration) time.Duration {
63 if len(rtts) < 2 {
64 return 0
65 }
66
67 var sum int64
68 for i := 1; i < len(rtts); i++ {
69 diff := rtts[i] - rtts[i-1]
70 if diff < 0 {
71 diff = -diff
72 }
73 sum += int64(diff)
74 }
75
76 return time.Duration(sum / int64(len(rtts)-1))
77 }