diff --git a/internal/p2p/metrics.go b/internal/p2p/metrics.go index 2780d221e..5ee053f1a 100644 --- a/internal/p2p/metrics.go +++ b/internal/p2p/metrics.go @@ -28,7 +28,10 @@ var ( // Metrics contains metrics exposed by this package. type Metrics struct { // Number of peers. - Peers metrics.Gauge + Peers metrics.Gauge + PeersStored metrics.Gauge + PeersInactivated metrics.Gauge + // Number of bytes received from a given peer. PeerReceiveBytesTotal metrics.Counter // Number of bytes sent to a given peer. @@ -75,7 +78,18 @@ func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { Name: "peers", Help: "Number of peers.", }, labels).With(labelsAndValues...), - + PeersStored: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "peers_stored", + Help: "Number of peers in the peer Store", + }, labels).With(labelsAndValues...), + PeersInactivated: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: MetricsSubsystem, + Name: "peers_inactivated", + Help: "Number of peers inactivated", + }, labels).With(labelsAndValues...), PeerReceiveBytesTotal: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ Namespace: namespace, Subsystem: MetricsSubsystem, diff --git a/internal/p2p/peermanager.go b/internal/p2p/peermanager.go index 15d07679a..6ddf5866f 100644 --- a/internal/p2p/peermanager.go +++ b/internal/p2p/peermanager.go @@ -163,6 +163,9 @@ type PeerManagerOptions struct { // persistentPeers provides fast PersistentPeers lookups. It is built // by optimize(). persistentPeers map[types.NodeID]bool + + // Peer Metrics + Metrics *Metrics } // Validate validates the options. @@ -400,6 +403,7 @@ func (m *PeerManager) prunePeers() error { if err := m.store.Delete(peerID); err != nil { return err } + m.options.Metrics.PeersStored.Add(-1) } } return nil @@ -437,6 +441,8 @@ func (m *PeerManager) Add(address NodeAddress) (bool, error) { if err := m.store.Set(peer); err != nil { return false, err } + + m.options.Metrics.PeersStored.Add(1) if err := m.prunePeers(); err != nil { return true, err } @@ -614,7 +620,11 @@ func (m *PeerManager) Dialed(address NodeAddress) error { return fmt.Errorf("peer %q was removed while dialing", address.NodeID) } now := time.Now().UTC() + if peer.Inactive { + m.options.Metrics.PeersInactivated.Add(-1) + } peer.Inactive = false + peer.LastConnected = now if addressInfo, ok := peer.AddressInfo[address]; ok { addressInfo.DialFailures = 0 @@ -835,7 +845,7 @@ func (m *PeerManager) Inactivate(peerID types.NodeID) error { } peer.Inactive = true - + m.options.Metrics.PeersInactivated.Add(1) return m.store.Set(*peer) } diff --git a/node/node.go b/node/node.go index 01a89c784..44377338d 100644 --- a/node/node.go +++ b/node/node.go @@ -265,7 +265,7 @@ func makeNode(cfg *config.Config, p2pLogger := logger.With("module", "p2p") transport := createTransport(p2pLogger, cfg) - peerManager, peerCloser, err := createPeerManager(cfg, dbProvider, p2pLogger, nodeKey.ID) + peerManager, peerCloser, err := createPeerManager(cfg, dbProvider, p2pLogger, nodeKey.ID, nodeMetrics.p2p) closers = append(closers, peerCloser) if err != nil { return nil, combineCloseError( diff --git a/node/setup.go b/node/setup.go index 915de7114..76648b598 100644 --- a/node/setup.go +++ b/node/setup.go @@ -457,6 +457,7 @@ func createPeerManager( dbProvider config.DBProvider, p2pLogger log.Logger, nodeID types.NodeID, + metrics *p2p.Metrics, ) (*p2p.PeerManager, closer, error) { selfAddr, err := p2p.ParseNodeAddress(nodeID.AddressString(cfg.P2P.ExternalAddress)) @@ -504,6 +505,7 @@ func createPeerManager( MaxRetryTimePersistent: 5 * time.Minute, RetryTimeJitter: 5 * time.Second, PrivatePeers: privatePeerIDs, + Metrics: metrics, } peers := []p2p.NodeAddress{}