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