github.com/status-im/status-go@v1.1.0/metrics/node/metrics.go (about) 1 package node 2 3 import ( 4 "errors" 5 "strings" 6 7 "github.com/ethereum/go-ethereum/node" 8 "github.com/ethereum/go-ethereum/p2p" 9 10 prom "github.com/prometheus/client_golang/prometheus" 11 ) 12 13 var ( 14 nodePeersGauge = prom.NewGaugeVec(prom.GaugeOpts{ 15 Name: "p2p_peers_count", 16 Help: "Current numbers of peers split by name.", 17 }, []string{"type", "version", "platform"}) 18 nodePeersAbsolute = prom.NewGauge(prom.GaugeOpts{ 19 Name: "p2p_peers_absolute", 20 Help: "Absolute number of connected peers.", 21 }) 22 nodeMaxPeersGauge = prom.NewGauge(prom.GaugeOpts{ 23 Name: "p2p_peers_max", 24 Help: "Maximum number of peers that can connect.", 25 }) 26 ) 27 28 func init() { 29 prom.MustRegister(nodePeersGauge) 30 prom.MustRegister(nodePeersAbsolute) 31 prom.MustRegister(nodeMaxPeersGauge) 32 } 33 34 func updateNodeMetrics(node *node.Node, evType p2p.PeerEventType) error { 35 server := node.Server() 36 if server == nil { 37 return errors.New("p2p server is unavailable") 38 } 39 40 calculatePeerCounts(server) 41 nodePeersAbsolute.Set(float64(server.PeerCount())) 42 nodeMaxPeersGauge.Set(float64(server.MaxPeers)) 43 44 return nil 45 } 46 47 func labelsFromNodeName(name string) (prom.Labels, error) { 48 tokens := strings.Split(name, "/") 49 if len(tokens) == 4 { 50 return prom.Labels{ 51 "type": tokens[0], 52 "version": tokens[1], 53 "platform": tokens[2], 54 }, nil 55 } else if len(tokens) == 3 { 56 return prom.Labels{ 57 "type": tokens[0], 58 "version": "unknown", 59 "platform": tokens[1], 60 }, nil 61 } else { 62 return nil, errors.New("wrong number of segments in name") 63 } 64 } 65 66 func calculatePeerCounts(server *p2p.Server) { 67 peers := server.Peers() 68 /* necessary to count all peers anew */ 69 nodePeersGauge.Reset() 70 71 for _, p := range peers { 72 labels, err := labelsFromNodeName(p.Fullname()) 73 if err != nil { 74 logger.Warn("failed parsing peer name", "error", err, "name", p.Name()) 75 continue 76 } 77 nodePeersGauge.With(labels).Inc() 78 } 79 }