Skip to content

Commit 85baf97

Browse files
feat: add EL & CL version metrics
1 parent b4955a8 commit 85baf97

File tree

5 files changed

+94
-3
lines changed

5 files changed

+94
-3
lines changed

rolling-shutter/keyper/keyper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (kpr *KeyperCore) Start(ctx context.Context, runner service.Runner) error {
147147
messageSender := fx.NewRPCMessageSender(shuttermintClient, config.Ethereum.PrivateKey.Key)
148148

149149
if kpr.config.Metrics.Enabled {
150-
keypermetrics.InitMetrics()
150+
keypermetrics.InitMetrics(kpr.config)
151151
epochkghandler.InitMetrics()
152152
deployment.InitMetrics()
153153
kpr.metricsServer = metricsserver.New(kpr.config.Metrics)

rolling-shutter/keyper/keypermetrics/metrics.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package keypermetrics
22

33
import (
4+
"context"
5+
6+
"github.com/ethereum/go-ethereum/rpc"
47
"github.com/prometheus/client_golang/prometheus"
8+
"github.com/rs/zerolog/log"
9+
10+
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/kprconfig"
511
)
612

713
var MetricsKeyperCurrentBlockL1 = prometheus.NewGauge(
@@ -79,7 +85,7 @@ var MetricsKeyperBatchConfigInfo = prometheus.NewGaugeVec(
7985
},
8086
[]string{"batch_config_index", "keyper_addresses"})
8187

82-
func InitMetrics() {
88+
func InitMetrics(config *kprconfig.Config) {
8389
prometheus.MustRegister(MetricsKeyperCurrentBlockL1)
8490
prometheus.MustRegister(MetricsKeyperCurrentBlockShuttermint)
8591
prometheus.MustRegister(MetricsKeyperCurrentEon)
@@ -88,4 +94,32 @@ func InitMetrics() {
8894
prometheus.MustRegister(MetricsKeyperCurrentPhase)
8995
prometheus.MustRegister(MetricsKeyperCurrentBatchConfigIndex)
9096
prometheus.MustRegister(MetricsKeyperBatchConfigInfo)
97+
98+
version, err := getClientVersion(config.Ethereum.EthereumURL)
99+
if err != nil {
100+
log.Error().Err(err).Msg("Failed to get execution client version")
101+
}
102+
103+
executionClientVersion := prometheus.NewGauge(
104+
prometheus.GaugeOpts{
105+
Namespace: "shutter",
106+
Subsystem: "keyper",
107+
Name: "execution_client_version",
108+
Help: "Version of the execution client",
109+
ConstLabels: prometheus.Labels{
110+
"version": version,
111+
},
112+
},
113+
)
114+
prometheus.MustRegister(executionClientVersion)
115+
}
116+
117+
func getClientVersion(rpcURL string) (string, error) {
118+
client, err := rpc.DialContext(context.Background(), rpcURL)
119+
if err != nil {
120+
return "", err
121+
}
122+
var version string
123+
err = client.CallContext(context.Background(), &version, "web3_clientVersion")
124+
return version, err
91125
}

rolling-shutter/keyperimpl/gnosis/keyper.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ func New(c *Config) *Keyper {
7171
func (kpr *Keyper) Start(ctx context.Context, runner service.Runner) error {
7272
var err error
7373

74+
if kpr.config.Metrics.Enabled {
75+
InitMetrics(kpr.beaconAPIClient)
76+
}
77+
7478
kpr.newBlocks = make(chan *syncevent.LatestBlock)
7579
kpr.newKeyperSets = make(chan *syncevent.KeyperSet)
7680
kpr.newEonPublicKeys = make(chan keyper.EonPublicKey)

rolling-shutter/keyperimpl/gnosis/metrics.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package gnosis
22

3-
import "github.com/prometheus/client_golang/prometheus"
3+
import (
4+
"github.com/prometheus/client_golang/prometheus"
5+
"github.com/rs/zerolog/log"
6+
7+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/beaconapiclient"
8+
)
49

510
var metricsTxPointer = prometheus.NewGaugeVec(
611
prometheus.GaugeOpts{
@@ -93,3 +98,22 @@ func init() {
9398
prometheus.MustRegister(metricsKeysSentTimeDelta)
9499
prometheus.MustRegister(metricsKeySharesSentTimeDelta)
95100
}
101+
102+
func InitMetrics(beaconClient *beaconapiclient.Client) {
103+
version, err := beaconClient.GetBeaconNodeVersion()
104+
if err != nil {
105+
log.Error().Err(err).Msg("Failed to get beacon node version")
106+
}
107+
beaconClientVersion := prometheus.NewGauge(
108+
prometheus.GaugeOpts{
109+
Namespace: "shutter",
110+
Subsystem: "gnosis",
111+
Name: "beacon_client_version",
112+
Help: "Version of the beacon client",
113+
ConstLabels: prometheus.Labels{
114+
"version": version,
115+
},
116+
},
117+
)
118+
prometheus.MustRegister(beaconClientVersion)
119+
}

rolling-shutter/medley/beaconapiclient/beaconapiclient.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package beaconapiclient
22

33
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
47
"net/http"
58
"net/url"
69
)
@@ -20,3 +23,29 @@ func New(rawURL string) (*Client, error) {
2023
url: parsedURL,
2124
}, nil
2225
}
26+
27+
func (c *Client) GetBeaconNodeVersion() (string, error) {
28+
endpoint := "/eth/v1/node/version"
29+
resp, err := c.c.Get(c.url.JoinPath(endpoint).String())
30+
if err != nil {
31+
return "", err
32+
}
33+
defer resp.Body.Close()
34+
if resp.StatusCode != http.StatusOK {
35+
return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode)
36+
}
37+
body, err := io.ReadAll(resp.Body)
38+
if err != nil {
39+
return "", err
40+
}
41+
var result struct {
42+
Data struct {
43+
Version string `json:"version"`
44+
} `json:"data"`
45+
}
46+
err = json.Unmarshal(body, &result)
47+
if err != nil {
48+
return "", err
49+
}
50+
return result.Data.Version, nil
51+
}

0 commit comments

Comments
 (0)