Skip to content

Commit fa2adc8

Browse files
committed
add dao data to metrics
1 parent ae45872 commit fa2adc8

7 files changed

Lines changed: 168 additions & 7 deletions

File tree

rocketpool/metrics/auction.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ func startAuctionMetricsProcess(c *cli.Context, interval time.Duration, logger l
4444
if p != nil && err == nil {
4545
break;
4646
}
47-
logger.Printlnf("minipoolMetricsProcess retry loop: %w", err)
4847
}
49-
logger.Printlnf("minipoolMetricsProcess created")
5048

5149
// Update metrics on interval
5250
for ; true; <- timer.C {
@@ -146,4 +144,3 @@ func (p *auctionMetricsProcess) updateMetrics() error {
146144
return nil
147145
}
148146

149-

rocketpool/metrics/dao.go

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package metrics
2+
3+
import (
4+
"time"
5+
6+
"github.com/prometheus/client_golang/prometheus"
7+
"github.com/prometheus/client_golang/prometheus/promauto"
8+
"github.com/urfave/cli"
9+
"golang.org/x/sync/errgroup"
10+
11+
"github.com/rocket-pool/rocketpool-go/dao"
12+
"github.com/rocket-pool/rocketpool-go/dao/trustednode"
13+
"github.com/rocket-pool/rocketpool-go/rocketpool"
14+
"github.com/rocket-pool/rocketpool-go/types"
15+
"github.com/rocket-pool/smartnode/shared/services"
16+
"github.com/rocket-pool/smartnode/shared/utils/log"
17+
)
18+
19+
// minipool metrics process
20+
type daoGauges struct {
21+
memberCount prometheus.Gauge
22+
proposalCount prometheus.Gauge
23+
proposalStateCount *prometheus.GaugeVec
24+
}
25+
26+
27+
type daoMetricsProcess struct {
28+
rp *rocketpool.RocketPool
29+
metrics daoGauges
30+
logger log.ColorLogger
31+
}
32+
33+
34+
// Start minipool metrics process
35+
func startDaoMetricsProcess(c *cli.Context, interval time.Duration, logger log.ColorLogger) {
36+
37+
logger.Printlnf("Enter startDaoMetricsProcess")
38+
timer := time.NewTicker(interval)
39+
var p *daoMetricsProcess
40+
var err error
41+
// put create process in a loop because it may fail initially
42+
for ; true; <- timer.C {
43+
p, err = newDaoMetricsProcss(c, logger)
44+
if p != nil && err == nil {
45+
break;
46+
}
47+
}
48+
49+
// Update metrics on interval
50+
for ; true; <- timer.C {
51+
err = p.updateMetrics()
52+
if err != nil {
53+
// print error here instead of exit
54+
logger.Printlnf("Error in updateMetrics: %w", err)
55+
}
56+
}
57+
logger.Printlnf("Exit startDaoMetricsProcess")
58+
}
59+
60+
61+
// Create new minipoolMetricsProcss object
62+
func newDaoMetricsProcss(c *cli.Context, logger log.ColorLogger) (*daoMetricsProcess, error) {
63+
64+
// Get services
65+
if err := services.RequireRocketStorage(c); err != nil { return nil, err }
66+
if err := services.RequireBeaconClientSynced(c); err != nil { return nil, err }
67+
rp, err := services.GetRocketPool(c)
68+
if err != nil { return nil, err }
69+
70+
// Initialise metrics
71+
metrics := daoGauges {
72+
memberCount: promauto.NewGauge(prometheus.GaugeOpts{
73+
Namespace: "rocketpool",
74+
Subsystem: "dao",
75+
Name: "member_count",
76+
Help: "number of members in Rocket Pool dao",
77+
}),
78+
proposalCount: promauto.NewGauge(prometheus.GaugeOpts{
79+
Namespace: "rocketpool",
80+
Subsystem: "dao",
81+
Name: "proposal_count",
82+
Help: "number of proposals in Rocket Pool dao",
83+
}),
84+
proposalStateCount: promauto.NewGaugeVec(
85+
prometheus.GaugeOpts{
86+
Namespace: "rocketpool",
87+
Subsystem: "dao",
88+
Name: "proposal_state_count",
89+
Help: "the count of various states of Rocket Pool dao proposal",
90+
},
91+
[]string{"state"},
92+
),
93+
}
94+
95+
p := &daoMetricsProcess {
96+
rp: rp,
97+
metrics: metrics,
98+
logger: logger,
99+
}
100+
101+
return p, nil
102+
}
103+
104+
105+
// Update minipool metrics
106+
func (p *daoMetricsProcess) updateMetrics() error {
107+
p.logger.Println("Enter dao updateMetrics")
108+
109+
var memberCount, proposalCount uint64
110+
var proposals []dao.ProposalDetails
111+
112+
// Sync
113+
var wg errgroup.Group
114+
115+
// Get data
116+
wg.Go(func() error {
117+
var err error
118+
memberCount, err = trustednode.GetMemberCount(p.rp, nil)
119+
return err
120+
})
121+
122+
wg.Go(func() error {
123+
var err error
124+
proposalCount, err = dao.GetProposalCount(p.rp, nil)
125+
return err
126+
})
127+
128+
wg.Go(func() error {
129+
var err error
130+
proposals, err = dao.GetProposals(p.rp, nil)
131+
return err
132+
})
133+
134+
// Wait for data
135+
if err := wg.Wait(); err != nil {
136+
return err
137+
}
138+
139+
p.metrics.memberCount.Set(float64(memberCount))
140+
p.metrics.proposalCount.Set(float64(proposalCount))
141+
142+
// Tally up proposal states
143+
stateCounts := make(map[types.ProposalState]uint32, len(types.ProposalStates))
144+
for _, proposal := range proposals {
145+
146+
if _, ok := stateCounts[proposal.State]; !ok {
147+
stateCounts[proposal.State] = 0
148+
}
149+
stateCounts[proposal.State]++
150+
}
151+
152+
for state, count := range stateCounts {
153+
p.metrics.proposalStateCount.With(prometheus.Labels{"state":types.ProposalStates[state]}).Set(float64(count))
154+
}
155+
156+
return nil
157+
}
158+

rocketpool/metrics/metrics.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ func run(c *cli.Context) error {
4848
configureHTTP()
4949

5050
// Start metrics processes
51-
go (func() { startNetworkMetricsProcess(c, networkUpdateInterval, log.NewColorLogger(networkMetricsColor)) })()
52-
go (func() { startMinipoolMetricsProcess(c, minipoolUpdateInterval, log.NewColorLogger(minipoolMetricsColor)) })()
53-
go (func() { startAuctionMetricsProcess(c, minipoolUpdateInterval, log.NewColorLogger(minipoolMetricsColor)) })()
54-
go (func() { startNodeMetricsProcess(c, nodeUpdateInterval, log.NewColorLogger(nodeMetricsColor)) })()
51+
go (func() { startAuctionMetricsProcess(c, minipoolUpdateInterval, logger) })()
52+
go (func() { startDaoMetricsProcess(c, minipoolUpdateInterval, logger) })()
53+
go (func() { startMinipoolMetricsProcess(c, minipoolUpdateInterval, logger) })()
54+
go (func() { startNetworkMetricsProcess(c, networkUpdateInterval, logger) })()
55+
go (func() { startNodeMetricsProcess(c, nodeUpdateInterval, logger) })()
5556

5657
// Serve metrics
5758
http.Handle("/metrics", promhttp.Handler())
@@ -75,3 +76,4 @@ func configureHTTP() {
7576
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = maxConcurrentEth1Requests
7677

7778
}
79+

rocketpool/metrics/minipool.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,4 @@ func (p *minipoolMetricsProcess) updateMinipool() error {
133133

134134
return nil
135135
}
136+

rocketpool/metrics/network.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,3 +437,4 @@ func (p *networkMetricsProcess) updateSettings() error {
437437

438438
return nil
439439
}
440+

rocketpool/metrics/node.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,4 @@ func (p *nodeMetricsProcess) updateMinipoolCount(nodeRanks []api.NodeRank) {
278278
p.metrics.minipoolCounts.With(prometheus.Labels{"status":"validatorExists"}).Set(float64(validatorExistsCount))
279279
p.metrics.minipoolCounts.With(prometheus.Labels{"status":"validatorActive"}).Set(float64(validatorActiveCount))
280280
}
281+

rocketpool/metrics/utils.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ func B2i(b bool) int8 {
66
}
77
return 0
88
}
9+

0 commit comments

Comments
 (0)