Skip to content

Commit 2550e46

Browse files
committed
eth/protocols, metrics: use resetting histograms for rare packets
1 parent efe0229 commit 2550e46

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

eth/protocols/eth/handler.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,11 @@ func handleMessage(backend Backend, peer *Peer) error {
246246
if metrics.Enabled {
247247
h := fmt.Sprintf("%s/%s/%d/%#02x", p2p.HandleHistName, ProtocolName, peer.Version(), msg.Code)
248248
defer func(start time.Time) {
249-
sampler := func() metrics.Sample { return metrics.NewExpDecaySample(1028, 0.015) }
249+
sampler := func() metrics.Sample {
250+
return metrics.ResettingSample(
251+
metrics.NewExpDecaySample(1028, 0.015),
252+
)
253+
}
250254
metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(time.Since(start).Microseconds())
251255
}(time.Now())
252256
}

eth/protocols/snap/handler.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ func handleMessage(backend Backend, peer *Peer) error {
134134
if metrics.Enabled {
135135
h := fmt.Sprintf("%s/%s/%d/%#02x", p2p.HandleHistName, ProtocolName, peer.Version(), msg.Code)
136136
defer func(start time.Time) {
137-
sampler := func() metrics.Sample { return metrics.NewExpDecaySample(1028, 0.015) }
137+
sampler := func() metrics.Sample {
138+
return metrics.ResettingSample(
139+
metrics.NewExpDecaySample(1028, 0.015),
140+
)
141+
}
138142
metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(time.Since(start).Microseconds())
139143
}(time.Now())
140144
}

metrics/resetting_sample.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package metrics
2+
3+
// ResettingSample converts an ordinary sample into one that resets whenever its
4+
// snapshot is retrieved. This will break for multi-monitor systems, but when only
5+
// a single metric is being pushed out, this ensure that low-frequency events don't
6+
// skew th charts indefinitely.
7+
func ResettingSample(sample Sample) Sample {
8+
return &resettingSample{
9+
Sample: sample,
10+
}
11+
}
12+
13+
// resettingSample is a simple wrapper around a sample that resets it upon the
14+
// snapshot retrieval.
15+
type resettingSample struct {
16+
Sample
17+
}
18+
19+
// Snapshot returns a read-only copy of the sample with the original reset.
20+
func (rs *resettingSample) Snapshot() Sample {
21+
s := rs.Sample.Snapshot()
22+
rs.Sample.Clear()
23+
return s
24+
}

0 commit comments

Comments
 (0)