refactor: portal protocol metrics

This commit is contained in:
Rafael Sampaio 2024-10-17 21:46:22 -03:00
parent d1b5606b00
commit efa2e9002a
2 changed files with 73 additions and 63 deletions

View file

@ -44,26 +44,6 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
var (
messagesReceivedAccept metrics.Meter
messagesReceivedNodes metrics.Meter
messagesReceivedFindNodes metrics.Meter
messagesReceivedFindContent metrics.Meter
messagesReceivedContent metrics.Meter
messagesReceivedOffer metrics.Meter
messagesReceivedPing metrics.Meter
messagesReceivedPong metrics.Meter
messagesSentAccept metrics.Meter
messagesSentNodes metrics.Meter
messagesSentFindNodes metrics.Meter
messagesSentFindContent metrics.Meter
messagesSentContent metrics.Meter
messagesSentOffer metrics.Meter
messagesSentPing metrics.Meter
messagesSentPong metrics.Meter
)
const ( const (
// TalkResp message is a response message so the session is established and a // TalkResp message is a response message so the session is established and a
@ -220,6 +200,8 @@ type PortalProtocol struct {
portMappingRegister chan *portMapping portMappingRegister chan *portMapping
clock mclock.Clock clock mclock.Clock
NAT nat.Interface NAT nat.Interface
portalMetrics *portalMetrics
} }
func defaultContentIdFunc(contentKey []byte) []byte { func defaultContentIdFunc(contentKey []byte) []byte {
@ -259,23 +241,7 @@ func NewPortalProtocol(config *PortalProtocolConfig, protocolId portalwire.Proto
} }
if metrics.Enabled { if metrics.Enabled {
messagesReceivedAccept = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/accept", nil) protocol.portalMetrics = newPortalMetrics(protocolId.Name())
messagesReceivedNodes = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/nodes", nil)
messagesReceivedFindNodes = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/find_nodes", nil)
messagesReceivedFindContent = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/find_content", nil)
messagesReceivedContent = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/content", nil)
messagesReceivedOffer = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/offer", nil)
messagesReceivedPing = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/ping", nil)
messagesReceivedPong = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/received/pong", nil)
messagesSentAccept = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/accept", nil)
messagesSentNodes = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/nodes", nil)
messagesSentFindNodes = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/find_nodes", nil)
messagesSentFindContent = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/find_content", nil)
messagesSentContent = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/content", nil)
messagesSentOffer = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/offer", nil)
messagesSentPing = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/ping", nil)
messagesSentPong = metrics.NewRegisteredMeter("portal/"+protocolId.Name()+"/sent/pong", nil)
} }
return protocol, nil return protocol, nil
@ -470,7 +436,7 @@ func (p *PortalProtocol) pingInner(node *enode.Node) (*portalwire.Pong, error) {
p.Log.Trace(">> PING/"+p.protocolName, "protocol", p.protocolName, "ip", p.Self().IP().String(), "source", p.Self().ID(), "target", node.ID(), "ping", pingRequest) p.Log.Trace(">> PING/"+p.protocolName, "protocol", p.protocolName, "ip", p.Self().IP().String(), "source", p.Self().ID(), "target", node.ID(), "ping", pingRequest)
if metrics.Enabled { if metrics.Enabled {
messagesSentPing.Mark(1) p.portalMetrics.messagesSentPing.Mark(1)
} }
pingRequestBytes, err := pingRequest.MarshalSSZ() pingRequestBytes, err := pingRequest.MarshalSSZ()
if err != nil { if err != nil {
@ -489,7 +455,7 @@ func (p *PortalProtocol) pingInner(node *enode.Node) (*portalwire.Pong, error) {
p.Log.Trace("<< PONG/"+p.protocolName, "source", p.Self().ID(), "target", node.ID(), "res", talkResp) p.Log.Trace("<< PONG/"+p.protocolName, "source", p.Self().ID(), "target", node.ID(), "res", talkResp)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedPong.Mark(1) p.portalMetrics.messagesReceivedPong.Mark(1)
} }
return p.processPong(node, talkResp) return p.processPong(node, talkResp)
@ -511,7 +477,7 @@ func (p *PortalProtocol) findNodes(node *enode.Node, distances []uint) ([]*enode
p.Log.Trace(">> FIND_NODES/"+p.protocolName, "id", node.ID(), "findNodes", findNodes) p.Log.Trace(">> FIND_NODES/"+p.protocolName, "id", node.ID(), "findNodes", findNodes)
if metrics.Enabled { if metrics.Enabled {
messagesSentFindNodes.Mark(1) p.portalMetrics.messagesSentFindNodes.Mark(1)
} }
findNodesBytes, err := findNodes.MarshalSSZ() findNodesBytes, err := findNodes.MarshalSSZ()
if err != nil { if err != nil {
@ -539,7 +505,7 @@ func (p *PortalProtocol) findContent(node *enode.Node, contentKey []byte) (byte,
p.Log.Trace(">> FIND_CONTENT/"+p.protocolName, "id", node.ID(), "findContent", findContent) p.Log.Trace(">> FIND_CONTENT/"+p.protocolName, "id", node.ID(), "findContent", findContent)
if metrics.Enabled { if metrics.Enabled {
messagesSentFindContent.Mark(1) p.portalMetrics.messagesSentFindContent.Mark(1)
} }
findContentBytes, err := findContent.MarshalSSZ() findContentBytes, err := findContent.MarshalSSZ()
if err != nil { if err != nil {
@ -569,7 +535,7 @@ func (p *PortalProtocol) offer(node *enode.Node, offerRequest *OfferRequest) ([]
p.Log.Trace(">> OFFER/"+p.protocolName, "offer", offer) p.Log.Trace(">> OFFER/"+p.protocolName, "offer", offer)
if metrics.Enabled { if metrics.Enabled {
messagesSentOffer.Mark(1) p.portalMetrics.messagesSentOffer.Mark(1)
} }
offerBytes, err := offer.MarshalSSZ() offerBytes, err := offer.MarshalSSZ()
if err != nil { if err != nil {
@ -610,7 +576,7 @@ func (p *PortalProtocol) processOffer(target *enode.Node, resp []byte, request *
p.Log.Trace("<< ACCEPT/"+p.protocolName, "id", target.ID(), "accept", accept) p.Log.Trace("<< ACCEPT/"+p.protocolName, "id", target.ID(), "accept", accept)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedAccept.Mark(1) p.portalMetrics.messagesReceivedAccept.Mark(1)
} }
isAdded := p.table.addFoundNode(target, true) isAdded := p.table.addFoundNode(target, true)
if isAdded { if isAdded {
@ -708,7 +674,7 @@ func (p *PortalProtocol) processOffer(target *enode.Node, resp []byte, request *
} }
p.Log.Trace(">> CONTENT/"+p.protocolName, "id", target.ID(), "contents", contents, "size", written) p.Log.Trace(">> CONTENT/"+p.protocolName, "id", target.ID(), "contents", contents, "size", written)
if metrics.Enabled { if metrics.Enabled {
messagesSentContent.Mark(1) p.portalMetrics.messagesSentContent.Mark(1)
} }
return return
} }
@ -740,7 +706,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
p.Log.Trace("<< CONTENT/"+p.protocolName, "id", target.ID(), "content", content) p.Log.Trace("<< CONTENT/"+p.protocolName, "id", target.ID(), "content", content)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedContent.Mark(1) p.portalMetrics.messagesReceivedContent.Mark(1)
} }
isAdded := p.table.addFoundNode(target, true) isAdded := p.table.addFoundNode(target, true)
if isAdded { if isAdded {
@ -758,7 +724,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
p.Log.Trace("<< CONTENT_CONNECTION_ID/"+p.protocolName, "id", target.ID(), "resp", common.Bytes2Hex(resp), "connIdMsg", connIdMsg) p.Log.Trace("<< CONTENT_CONNECTION_ID/"+p.protocolName, "id", target.ID(), "resp", common.Bytes2Hex(resp), "connIdMsg", connIdMsg)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedContent.Mark(1) p.portalMetrics.messagesReceivedContent.Mark(1)
} }
isAdded := p.table.addFoundNode(target, true) isAdded := p.table.addFoundNode(target, true)
if isAdded { if isAdded {
@ -798,7 +764,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
} }
p.Log.Trace("<< CONTENT/"+p.protocolName, "id", target.ID(), "size", len(data), "data", data) p.Log.Trace("<< CONTENT/"+p.protocolName, "id", target.ID(), "size", len(data), "data", data)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedContent.Mark(1) p.portalMetrics.messagesReceivedContent.Mark(1)
} }
return resp[1], data, nil return resp[1], data, nil
case portalwire.ContentEnrsSelector: case portalwire.ContentEnrsSelector:
@ -811,7 +777,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
p.Log.Trace("<< CONTENT_ENRS/"+p.protocolName, "id", target.ID(), "enrs", enrs) p.Log.Trace("<< CONTENT_ENRS/"+p.protocolName, "id", target.ID(), "enrs", enrs)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedContent.Mark(1) p.portalMetrics.messagesReceivedContent.Mark(1)
} }
isAdded := p.table.addFoundNode(target, true) isAdded := p.table.addFoundNode(target, true)
if isAdded { if isAdded {
@ -879,7 +845,7 @@ func (p *PortalProtocol) filterNodes(target *enode.Node, enrs [][]byte, distance
p.Log.Trace("<< NODES/"+p.protocolName, "id", target.ID(), "total", len(enrs), "verified", verified, "nodes", nodes) p.Log.Trace("<< NODES/"+p.protocolName, "id", target.ID(), "total", len(enrs), "verified", verified, "nodes", nodes)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedNodes.Mark(1) p.portalMetrics.messagesReceivedNodes.Mark(1)
} }
return nodes return nodes
} }
@ -899,7 +865,7 @@ func (p *PortalProtocol) processPong(target *enode.Node, resp []byte) (*portalwi
p.Log.Trace("<< PONG_RESPONSE/"+p.protocolName, "id", target.ID(), "pong", pong) p.Log.Trace("<< PONG_RESPONSE/"+p.protocolName, "id", target.ID(), "pong", pong)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedPong.Mark(1) p.portalMetrics.messagesReceivedPong.Mark(1)
} }
customPayload := &portalwire.PingPongCustomData{} customPayload := &portalwire.PingPongCustomData{}
@ -910,7 +876,7 @@ func (p *PortalProtocol) processPong(target *enode.Node, resp []byte) (*portalwi
p.Log.Trace("<< PONG_RESPONSE/"+p.protocolName, "id", target.ID(), "pong", pong, "customPayload", customPayload) p.Log.Trace("<< PONG_RESPONSE/"+p.protocolName, "id", target.ID(), "pong", pong, "customPayload", customPayload)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedPong.Mark(1) p.portalMetrics.messagesReceivedPong.Mark(1)
} }
isAdded := p.table.addFoundNode(target, true) isAdded := p.table.addFoundNode(target, true)
if isAdded { if isAdded {
@ -953,7 +919,7 @@ func (p *PortalProtocol) handleTalkRequest(id enode.ID, addr *net.UDPAddr, msg [
p.Log.Trace("<< PING/"+p.protocolName, "protocol", p.protocolName, "source", id, "pingRequest", pingRequest) p.Log.Trace("<< PING/"+p.protocolName, "protocol", p.protocolName, "source", id, "pingRequest", pingRequest)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedPing.Mark(1) p.portalMetrics.messagesReceivedPing.Mark(1)
} }
resp, err := p.handlePing(id, pingRequest) resp, err := p.handlePing(id, pingRequest)
if err != nil { if err != nil {
@ -972,7 +938,7 @@ func (p *PortalProtocol) handleTalkRequest(id enode.ID, addr *net.UDPAddr, msg [
p.Log.Trace("<< FIND_NODES/"+p.protocolName, "protocol", p.protocolName, "source", id, "findNodesRequest", findNodesRequest) p.Log.Trace("<< FIND_NODES/"+p.protocolName, "protocol", p.protocolName, "source", id, "findNodesRequest", findNodesRequest)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedFindNodes.Mark(1) p.portalMetrics.messagesReceivedFindNodes.Mark(1)
} }
resp, err := p.handleFindNodes(addr, findNodesRequest) resp, err := p.handleFindNodes(addr, findNodesRequest)
if err != nil { if err != nil {
@ -991,7 +957,7 @@ func (p *PortalProtocol) handleTalkRequest(id enode.ID, addr *net.UDPAddr, msg [
p.Log.Trace("<< FIND_CONTENT/"+p.protocolName, "protocol", p.protocolName, "source", id, "findContentRequest", findContentRequest) p.Log.Trace("<< FIND_CONTENT/"+p.protocolName, "protocol", p.protocolName, "source", id, "findContentRequest", findContentRequest)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedFindContent.Mark(1) p.portalMetrics.messagesReceivedFindContent.Mark(1)
} }
resp, err := p.handleFindContent(id, addr, findContentRequest) resp, err := p.handleFindContent(id, addr, findContentRequest)
if err != nil { if err != nil {
@ -1010,7 +976,7 @@ func (p *PortalProtocol) handleTalkRequest(id enode.ID, addr *net.UDPAddr, msg [
p.Log.Trace("<< OFFER/"+p.protocolName, "protocol", p.protocolName, "source", id, "offerRequest", offerRequest) p.Log.Trace("<< OFFER/"+p.protocolName, "protocol", p.protocolName, "source", id, "offerRequest", offerRequest)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedOffer.Mark(1) p.portalMetrics.messagesReceivedOffer.Mark(1)
} }
resp, err := p.handleOffer(id, addr, offerRequest) resp, err := p.handleOffer(id, addr, offerRequest)
if err != nil { if err != nil {
@ -1054,7 +1020,7 @@ func (p *PortalProtocol) handlePing(id enode.ID, ping *portalwire.Ping) ([]byte,
p.Log.Trace(">> PONG/"+p.protocolName, "protocol", p.protocolName, "source", id, "pong", pong) p.Log.Trace(">> PONG/"+p.protocolName, "protocol", p.protocolName, "source", id, "pong", pong)
if metrics.Enabled { if metrics.Enabled {
messagesSentPong.Mark(1) p.portalMetrics.messagesSentPong.Mark(1)
} }
pongBytes, err := pong.MarshalSSZ() pongBytes, err := pong.MarshalSSZ()
@ -1090,7 +1056,7 @@ func (p *PortalProtocol) handleFindNodes(fromAddr *net.UDPAddr, request *portalw
p.Log.Trace(">> NODES/"+p.protocolName, "protocol", p.protocolName, "source", fromAddr, "nodes", nodesMsg) p.Log.Trace(">> NODES/"+p.protocolName, "protocol", p.protocolName, "source", fromAddr, "nodes", nodesMsg)
if metrics.Enabled { if metrics.Enabled {
messagesSentNodes.Mark(1) p.portalMetrics.messagesSentNodes.Mark(1)
} }
nodesMsgBytes, err := nodesMsg.MarshalSSZ() nodesMsgBytes, err := nodesMsg.MarshalSSZ()
if err != nil { if err != nil {
@ -1144,7 +1110,7 @@ func (p *PortalProtocol) handleFindContent(id enode.ID, addr *net.UDPAddr, reque
p.Log.Trace(">> CONTENT_ENRS/"+p.protocolName, "protocol", p.protocolName, "source", addr, "enrs", enrsMsg) p.Log.Trace(">> CONTENT_ENRS/"+p.protocolName, "protocol", p.protocolName, "source", addr, "enrs", enrsMsg)
if metrics.Enabled { if metrics.Enabled {
messagesSentContent.Mark(1) p.portalMetrics.messagesSentContent.Mark(1)
} }
var enrsMsgBytes []byte var enrsMsgBytes []byte
enrsMsgBytes, err = enrsMsg.MarshalSSZ() enrsMsgBytes, err = enrsMsg.MarshalSSZ()
@ -1168,7 +1134,7 @@ func (p *PortalProtocol) handleFindContent(id enode.ID, addr *net.UDPAddr, reque
p.Log.Trace(">> CONTENT_RAW/"+p.protocolName, "protocol", p.protocolName, "source", addr, "content", rawContentMsg) p.Log.Trace(">> CONTENT_RAW/"+p.protocolName, "protocol", p.protocolName, "source", addr, "content", rawContentMsg)
if metrics.Enabled { if metrics.Enabled {
messagesSentContent.Mark(1) p.portalMetrics.messagesSentContent.Mark(1)
} }
var rawContentMsgBytes []byte var rawContentMsgBytes []byte
@ -1244,7 +1210,7 @@ func (p *PortalProtocol) handleFindContent(id enode.ID, addr *net.UDPAddr, reque
p.Log.Trace(">> CONTENT_CONNECTION_ID/"+p.protocolName, "protocol", p.protocolName, "source", addr, "connId", connIdMsg) p.Log.Trace(">> CONTENT_CONNECTION_ID/"+p.protocolName, "protocol", p.protocolName, "source", addr, "connId", connIdMsg)
if metrics.Enabled { if metrics.Enabled {
messagesSentContent.Mark(1) p.portalMetrics.messagesSentContent.Mark(1)
} }
var connIdMsgBytes []byte var connIdMsgBytes []byte
connIdMsgBytes, err = connIdMsg.MarshalSSZ() connIdMsgBytes, err = connIdMsg.MarshalSSZ()
@ -1275,7 +1241,7 @@ func (p *PortalProtocol) handleOffer(id enode.ID, addr *net.UDPAddr, request *po
p.Log.Trace(">> ACCEPT/"+p.protocolName, "protocol", p.protocolName, "source", addr, "accept", acceptMsg) p.Log.Trace(">> ACCEPT/"+p.protocolName, "protocol", p.protocolName, "source", addr, "accept", acceptMsg)
if metrics.Enabled { if metrics.Enabled {
messagesSentAccept.Mark(1) p.portalMetrics.messagesSentAccept.Mark(1)
} }
var acceptMsgBytes []byte var acceptMsgBytes []byte
acceptMsgBytes, err = acceptMsg.MarshalSSZ() acceptMsgBytes, err = acceptMsg.MarshalSSZ()
@ -1353,7 +1319,7 @@ func (p *PortalProtocol) handleOffer(id enode.ID, addr *net.UDPAddr, request *po
} }
p.Log.Trace("<< OFFER_CONTENT/"+p.protocolName, "id", id, "size", len(data), "data", data) p.Log.Trace("<< OFFER_CONTENT/"+p.protocolName, "id", id, "size", len(data), "data", data)
if metrics.Enabled { if metrics.Enabled {
messagesReceivedContent.Mark(1) p.portalMetrics.messagesReceivedContent.Mark(1)
} }
err = p.handleOfferedContents(id, contentKeys, data) err = p.handleOfferedContents(id, contentKeys, data)
@ -1379,7 +1345,7 @@ func (p *PortalProtocol) handleOffer(id enode.ID, addr *net.UDPAddr, request *po
p.Log.Trace(">> ACCEPT/"+p.protocolName, "protocol", p.protocolName, "source", addr, "accept", acceptMsg) p.Log.Trace(">> ACCEPT/"+p.protocolName, "protocol", p.protocolName, "source", addr, "accept", acceptMsg)
if metrics.Enabled { if metrics.Enabled {
messagesSentAccept.Mark(1) p.portalMetrics.messagesSentAccept.Mark(1)
} }
var acceptMsgBytes []byte var acceptMsgBytes []byte
acceptMsgBytes, err = acceptMsg.MarshalSSZ() acceptMsgBytes, err = acceptMsg.MarshalSSZ()

View file

@ -0,0 +1,44 @@
package discover
import "github.com/ethereum/go-ethereum/metrics"
type portalMetrics struct {
messagesReceivedAccept metrics.Meter
messagesReceivedNodes metrics.Meter
messagesReceivedFindNodes metrics.Meter
messagesReceivedFindContent metrics.Meter
messagesReceivedContent metrics.Meter
messagesReceivedOffer metrics.Meter
messagesReceivedPing metrics.Meter
messagesReceivedPong metrics.Meter
messagesSentAccept metrics.Meter
messagesSentNodes metrics.Meter
messagesSentFindNodes metrics.Meter
messagesSentFindContent metrics.Meter
messagesSentContent metrics.Meter
messagesSentOffer metrics.Meter
messagesSentPing metrics.Meter
messagesSentPong metrics.Meter
}
func newPortalMetrics(protocolName string) *portalMetrics {
return &portalMetrics{
messagesReceivedAccept: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/accept", nil),
messagesReceivedNodes: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/nodes", nil),
messagesReceivedFindNodes: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/find_nodes", nil),
messagesReceivedFindContent: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/find_content", nil),
messagesReceivedContent: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/content", nil),
messagesReceivedOffer: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/offer", nil),
messagesReceivedPing: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/ping", nil),
messagesReceivedPong: metrics.NewRegisteredMeter("portal/"+protocolName+"/received/pong", nil),
messagesSentAccept: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/accept", nil),
messagesSentNodes: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/nodes", nil),
messagesSentFindNodes: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/find_nodes", nil),
messagesSentFindContent: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/find_content", nil),
messagesSentContent: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/content", nil),
messagesSentOffer: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/offer", nil),
messagesSentPing: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/ping", nil),
messagesSentPong: metrics.NewRegisteredMeter("portal/"+protocolName+"/sent/pong", nil),
}
}