Skip to content

Commit 27d116c

Browse files
Merge pull request #608 from shutter-network/feat/EL/CL-metrics
feat: add EL & CL version metrics
2 parents c03012d + 826ac51 commit 27d116c

File tree

5 files changed

+99
-1
lines changed

5 files changed

+99
-1
lines changed

rolling-shutter/keyper/keypermetrics/metrics.go

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

33
import (
4+
"context"
5+
46
"github.com/prometheus/client_golang/prometheus"
7+
"github.com/rs/zerolog/log"
58

69
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyper/kprconfig"
10+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley/chainsync"
711
)
812

913
var MetricsKeyperCurrentBlockL1 = prometheus.NewGauge(
@@ -91,6 +95,24 @@ func InitMetrics(config kprconfig.Config) {
9195
prometheus.MustRegister(MetricsKeyperCurrentBatchConfigIndex)
9296
prometheus.MustRegister(MetricsKeyperBatchConfigInfo)
9397

98+
version, err := chainsync.GetClientVersion(context.Background(), config.Ethereum.EthereumURL)
99+
if err != nil {
100+
log.Error().Err(err).Msg("execution_client_version metrics | Failed to get execution client version")
101+
return
102+
}
103+
104+
executionClientVersion := prometheus.NewGauge(
105+
prometheus.GaugeOpts{
106+
Namespace: "shutter",
107+
Subsystem: "keyper",
108+
Name: "execution_client_version",
109+
Help: "Version of the execution client",
110+
ConstLabels: prometheus.Labels{
111+
"version": version,
112+
},
113+
},
114+
)
115+
prometheus.MustRegister(executionClientVersion)
94116
metricsKeyperEthAddress := prometheus.NewGauge(
95117
prometheus.GaugeOpts{
96118
Namespace: "shutter",

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: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package gnosis
22

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

512
var metricsTxPointer = prometheus.NewGaugeVec(
613
prometheus.GaugeOpts{
@@ -93,3 +100,23 @@ func init() {
93100
prometheus.MustRegister(metricsKeysSentTimeDelta)
94101
prometheus.MustRegister(metricsKeySharesSentTimeDelta)
95102
}
103+
104+
func InitMetrics(beaconClient *beaconapiclient.Client) {
105+
version, err := beaconClient.GetBeaconNodeVersion(context.Background())
106+
if err != nil {
107+
log.Error().Err(err).Msg("beacon_client_version metrics | Failed to get beacon node version")
108+
return
109+
}
110+
beaconClientVersion := prometheus.NewGauge(
111+
prometheus.GaugeOpts{
112+
Namespace: "shutter",
113+
Subsystem: "gnosis",
114+
Name: "beacon_client_version",
115+
Help: "Version of the beacon client",
116+
ConstLabels: prometheus.Labels{
117+
"version": version,
118+
},
119+
},
120+
)
121+
prometheus.MustRegister(beaconClientVersion)
122+
}

rolling-shutter/medley/beaconapiclient/beaconapiclient.go

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

33
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"io"
48
"net/http"
59
"net/url"
610
)
@@ -20,3 +24,33 @@ func New(rawURL string) (*Client, error) {
2024
url: parsedURL,
2125
}, nil
2226
}
27+
28+
func (c *Client) GetBeaconNodeVersion(ctx context.Context) (string, error) {
29+
path := c.url.JoinPath("/eth/v1/node/version")
30+
req, err := http.NewRequestWithContext(ctx, "GET", path.String(), http.NoBody)
31+
if err != nil {
32+
return "", err
33+
}
34+
resp, err := http.DefaultClient.Do(req)
35+
if err != nil {
36+
return "", fmt.Errorf("failed to get beacon node version from consensus node: %w", err)
37+
}
38+
defer resp.Body.Close()
39+
if resp.StatusCode != http.StatusOK {
40+
return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode)
41+
}
42+
body, err := io.ReadAll(resp.Body)
43+
if err != nil {
44+
return "", err
45+
}
46+
var result struct {
47+
Data struct {
48+
Version string `json:"version"`
49+
} `json:"data"`
50+
}
51+
err = json.Unmarshal(body, &result)
52+
if err != nil {
53+
return "", err
54+
}
55+
return result.Data.Version, nil
56+
}

rolling-shutter/medley/chainsync/client.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/ethereum/go-ethereum/accounts/abi/bind"
99
"github.com/ethereum/go-ethereum/core/types"
1010
"github.com/ethereum/go-ethereum/log"
11+
"github.com/ethereum/go-ethereum/rpc"
1112
"github.com/pkg/errors"
1213
"github.com/shutter-network/shop-contracts/bindings"
1314

@@ -148,3 +149,13 @@ func (s *Client) ChainID(ctx context.Context) (*big.Int, error) {
148149
func (s *Client) Start(_ context.Context, runner service.Runner) error {
149150
return runner.StartService(s.getServices()...)
150151
}
152+
153+
func GetClientVersion(ctx context.Context, ethereumURL string) (string, error) {
154+
client, err := rpc.DialContext(ctx, ethereumURL)
155+
if err != nil {
156+
return "", err
157+
}
158+
var version string
159+
err = client.CallContext(ctx, &version, "web3_clientVersion")
160+
return version, err
161+
}

0 commit comments

Comments
 (0)