diff --git a/eth/protocols/eth/handler.go b/eth/protocols/eth/handler.go
index 64648ed4192c2d7cab75fe4b6ebf353aebe42552..de5a38dcce98fb63237629a9d33e1fcb4735f979 100644
--- a/eth/protocols/eth/handler.go
+++ b/eth/protocols/eth/handler.go
@@ -24,6 +24,7 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"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/enode"
 	"github.com/ethereum/go-ethereum/p2p/enr"
@@ -241,7 +242,14 @@ func handleMessage(backend Backend, peer *Peer) error {
 	} else if peer.Version() >= 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 {
 		return handler(backend, msg, peer)
 	}
diff --git a/eth/protocols/snap/handler.go b/eth/protocols/snap/handler.go
index 37e84839aba668b369246ee022d570aa4dad939d..6622cd871803155f105a04711046dfaf2e1220f8 100644
--- a/eth/protocols/snap/handler.go
+++ b/eth/protocols/snap/handler.go
@@ -19,12 +19,14 @@ package snap
 import (
 	"bytes"
 	"fmt"
+	"time"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/state"
 	"github.com/ethereum/go-ethereum/light"
 	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/metrics"
 	"github.com/ethereum/go-ethereum/p2p"
 	"github.com/ethereum/go-ethereum/p2p/enode"
 	"github.com/ethereum/go-ethereum/p2p/enr"
@@ -128,6 +130,14 @@ func handleMessage(backend Backend, peer *Peer) error {
 	}
 	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
 	switch {
 	case msg.Code == GetAccountRangeMsg:
diff --git a/metrics/histogram.go b/metrics/histogram.go
index 46f3bbd2f138bf09c44d6d1f3c034d94ad568acf..2c54ce8b4063e06109bd07868ed54b7e8dbd2aa3 100644
--- a/metrics/histogram.go
+++ b/metrics/histogram.go
@@ -26,6 +26,15 @@ func GetOrRegisterHistogram(name string, r Registry, s Sample) 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.
 func NewHistogram(s Sample) Histogram {
 	if !Enabled {
diff --git a/p2p/metrics.go b/p2p/metrics.go
index 44946473fa6f86da5b231b71b5271bf626d4f463..be0d2f495e6d4d3a1886f6cbaeb0a0c076ca7ec6 100644
--- a/p2p/metrics.go
+++ b/p2p/metrics.go
@@ -25,8 +25,17 @@ import (
 )
 
 const (
+	// ingressMeterName is the prefix of the per-packet inbound metrics.
 	ingressMeterName = "p2p/ingress"
-	egressMeterName  = "p2p/egress"
+
+	// egressMeterName is the prefix of the per-packet outbound metrics.
+	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 (