monero-exporter/pkg/collector/collector_peers.go

101 lines
1.9 KiB
Go

package collector
import (
"context"
"fmt"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/cirocosta/go-monero/pkg/rpc/daemon"
)
type PeersCollector struct {
client *daemon.Client
metricsC chan<- prometheus.Metric
graylist []daemon.Peer
whitelist []daemon.Peer
}
var _ CustomCollector = (*PeersCollector)(nil)
func NewPeersCollector(
client *daemon.Client, metricsC chan<- prometheus.Metric,
) *PeersCollector {
return &PeersCollector{
client: client,
metricsC: metricsC,
}
}
func (c *PeersCollector) Name() string {
return "peerlist"
}
func (c *PeersCollector) Collect(ctx context.Context) error {
err := c.fetchData(ctx)
if err != nil {
return fmt.Errorf("fetch data: %w", err)
}
c.collectPeersCount()
c.collectPeersLastSeen()
return nil
}
func (c *PeersCollector) fetchData(ctx context.Context) error {
resp, err := c.client.GetPeerList(ctx)
if err != nil {
return fmt.Errorf("get peerlist: %w", err)
}
c.graylist = resp.GrayList
c.whitelist = resp.WhiteList
return nil
}
func (c *PeersCollector) collectPeersCount() {
desc := prometheus.NewDesc(
"monero_peerlist",
"number of node entries in the peerlist",
[]string{"type"}, nil,
)
c.metricsC <- prometheus.MustNewConstMetric(
desc,
prometheus.GaugeValue,
float64(len(c.whitelist)),
"white",
)
c.metricsC <- prometheus.MustNewConstMetric(
desc,
prometheus.GaugeValue,
float64(len(c.graylist)),
"gray",
)
}
func (c *PeersCollector) collectPeersLastSeen() {
now := time.Now()
summary := NewSummary()
for _, peer := range c.whitelist {
summary.Insert(now.
Sub(time.Unix(peer.LastSeen, 0)).
Seconds())
}
c.metricsC <- prometheus.MustNewConstSummary(
prometheus.NewDesc(
"monero_peerlist_lastseen",
"distribution of when our peers have been seen",
nil, nil,
),
summary.Count(), summary.Sum(), summary.Quantiles(),
)
}