Skip to content

Commit 1ab9575

Browse files
committed
Add median value to metrics
Implements suggestion by Lee Briggs (see PR #10).
1 parent 34ca507 commit 1ab9575

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

monitor/history.go

+12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package monitor
22

33
import (
44
"math"
5+
"sort"
56
"sync"
67
"time"
78
)
@@ -103,11 +104,22 @@ func (h *History) compute() *Metrics {
103104
}
104105
stddev = math.Sqrt(sumSquares / size)
105106

107+
median := math.NaN()
108+
if l := len(data); l > 0 {
109+
sort.Float64Slice(data).Sort()
110+
if l%2 == 0 {
111+
median = (data[l/2-1] + data[l/2]) / 2
112+
} else {
113+
median = data[l/2]
114+
}
115+
}
116+
106117
return &Metrics{
107118
PacketsSent: numTotal,
108119
PacketsLost: numFailure,
109120
Best: float32(best),
110121
Worst: float32(worst),
122+
Median: float32(median),
111123
Mean: float32(mean),
112124
StdDev: float32(stddev),
113125
}

monitor/history_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func TestCompute(t *testing.T) {
4343
assert.EqualValues(1, metrics.PacketsLost)
4444
assert.EqualValues(0, metrics.Best)
4545
assert.EqualValues(0, metrics.Worst)
46+
assert.True(math.IsNaN(float64(metrics.Median)))
4647
assert.True(math.IsNaN(float64(metrics.Mean)))
4748
assert.True(math.IsNaN(float64(metrics.StdDev)))
4849
}
@@ -59,6 +60,18 @@ func TestCompute(t *testing.T) {
5960
assert.EqualValues(1, h.Compute().PacketsLost)
6061
}
6162

63+
{ // test median
64+
h := NewHistory(5)
65+
h.AddResult(3*dur, nil)
66+
h.AddResult(2*dur, nil)
67+
h.AddResult(1*dur, nil)
68+
h.AddResult(0*dur, nil)
69+
assert.EqualValues(150, h.Compute().Median)
70+
71+
h.AddResult(4*dur, nil)
72+
assert.EqualValues(200, h.Compute().Median)
73+
}
74+
6275
{
6376
// test zero variance
6477
h := NewHistory(8)
@@ -70,6 +83,7 @@ func TestCompute(t *testing.T) {
7083
assert.EqualValues(100, metrics.Best)
7184
assert.EqualValues(100, metrics.Worst)
7285
assert.EqualValues(100, metrics.Mean)
86+
assert.EqualValues(100, metrics.Median)
7387
assert.EqualValues(0, metrics.StdDev)
7488
assert.EqualValues(3, metrics.PacketsSent)
7589
assert.EqualValues(1, metrics.PacketsLost)
@@ -83,6 +97,7 @@ func TestCompute(t *testing.T) {
8397
assert.EqualValues(100, metrics.Best)
8498
assert.EqualValues(200, metrics.Worst)
8599
assert.EqualValues(125, metrics.Mean)
100+
assert.EqualValues(100, metrics.Median)
86101
assert.InDelta(43.30127, float64(metrics.StdDev), 0.000001)
87102
assert.EqualValues(6, metrics.PacketsSent)
88103
assert.EqualValues(2, metrics.PacketsLost)
@@ -93,6 +108,7 @@ func TestCompute(t *testing.T) {
93108
assert.EqualValues(0, metrics.Best)
94109
assert.EqualValues(200, metrics.Worst)
95110
assert.EqualValues(100, metrics.Mean)
111+
assert.EqualValues(100, metrics.Median)
96112
assert.InDelta(63.2455, float64(metrics.StdDev), 0.0001)
97113
assert.EqualValues(7, metrics.PacketsSent)
98114
assert.EqualValues(2, metrics.PacketsLost)

monitor/metrics.go

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ type Metrics struct {
66
PacketsLost int // number of packets lost
77
Best float32 // best rtt in ms
88
Worst float32 // worst rtt in ms
9+
Median float32 // median rtt in ms
910
Mean float32 // mean rtt in ms
1011
StdDev float32 // std deviation in ms
1112
}

0 commit comments

Comments
 (0)