eth/protocols, metrics, p2p: add handler performance metrics
This commit is contained in:
parent
54c0d573d7
commit
6d7ff6acea
|
@ -24,6 +24,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
"github.com/ethereum/go-ethereum/metrics"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
|
@ -241,7 +242,14 @@ func handleMessage(backend Backend, peer *Peer) error {
|
||||||
} else if peer.Version() >= ETH66 {
|
} else if peer.Version() >= ETH66 {
|
||||||
handlers = eth66
|
handlers = eth66
|
||||||
}
|
}
|
||||||
|
// Track the emount of time it takes to serve the request and run the handler
|
||||||
|
if metrics.Enabled {
|
||||||
|
h := fmt.Sprintf("%s/%s/%d/%#02x", p2p.HandleHistName, ProtocolName, peer.Version(), msg.Code)
|
||||||
|
defer func(start time.Time) {
|
||||||
|
sampler := func() metrics.Sample { return metrics.NewExpDecaySample(1028, 0.015) }
|
||||||
|
metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(time.Since(start).Microseconds())
|
||||||
|
}(time.Now())
|
||||||
|
}
|
||||||
if handler := handlers[msg.Code]; handler != nil {
|
if handler := handlers[msg.Code]; handler != nil {
|
||||||
return handler(backend, msg, peer)
|
return handler(backend, msg, peer)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,12 +19,14 @@ package snap
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/light"
|
"github.com/ethereum/go-ethereum/light"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/ethereum/go-ethereum/metrics"
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
|
@ -128,6 +130,14 @@ func handleMessage(backend Backend, peer *Peer) error {
|
||||||
}
|
}
|
||||||
defer msg.Discard()
|
defer msg.Discard()
|
||||||
|
|
||||||
|
// Track the emount of time it takes to serve the request and run the handler
|
||||||
|
if metrics.Enabled {
|
||||||
|
h := fmt.Sprintf("%s/%s/%d/%#02x", p2p.HandleHistName, ProtocolName, peer.Version(), msg.Code)
|
||||||
|
defer func(start time.Time) {
|
||||||
|
sampler := func() metrics.Sample { return metrics.NewExpDecaySample(1028, 0.015) }
|
||||||
|
metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(time.Since(start).Microseconds())
|
||||||
|
}(time.Now())
|
||||||
|
}
|
||||||
// Handle the message depending on its contents
|
// Handle the message depending on its contents
|
||||||
switch {
|
switch {
|
||||||
case msg.Code == GetAccountRangeMsg:
|
case msg.Code == GetAccountRangeMsg:
|
||||||
|
|
|
@ -26,6 +26,15 @@ func GetOrRegisterHistogram(name string, r Registry, s Sample) Histogram {
|
||||||
return r.GetOrRegister(name, func() Histogram { return NewHistogram(s) }).(Histogram)
|
return r.GetOrRegister(name, func() Histogram { return NewHistogram(s) }).(Histogram)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetOrRegisterHistogramLazy returns an existing Histogram or constructs and
|
||||||
|
// registers a new StandardHistogram.
|
||||||
|
func GetOrRegisterHistogramLazy(name string, r Registry, s func() Sample) Histogram {
|
||||||
|
if nil == r {
|
||||||
|
r = DefaultRegistry
|
||||||
|
}
|
||||||
|
return r.GetOrRegister(name, func() Histogram { return NewHistogram(s()) }).(Histogram)
|
||||||
|
}
|
||||||
|
|
||||||
// NewHistogram constructs a new StandardHistogram from a Sample.
|
// NewHistogram constructs a new StandardHistogram from a Sample.
|
||||||
func NewHistogram(s Sample) Histogram {
|
func NewHistogram(s Sample) Histogram {
|
||||||
if !Enabled {
|
if !Enabled {
|
||||||
|
|
|
@ -25,8 +25,17 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// ingressMeterName is the prefix of the per-packet inbound metrics.
|
||||||
ingressMeterName = "p2p/ingress"
|
ingressMeterName = "p2p/ingress"
|
||||||
|
|
||||||
|
// egressMeterName is the prefix of the per-packet outbound metrics.
|
||||||
egressMeterName = "p2p/egress"
|
egressMeterName = "p2p/egress"
|
||||||
|
|
||||||
|
// HandleHistName is the prefix of the per-packet serving time histograms.
|
||||||
|
HandleHistName = "p2p/handle"
|
||||||
|
|
||||||
|
// WaitHistName is the prefix of the per-packet (req only) waiting time histograms.
|
||||||
|
WaitHistName = "p2p/wait"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
Loading…
Reference in New Issue