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  }