Skip to content

Commit c4dab8c

Browse files
authored
Merge pull request ethereum#25044 from karalabe/rpc-histograms
rpc: swap out timer metrics to histograms
2 parents 138f0d7 + 106a162 commit c4dab8c

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

rpc/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage
346346
successfulRequestGauge.Inc(1)
347347
}
348348
rpcServingTimer.UpdateSince(start)
349-
newRPCServingTimer(msg.Method, answer.Error == nil).UpdateSince(start)
349+
updateServeTimeHistogram(msg.Method, answer.Error == nil, time.Since(start))
350350
}
351351
return answer
352352
}

rpc/metrics.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package rpc
1818

1919
import (
2020
"fmt"
21+
"time"
2122

2223
"github.com/ethereum/go-ethereum/metrics"
2324
)
@@ -26,14 +27,24 @@ var (
2627
rpcRequestGauge = metrics.NewRegisteredGauge("rpc/requests", nil)
2728
successfulRequestGauge = metrics.NewRegisteredGauge("rpc/success", nil)
2829
failedRequestGauge = metrics.NewRegisteredGauge("rpc/failure", nil)
29-
rpcServingTimer = metrics.NewRegisteredTimer("rpc/duration/all", nil)
30+
31+
// serveTimeHistName is the prefix of the per-request serving time histograms.
32+
serveTimeHistName = "rpc/duration"
33+
34+
rpcServingTimer = metrics.NewRegisteredTimer("rpc/duration/all", nil)
3035
)
3136

32-
func newRPCServingTimer(method string, valid bool) metrics.Timer {
33-
flag := "success"
34-
if !valid {
35-
flag = "failure"
37+
// updateServeTimeHistogram tracks the serving time of a remote RPC call.
38+
func updateServeTimeHistogram(method string, success bool, elapsed time.Duration) {
39+
note := "success"
40+
if !success {
41+
note = "failure"
42+
}
43+
h := fmt.Sprintf("%s/%s/%s", serveTimeHistName, method, note)
44+
sampler := func() metrics.Sample {
45+
return metrics.ResettingSample(
46+
metrics.NewExpDecaySample(1028, 0.015),
47+
)
3648
}
37-
m := fmt.Sprintf("rpc/duration/%s/%s", method, flag)
38-
return metrics.GetOrRegisterTimer(m, nil)
49+
metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(elapsed.Microseconds())
3950
}

0 commit comments

Comments
 (0)