@@ -18,6 +18,7 @@ package rpc
1818
1919import (
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