diff --git a/p2p/discv5/metrics.go b/p2p/discv5/metrics.go
new file mode 100644
index 0000000000000000000000000000000000000000..cb11d7eacf07a0393e1dd1685324d4e56c661784
--- /dev/null
+++ b/p2p/discv5/metrics.go
@@ -0,0 +1,8 @@
+package discv5
+
+import "github.com/ethereum/go-ethereum/metrics"
+
+var (
+	ingressTrafficMeter = metrics.NewRegisteredMeter("discv5/InboundTraffic", nil)
+	egressTrafficMeter  = metrics.NewRegisteredMeter("discv5/OutboundTraffic", nil)
+)
diff --git a/p2p/discv5/udp.go b/p2p/discv5/udp.go
index 09e5f8b37409c3ad60565127bb9961844c4e33ac..49e1cb811ad5ad644b6d9e3c9c4bad5926077ebc 100644
--- a/p2p/discv5/udp.go
+++ b/p2p/discv5/udp.go
@@ -334,8 +334,10 @@ func (t *udp) sendPacket(toid NodeID, toaddr *net.UDPAddr, ptype byte, req inter
 		return hash, err
 	}
 	log.Trace(fmt.Sprintf(">>> %v to %x@%v", nodeEvent(ptype), toid[:8], toaddr))
-	if _, err = t.conn.WriteToUDP(packet, toaddr); err != nil {
+	if nbytes, err := t.conn.WriteToUDP(packet, toaddr); err != nil {
 		log.Trace(fmt.Sprint("UDP send failed:", err))
+	} else {
+		egressTrafficMeter.Mark(int64(nbytes))
 	}
 	//fmt.Println(err)
 	return hash, err
@@ -374,6 +376,7 @@ func (t *udp) readLoop() {
 	buf := make([]byte, 1280)
 	for {
 		nbytes, from, err := t.conn.ReadFromUDP(buf)
+		ingressTrafficMeter.Mark(int64(nbytes))
 		if netutil.IsTemporaryError(err) {
 			// Ignore temporary read errors.
 			log.Debug(fmt.Sprintf("Temporary read error: %v", err))