@@ -3,6 +3,7 @@ package keypermetrics
3
3
import (
4
4
"context"
5
5
"strconv"
6
+ "strings"
6
7
7
8
"github.com/jackc/pgx/v4/pgxpool"
8
9
"github.com/prometheus/client_golang/prometheus"
@@ -88,7 +89,7 @@ var MetricsKeyperBatchConfigInfo = prometheus.NewGaugeVec(
88
89
},
89
90
[]string {"batch_config_index" , "keyper_addresses" })
90
91
91
- var MetricsKeyperDKGstatus = prometheus .NewGaugeVec (
92
+ var MetricsKeyperDKGStatus = prometheus .NewGaugeVec (
92
93
prometheus.GaugeOpts {
93
94
Namespace : "shutter" ,
94
95
Subsystem : "keyper" ,
@@ -98,6 +99,23 @@ var MetricsKeyperDKGstatus = prometheus.NewGaugeVec(
98
99
[]string {"eon" },
99
100
)
100
101
102
+ var MetricsKeyperEthAddress = prometheus .NewGaugeVec (
103
+ prometheus.GaugeOpts {
104
+ Namespace : "shutter" ,
105
+ Subsystem : "keyper" ,
106
+ Name : "address" ,
107
+ Help : "Ethereum address of the Keyper" ,
108
+ }, []string {"address" })
109
+
110
+ var MetricsExecutionClientVersion = prometheus .NewGaugeVec (
111
+ prometheus.GaugeOpts {
112
+ Namespace : "shutter" ,
113
+ Subsystem : "keyper" ,
114
+ Name : "execution_client_version" ,
115
+ Help : "Version of the execution client" ,
116
+ },
117
+ []string {"version" })
118
+
101
119
func InitMetrics (dbpool * pgxpool.Pool , config kprconfig.Config ) {
102
120
prometheus .MustRegister (MetricsKeyperCurrentBlockL1 )
103
121
prometheus .MustRegister (MetricsKeyperCurrentBlockShuttermint )
@@ -107,69 +125,98 @@ func InitMetrics(dbpool *pgxpool.Pool, config kprconfig.Config) {
107
125
prometheus .MustRegister (MetricsKeyperCurrentPhase )
108
126
prometheus .MustRegister (MetricsKeyperCurrentBatchConfigIndex )
109
127
prometheus .MustRegister (MetricsKeyperBatchConfigInfo )
110
- prometheus .MustRegister (MetricsKeyperDKGstatus )
128
+ prometheus .MustRegister (MetricsKeyperDKGStatus )
129
+ prometheus .MustRegister (MetricsKeyperEthAddress )
130
+ prometheus .MustRegister (MetricsExecutionClientVersion )
111
131
132
+ ctx := context .Background ()
112
133
queries := database .New (dbpool )
113
- eons , err := queries .GetAllEons (context .Background ())
114
- if err != nil {
115
- log .Error ().Err (err ).Msg ("keypermetrics | Failed to get all eons" )
116
- return
117
- }
118
- keyperIndex , isKeyper , err := queries .GetKeyperIndex (context .Background (), eons [len (eons )- 1 ].KeyperConfigIndex , config .GetAddress ())
119
- if err != nil {
120
- log .Error ().Err (err ).Msg ("keypermetrics | Failed to get keyper index" )
121
- return
122
- }
123
- if isKeyper {
124
- MetricsKeyperIsKeyper .WithLabelValues (strconv .FormatInt (keyperIndex , 10 )).Set (1 )
134
+
135
+ MetricsKeyperEthAddress .WithLabelValues (config .GetAddress ().Hex ()).Set (1 )
136
+
137
+ if version , err := chainsync .GetClientVersion (ctx , config .Ethereum .EthereumURL ); err != nil {
138
+ log .Error ().Err (err ).Msg ("keypermetrics | Failed to get execution client version" )
125
139
} else {
126
- MetricsKeyperIsKeyper .WithLabelValues (strconv . FormatInt ( keyperIndex , 10 )) .Set (0 )
140
+ MetricsExecutionClientVersion .WithLabelValues (version ) .Set (1 )
127
141
}
128
142
129
- dkgResult , err := queries .GetDKGResultForKeyperConfigIndex ( context . Background (), eons [ len ( eons ) - 1 ]. KeyperConfigIndex )
143
+ eons , err := queries .GetAllEons ( ctx )
130
144
if err != nil {
131
- MetricsKeyperDKGstatus . WithLabelValues ( strconv . FormatInt ( eons [ len ( eons ) - 1 ]. Eon , 10 )). Set ( 0 )
132
- log . Error (). Err ( err ). Msg ( "keypermetrics | Failed to get dkg result" )
133
- return
145
+ log . Error (). Err ( err ). Msg ( "keypermetrics | Failed to fetch eons" )
146
+ } else if len ( eons ) == 0 {
147
+ log . Warn (). Msg ( "keypermetrics | No eons found" )
134
148
}
135
- if dkgResult .Success {
136
- MetricsKeyperDKGstatus .WithLabelValues (strconv .FormatInt (eons [len (eons )- 1 ].Eon , 10 )).Set (1 )
137
- } else {
138
- MetricsKeyperDKGstatus .WithLabelValues (strconv .FormatInt (eons [len (eons )- 1 ].Eon , 10 )).Set (0 )
149
+
150
+ if len (eons ) > 0 {
151
+ currentEon := eons [len (eons )- 1 ]
152
+
153
+ MetricsKeyperCurrentEon .Set (float64 (currentEon .Eon ))
154
+
155
+ MetricsKeyperCurrentBatchConfigIndex .Set (float64 (currentEon .KeyperConfigIndex ))
156
+
157
+ for _ , eon := range eons {
158
+ eonStr := strconv .FormatInt (eon .Eon , 10 )
159
+ MetricsKeyperEonStartBlock .WithLabelValues (eonStr ).Set (float64 (eon .ActivationBlockNumber ))
160
+ }
161
+
162
+ // Populate MetricsKeyperDKGStatus
163
+ dkgResults , err := queries .GetAllDKGResults (ctx )
164
+ if err != nil {
165
+ log .Error ().Err (err ).Msg ("keypermetrics | Failed to fetch DKG results" )
166
+ } else {
167
+ dkgResultMap := make (map [int64 ]database.DkgResult )
168
+ for _ , result := range dkgResults {
169
+ dkgResultMap [result .Eon ] = result
170
+ }
171
+
172
+ // Set DKG status for all eons
173
+ for _ , eon := range eons {
174
+ eonStr := strconv .FormatInt (eon .Eon , 10 )
175
+
176
+ if dkgResult , exists := dkgResultMap [eon .Eon ]; exists {
177
+ var dkgStatusValue float64
178
+ if dkgResult .Success {
179
+ dkgStatusValue = 1
180
+ }
181
+ MetricsKeyperDKGStatus .WithLabelValues (eonStr ).Set (dkgStatusValue )
182
+ } else {
183
+ // No DKG result found for this eon, set to 0
184
+ MetricsKeyperDKGStatus .WithLabelValues (eonStr ).Set (0 )
185
+ }
186
+ }
187
+ }
139
188
}
140
189
141
- version , err := chainsync .GetClientVersion (context .Background (), config .Ethereum .EthereumURL )
190
+ // Populate MetricsKeyperBatchConfigInfo && MetricsKeyperIsKeyper
191
+ batchConfigs , err := queries .GetBatchConfigs (ctx )
142
192
if err != nil {
143
- log .Error ().Err (err ).Msg ("execution_client_version metrics | Failed to get execution client version" )
144
- return
193
+ log .Error ().Err (err ).Msg ("keypermetrics | Failed to fetch batch configs" )
194
+ } else {
195
+ currentAddress := config .GetAddress ().Hex ()
196
+
197
+ for _ , batchConfig := range batchConfigs {
198
+ batchConfigIndexStr := strconv .Itoa (int (batchConfig .KeyperConfigIndex ))
199
+
200
+ // Join keyper addresses for the label
201
+ keyperAddresses := strings .Join (batchConfig .Keypers , "," )
202
+ MetricsKeyperBatchConfigInfo .WithLabelValues (batchConfigIndexStr , keyperAddresses ).Set (1 )
203
+
204
+ // Check if current node is a keyper in this batch config
205
+ isKeyper := false
206
+ for _ , keyperAddr := range batchConfig .Keypers {
207
+ if strings .EqualFold (keyperAddr , currentAddress ) {
208
+ isKeyper = true
209
+ break
210
+ }
211
+ }
212
+
213
+ var isKeyperValue float64
214
+ if isKeyper {
215
+ isKeyperValue = 1
216
+ }
217
+ MetricsKeyperIsKeyper .WithLabelValues (batchConfigIndexStr ).Set (isKeyperValue )
218
+ }
145
219
}
146
220
147
- executionClientVersion := prometheus .NewGauge (
148
- prometheus.GaugeOpts {
149
- Namespace : "shutter" ,
150
- Subsystem : "keyper" ,
151
- Name : "execution_client_version" ,
152
- Help : "Version of the execution client" ,
153
- ConstLabels : prometheus.Labels {
154
- "version" : version ,
155
- },
156
- },
157
- )
158
- executionClientVersion .Set (1 )
159
-
160
- prometheus .MustRegister (executionClientVersion )
161
- metricsKeyperEthAddress := prometheus .NewGauge (
162
- prometheus.GaugeOpts {
163
- Namespace : "shutter" ,
164
- Subsystem : "keyper" ,
165
- Name : "address" ,
166
- Help : "Ethereum address of the Keyper" ,
167
- ConstLabels : prometheus.Labels {
168
- "address" : config .GetAddress ().Hex (),
169
- },
170
- },
171
- )
172
- metricsKeyperEthAddress .Set (1 )
173
-
174
- prometheus .MustRegister (metricsKeyperEthAddress )
221
+ log .Info ().Msg ("keypermetrics | Metrics population completed" )
175
222
}
0 commit comments