Skip to content
This repository was archived by the owner on Jul 13, 2022. It is now read-only.

Commit 75b81b0

Browse files
author
David Ansermino
authored
Add basic prometheus metrics (#519)
- Adds counters for blocks processed and votes submitted - Starts prometheus collection on `/metrics`
1 parent edcf603 commit 75b81b0

File tree

21 files changed

+134
-80
lines changed

21 files changed

+134
-80
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ rebuild-contracts:
6060
license:
6161
@echo " > \033[32mAdding license headers...\033[0m "
6262
GO111MODULE=off go get -u github.com/google/addlicense
63-
addlicense -c "ChainSafe Systems" -f ./copyright.txt -y 2020 .
63+
addlicense -c "ChainSafe Systems" -f ./scripts/header.txt -y 2020 .
6464

6565
## license-check: Checks for missing license headers
6666
license-check:

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,12 @@ For testing purposes, chainbridge provides 5 test keys. The can be used with `--
9797

9898
## Metrics
9999

100-
A basic health status check can be enabled with the `--metrics` flag (default port `8001`, use `--metricsPort` to specify).
100+
Basic metrics and a health status check can be enabled with the `--metrics` flag (default port `8001`, use `--metricsPort` to specify).
101101

102102
The endpoint `/health` will return the current block height and a timestamp of when it was processed. If the timestamp is at least 120 seconds old an error will be returned.
103103

104+
Prometheus metrics are served on `/metrics`.
105+
104106
# Chain Implementations
105107

106108
- Ethereum (Solidity): [chainbridge-solidity](https://github.com/ChainSafe/chainbridge-solidity)

chains/ethereum/chain.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func setupBlockstore(cfg *Config, kp *secp256k1.Keypair) (*blockstore.Blockstore
9090
return bs, nil
9191
}
9292

93-
func InitializeChain(chainCfg *core.ChainConfig, logger log15.Logger, sysErr chan<- error) (*Chain, error) {
93+
func InitializeChain(chainCfg *core.ChainConfig, logger log15.Logger, sysErr chan<- error, m *metrics.ChainMetrics) (*Chain, error) {
9494
cfg, err := parseChainConfig(chainCfg)
9595
if err != nil {
9696
return nil, err
@@ -163,10 +163,10 @@ func InitializeChain(chainCfg *core.ChainConfig, logger log15.Logger, sysErr cha
163163
cfg.startBlock = curr
164164
}
165165

166-
listener := NewListener(conn, cfg, logger, bs, stop, sysErr)
166+
listener := NewListener(conn, cfg, logger, bs, stop, sysErr, m)
167167
listener.setContracts(bridgeContract, erc20HandlerContract, erc721HandlerContract, genericHandlerContract)
168168

169-
writer := NewWriter(conn, cfg, logger, stop, sysErr)
169+
writer := NewWriter(conn, cfg, logger, stop, sysErr, m)
170170
writer.setContract(bridgeContract)
171171

172172
return &Chain{

chains/ethereum/chain_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestChain_ListenerShutdownOnFailure(t *testing.T) {
3939
},
4040
}
4141
sysErr := make(chan error)
42-
chain, err := InitializeChain(cfg, TestLogger, sysErr)
42+
chain, err := InitializeChain(cfg, TestLogger, sysErr, nil)
4343
if err != nil {
4444
t.Fatal(err)
4545
}
@@ -98,7 +98,7 @@ func TestChain_WriterShutdownOnFailure(t *testing.T) {
9898
},
9999
}
100100
sysErr := make(chan error)
101-
chain, err := InitializeChain(cfg, TestLogger, sysErr)
101+
chain, err := InitializeChain(cfg, TestLogger, sysErr, nil)
102102
if err != nil {
103103
t.Fatal(err)
104104
}

chains/ethereum/listener.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ type listener struct {
4343
stop <-chan int
4444
sysErr chan<- error // Reports fatal error to core
4545
latestBlock metrics.LatestBlock
46+
metrics *metrics.ChainMetrics
4647
}
4748

4849
// NewListener creates and returns a listener
49-
func NewListener(conn Connection, cfg *Config, log log15.Logger, bs blockstore.Blockstorer, stop <-chan int, sysErr chan<- error) *listener {
50+
func NewListener(conn Connection, cfg *Config, log log15.Logger, bs blockstore.Blockstorer, stop <-chan int, sysErr chan<- error, m *metrics.ChainMetrics) *listener {
5051
return &listener{
5152
cfg: *cfg,
5253
conn: conn,
@@ -55,6 +56,7 @@ func NewListener(conn Connection, cfg *Config, log log15.Logger, bs blockstore.B
5556
stop: stop,
5657
sysErr: sysErr,
5758
latestBlock: metrics.LatestBlock{LastUpdated: time.Now()},
59+
metrics: m,
5860
}
5961
}
6062

@@ -138,6 +140,9 @@ func (l *listener) pollBlocks() error {
138140
l.latestBlock.Height = big.NewInt(0).Set(latestBlock)
139141
l.latestBlock.LastUpdated = time.Now()
140142
retry = BlockRetryLimit
143+
if l.metrics != nil {
144+
l.metrics.BlocksProcessed.Inc()
145+
}
141146
}
142147
}
143148
}

chains/ethereum/listener_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func createTestListener(t *testing.T, config *Config, contracts *utils.DeployedC
6565
}
6666

6767
router := &MockRouter{msgs: make(chan msg.Message)}
68-
listener := NewListener(conn, &newConfig, TestLogger, &blockstore.EmptyStore{}, stop, sysErr)
68+
listener := NewListener(conn, &newConfig, TestLogger, &blockstore.EmptyStore{}, stop, sysErr, nil)
6969
listener.setContracts(bridgeContract, erc20HandlerContract, erc721HandlerContract, genericHandlerContract)
7070
listener.setRouter(router)
7171
// Start the listener

chains/ethereum/writer.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package ethereum
66
import (
77
"github.com/ChainSafe/ChainBridge/bindings/Bridge"
88
"github.com/ChainSafe/ChainBridge/chains"
9+
metrics "github.com/ChainSafe/ChainBridge/metrics/types"
910
"github.com/ChainSafe/chainbridge-utils/msg"
1011
"github.com/ChainSafe/log15"
1112
)
@@ -24,16 +25,18 @@ type writer struct {
2425
log log15.Logger
2526
stop <-chan int
2627
sysErr chan<- error // Reports fatal error to core
28+
metrics *metrics.ChainMetrics
2729
}
2830

2931
// NewWriter creates and returns writer
30-
func NewWriter(conn Connection, cfg *Config, log log15.Logger, stop <-chan int, sysErr chan<- error) *writer {
32+
func NewWriter(conn Connection, cfg *Config, log log15.Logger, stop <-chan int, sysErr chan<- error, m *metrics.ChainMetrics) *writer {
3133
return &writer{
32-
cfg: *cfg,
33-
conn: conn,
34-
log: log,
35-
stop: stop,
36-
sysErr: sysErr,
34+
cfg: *cfg,
35+
conn: conn,
36+
log: log,
37+
stop: stop,
38+
sysErr: sysErr,
39+
metrics: m,
3740
}
3841
}
3942

chains/ethereum/writer_methods.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ func (w *writer) voteProposal(m msg.Message, dataHash [32]byte) {
239239

240240
if err == nil {
241241
w.log.Info("Submitted proposal vote", "tx", tx.Hash(), "src", m.Source, "depositNonce", m.DepositNonce)
242+
if w.metrics != nil {
243+
w.metrics.VotesSubmitted.Inc()
244+
}
242245
return
243246
} else if err.Error() == ErrNonceTooLow.Error() || err.Error() == ErrTxUnderpriced.Error() {
244247
w.log.Debug("Nonce too low, will retry")

chains/ethereum/writer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func createTestWriter(t *testing.T, cfg *Config, errs chan<- error) (*writer, fu
3333

3434
conn := newLocalConnection(t, cfg)
3535
stop := make(chan int)
36-
writer := NewWriter(conn, cfg, newTestLogger(cfg.name), stop, errs)
36+
writer := NewWriter(conn, cfg, newTestLogger(cfg.name), stop, errs, nil)
3737

3838
bridge, err := Bridge.NewBridge(cfg.bridgeContract, conn.Client())
3939
if err != nil {
@@ -112,7 +112,7 @@ func TestWriter_start_stop(t *testing.T) {
112112
defer conn.Close()
113113

114114
stop := make(chan int)
115-
writer := NewWriter(conn, aliceTestConfig, TestLogger, stop, nil)
115+
writer := NewWriter(conn, aliceTestConfig, TestLogger, stop, nil, nil)
116116

117117
err := writer.start()
118118
if err != nil {

chains/substrate/chain.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func checkBlockstore(bs *blockstore.Blockstore, startBlock uint64) (uint64, erro
5959
}
6060
}
6161

62-
func InitializeChain(cfg *core.ChainConfig, logger log15.Logger, sysErr chan<- error) (*Chain, error) {
62+
func InitializeChain(cfg *core.ChainConfig, logger log15.Logger, sysErr chan<- error, m *metrics.ChainMetrics) (*Chain, error) {
6363
kp, err := keystore.KeypairFromAddress(cfg.From, keystore.SubChain, cfg.KeystorePath, cfg.Insecure)
6464
if err != nil {
6565
return nil, err
@@ -102,8 +102,8 @@ func InitializeChain(cfg *core.ChainConfig, logger log15.Logger, sysErr chan<- e
102102
}
103103

104104
// Setup listener & writer
105-
l := NewListener(conn, cfg.Name, cfg.Id, startBlock, logger, bs, stop, sysErr)
106-
w := NewWriter(conn, logger, sysErr)
105+
l := NewListener(conn, cfg.Name, cfg.Id, startBlock, logger, bs, stop, sysErr, m)
106+
w := NewWriter(conn, logger, sysErr, m)
107107
return &Chain{
108108
cfg: cfg,
109109
conn: conn,

0 commit comments

Comments
 (0)