Skip to content

Commit f4bf7cf

Browse files
authored
Rebranding (#18)
1 parent b903183 commit f4bf7cf

File tree

10 files changed

+79
-77
lines changed

10 files changed

+79
-77
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# EVM RPC Websocket Exporter
1+
# Blockchain RPC Exporter
22
The exporter is used to scrape metrics from blockchain RPC endpoints. The purpose of this exporter is to perform black-box testing on RPC endpoints.
33
## Metrics
44
Exporter currently supports all EVM-compatible chains. In addition, there is limited support for the following chains:
@@ -10,6 +10,8 @@ Exporter currently supports all EVM-compatible chains. In addition, there is lim
1010
- Filecoin (https)
1111
- Starkware (https)
1212

13+
## Available Metrics
14+
1315
# Disclaimer
1416
Please note that this tool is in the early development stage and should not be used to influence critical business decisions.
1517
The project in its current form suits our short-term needs and will receive limited support. We encourage you to fork the project and extend it with additional functionality you might need.

src/collectors/bitcoin.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ async def _probe(self, metrics):
1919
chain_info = await rpc.getblockchaininfo()
2020
latency = (perf_counter() - start) * 1000
2121

22-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
23-
metrics['ws_rpc_latency'].add_metric(self.labels_values, latency)
24-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, chain_info['headers'])
25-
metrics['ws_rpc_total_difficulty'].add_metric(self.labels_values, chain_info['difficulty'])
22+
metrics['brpc_health'].add_metric(self.labels_values, True)
23+
metrics['brpc_latency'].add_metric(self.labels_values, latency)
24+
metrics['brpc_block_height'].add_metric(self.labels_values, chain_info['headers'])
25+
metrics['brpc_total_difficulty'].add_metric(self.labels_values, chain_info['difficulty'])
2626
except Exception as exc:
2727
logger.error("Failed probing {} with error: {}".format(strip_url(self.url), exc))
28-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
28+
metrics['brpc_health'].add_metric(self.labels_values, False)
2929

3030
def probe(self, metrics):
3131
asyncio.run(self._probe(metrics))

src/collectors/cardano.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ def probe(self, metrics):
3232
try:
3333
alive = self.ws_collector.get_liveliness()
3434
if alive:
35-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
36-
metrics['ws_rpc_latency'].add_metric(self.labels_values, self.ws_collector.get_latency())
37-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, self._get_block_height())
35+
metrics['brpc_health'].add_metric(self.labels_values, True)
36+
metrics['brpc_latency'].add_metric(self.labels_values, self.ws_collector.get_latency())
37+
metrics['brpc_block_height'].add_metric(self.labels_values, self._get_block_height())
3838
else:
39-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
39+
metrics['brpc_health'].add_metric(self.labels_values, False)
4040
except Exception as exc:
4141
logger.error("Failed probing {} with error: {}".format(strip_url(self.url), exc))

src/collectors/conflux.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,26 @@ def __init__(self, rpc_metadata):
2727
def probe(self, metrics):
2828
try:
2929
if self.client.isConnected():
30-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
31-
metrics['ws_rpc_head_count'].add_metric(self.labels_values, self.ws_collector.message_counter)
32-
metrics['ws_rpc_disconnects'].add_metric(self.labels_values, self.ws_collector.disconnects_counter)
33-
metrics['ws_rpc_latency'].add_metric(self.labels_values, self.ws_collector.get_latency())
34-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, self.client.cfx.epoch_number)
30+
metrics['brpc_health'].add_metric(self.labels_values, True)
31+
metrics['brpc_head_count'].add_metric(self.labels_values, self.ws_collector.message_counter)
32+
metrics['brpc_disconnects'].add_metric(self.labels_values, self.ws_collector.disconnects_counter)
33+
metrics['brpc_latency'].add_metric(self.labels_values, self.ws_collector.get_latency())
34+
metrics['brpc_block_height'].add_metric(self.labels_values, self.client.cfx.epoch_number)
3535

3636
try:
3737
difficulty = self.client.cfx.get_block_by_hash(self.client.cfx.get_best_block_hash())['difficulty']
38-
metrics['ws_rpc_difficulty'].add_metric(self.labels_values, difficulty)
38+
metrics['brpc_difficulty'].add_metric(self.labels_values, difficulty)
3939
except TypeError:
4040
logger.error(
4141
"RPC Endpoint sent faulty response type when querying for difficulty. This is most likely issue with RPC endpoint."
4242
)
4343

44-
metrics['ws_rpc_gas_price'].add_metric(self.labels_values, self.client.cfx.gas_price)
44+
metrics['brpc_gas_price'].add_metric(self.labels_values, self.client.cfx.gas_price)
4545
else:
4646
logger.info("Client is not connected to {}".format(strip_url(self.url)))
47-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
47+
metrics['brpc_health'].add_metric(self.labels_values, False)
4848
except asyncio.exceptions.TimeoutError:
4949
logger.info("Client timed out for {}".format(strip_url(self.url)))
50-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
50+
metrics['brpc_health'].add_metric(self.labels_values, False)
5151
except Exception as exc:
5252
logger.error("Failed probing {} with error: {}".format(strip_url(self.url), exc))

src/collectors/dogecoin.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ def probe(self, metrics):
1919
latency = (perf_counter() - start) * 1000
2020

2121
if response:
22-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
23-
metrics['ws_rpc_latency'].add_metric(self.labels_values, latency)
24-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, response['result']['blocks'])
25-
metrics['ws_rpc_total_difficulty'].add_metric(self.labels_values, response['result']['difficulty'])
22+
metrics['brpc_health'].add_metric(self.labels_values, True)
23+
metrics['brpc_latency'].add_metric(self.labels_values, latency)
24+
metrics['brpc_block_height'].add_metric(self.labels_values, response['result']['blocks'])
25+
metrics['brpc_total_difficulty'].add_metric(self.labels_values, response['result']['difficulty'])
2626
else:
2727
logger.error("Bad response from client {}: {}".format(strip_url(self.url), exc))
28-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
28+
metrics['brpc_health'].add_metric(self.labels_values, False)
2929
except requests.RequestException as exc:
3030
logger.error("Health check failed for {}: {}".format(strip_url(self.url), exc))
31-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
31+
metrics['brpc_health'].add_metric(self.labels_values, False)
3232
except Exception as exc:
3333
logger.error("Health check failed for {}: {}".format(strip_url(self.url), exc))
34-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
34+
metrics['brpc_health'].add_metric(self.labels_values, False)

src/collectors/evm.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,36 +29,36 @@ def __init__(self, rpc_metadata):
2929
def probe(self, metrics):
3030
try:
3131
if self.client.isConnected():
32-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
33-
metrics['ws_rpc_head_count'].add_metric(self.labels_values, self.ws_collector.message_counter)
34-
metrics['ws_rpc_disconnects'].add_metric(self.labels_values, self.ws_collector.disconnects_counter)
35-
metrics['ws_rpc_latency'].add_metric(self.labels_values, self.ws_collector.get_latency())
36-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, self.client.eth.block_number)
37-
metrics['ws_rpc_total_difficulty'].add_metric(self.labels_values,
32+
metrics['brpc_health'].add_metric(self.labels_values, True)
33+
metrics['brpc_head_count'].add_metric(self.labels_values, self.ws_collector.message_counter)
34+
metrics['brpc_disconnects'].add_metric(self.labels_values, self.ws_collector.disconnects_counter)
35+
metrics['brpc_latency'].add_metric(self.labels_values, self.ws_collector.get_latency())
36+
metrics['brpc_block_height'].add_metric(self.labels_values, self.client.eth.block_number)
37+
metrics['brpc_total_difficulty'].add_metric(self.labels_values,
3838
self.client.eth.get_block('latest')['totalDifficulty'])
39-
metrics['ws_rpc_difficulty'].add_metric(self.labels_values,
39+
metrics['brpc_difficulty'].add_metric(self.labels_values,
4040
self.client.eth.get_block('latest')['difficulty'])
4141

4242
try:
4343
if self.net_peer_enabled:
44-
metrics['ws_rpc_net_peer_count'].add_metric(self.labels_values, self.client.net.peer_count)
44+
metrics['brpc_net_peer_count'].add_metric(self.labels_values, self.client.net.peer_count)
4545
except ValueError:
4646
logger.error(
4747
"Net peer function is not supported for this chain, the collector will ignore this from this point on."
4848
)
4949
self.net_peer_enabled = False
5050

51-
metrics['ws_rpc_gas_price'].add_metric(self.labels_values, self.client.eth.gas_price)
52-
metrics['ws_rpc_max_priority_fee'].add_metric(self.labels_values, self.client.eth.max_priority_fee)
51+
metrics['brpc_gas_price'].add_metric(self.labels_values, self.client.eth.gas_price)
52+
metrics['brpc_max_priority_fee'].add_metric(self.labels_values, self.client.eth.max_priority_fee)
5353
else:
5454
logger.info("Client is not connected to {}".format(strip_url(self.url)))
55-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
55+
metrics['brpc_health'].add_metric(self.labels_values, False)
5656
except asyncio.exceptions.TimeoutError as exc:
5757
logger.info("Client timed out for {}: {}".format(strip_url(self.url), exc))
58-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
58+
metrics['brpc_health'].add_metric(self.labels_values, False)
5959
except WebSocketException as exc:
6060
logger.info("Websocket client exception {}: {}".format(strip_url(self.url), exc))
61-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
61+
metrics['brpc_health'].add_metric(self.labels_values, False)
6262
except Exception as exc:
6363
logger.error("Failed probing {} with error: {}".format(strip_url(self.url), exc))
64-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
64+
metrics['brpc_health'].add_metric(self.labels_values, False)

src/collectors/filecoin.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ def probe(self, metrics):
2020
latency = (perf_counter() - start) * 1000
2121

2222
if response.ok:
23-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
24-
metrics['ws_rpc_latency'].add_metric(self.labels_values, latency)
25-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, response.json()['result']['Height'])
23+
metrics['brpc_health'].add_metric(self.labels_values, True)
24+
metrics['brpc_latency'].add_metric(self.labels_values, latency)
25+
metrics['brpc_block_height'].add_metric(self.labels_values, response.json()['result']['Height'])
2626
else:
2727
logger.error("Bad response from client while fetching Filecoin.ChainHead method for {}: {}".format(
2828
strip_url(self.url), response))
29-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
29+
metrics['brpc_health'].add_metric(self.labels_values, False)
3030
except requests.RequestException as exc:
3131
logger.error("Health check failed for {}: {}".format(strip_url(self.url), exc))
32-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
32+
metrics['brpc_health'].add_metric(self.labels_values, False)
3333
except Exception as e:
3434
logger.error("Health check failed for {}: {}".format(strip_url(self.url), e))
35-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
35+
metrics['brpc_health'].add_metric(self.labels_values, False)

src/collectors/solana.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ def is_connected(self) -> bool:
4545
def probe(self, metrics):
4646
try:
4747
if self.is_connected():
48-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
49-
metrics['ws_rpc_head_count'].add_metric(self.labels_values, self.ws_collector.message_counter)
50-
metrics['ws_rpc_disconnects'].add_metric(self.labels_values, self.ws_collector.disconnects_counter)
51-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, self.client.get_block_height()['result'])
48+
metrics['brpc_health'].add_metric(self.labels_values, True)
49+
metrics['brpc_head_count'].add_metric(self.labels_values, self.ws_collector.message_counter)
50+
metrics['brpc_disconnects'].add_metric(self.labels_values, self.ws_collector.disconnects_counter)
51+
metrics['brpc_block_height'].add_metric(self.labels_values, self.client.get_block_height()['result'])
5252
else:
53-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
53+
metrics['brpc_health'].add_metric(self.labels_values, False)
5454
except Exception as exc:
5555
logger.error("Failed probing {} with error: {}".format(strip_url(self.url), exc))

src/collectors/starkware.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ def probe(self, metrics):
2121
latency = (perf_counter() - start) * 1000
2222

2323
if response:
24-
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
25-
metrics['ws_rpc_latency'].add_metric(self.labels_values, latency)
26-
metrics['ws_rpc_block_height'].add_metric(self.labels_values, response['result'])
24+
metrics['brpc_health'].add_metric(self.labels_values, True)
25+
metrics['brpc_latency'].add_metric(self.labels_values, latency)
26+
metrics['brpc_block_height'].add_metric(self.labels_values, response['result'])
2727
else:
2828
logger.error("Bad response from client {}: {}".format(strip_url(self.url), exc))
29-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
29+
metrics['brpc_health'].add_metric(self.labels_values, False)
3030
except requests.RequestException as exc:
3131
logger.error("Health check failed for {}: {}".format(strip_url(self.url), exc))
32-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
32+
metrics['brpc_health'].add_metric(self.labels_values, False)
3333
except Exception as exc:
3434
logger.error("Health check failed for {}: {}".format(strip_url(self.url), exc))
35-
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
35+
metrics['brpc_health'].add_metric(self.labels_values, False)

src/exporter.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -88,34 +88,34 @@ def _instantiate_starkware(self):
8888

8989
def collect(self):
9090
metrics = {
91-
"ws_rpc_health":
92-
GaugeMetricFamily('ws_rpc_health',
91+
"brpc_health":
92+
GaugeMetricFamily('brpc_health',
9393
'Returns 1 if rpc websocket server established a connection with the probe client.',
9494
labels=self.labels),
95-
"ws_rpc_latency":
96-
GaugeMetricFamily('ws_rpc_latency',
95+
"brpc_latency":
96+
GaugeMetricFamily('brpc_latency',
9797
'Latency in milliseconds of the websocket keepalive ping.',
9898
labels=self.labels),
99-
"ws_rpc_disconnects":
100-
GaugeMetricFamily('ws_rpc_disconnects', 'How many times rpc has disconnected.', labels=self.labels),
101-
"ws_rpc_block_height":
102-
GaugeMetricFamily('ws_rpc_block_height', 'Latest observed block_height.', labels=self.labels),
103-
"ws_rpc_head_count":
104-
CounterMetricFamily('ws_rpc_head_count', 'Heads received total.', labels=self.labels),
105-
"ws_rpc_difficulty":
106-
GaugeMetricFamily('ws_rpc_difficulty', 'Difficulty of the latest observed block.', labels=self.labels),
107-
"ws_rpc_total_difficulty":
108-
GaugeMetricFamily('ws_rpc_total_difficulty',
99+
"brpc_disconnects":
100+
GaugeMetricFamily('brpc_disconnects', 'How many times rpc has disconnected.', labels=self.labels),
101+
"brpc_block_height":
102+
GaugeMetricFamily('brpc_block_height', 'Latest observed block_height.', labels=self.labels),
103+
"brpc_head_count":
104+
CounterMetricFamily('brpc_head_count', 'Heads received total.', labels=self.labels),
105+
"brpc_difficulty":
106+
GaugeMetricFamily('brpc_difficulty', 'Difficulty of the latest observed block.', labels=self.labels),
107+
"brpc_total_difficulty":
108+
GaugeMetricFamily('brpc_total_difficulty',
109109
'Total canonical chain difficulty observed from the first to the latest block.',
110110
labels=self.labels),
111-
"ws_rpc_gas_price":
112-
GaugeMetricFamily('ws_rpc_gas_price', 'The current gas price in Wei.', labels=self.labels),
113-
"ws_rpc_max_priority_fee":
114-
GaugeMetricFamily('ws_rpc_max_priority_fee',
111+
"brpc_gas_price":
112+
GaugeMetricFamily('brpc_gas_price', 'The current gas price in Wei.', labels=self.labels),
113+
"brpc_max_priority_fee":
114+
GaugeMetricFamily('brpc_max_priority_fee',
115115
'Suggested max priority fee for dynamic fee transactions in Wei.',
116116
labels=self.labels),
117-
"ws_rpc_net_peer_count":
118-
GaugeMetricFamily('ws_rpc_net_peer_count',
117+
"brpc_net_peer_count":
118+
GaugeMetricFamily('brpc_net_peer_count',
119119
'Number of peers currently connected to the client.',
120120
labels=self.labels)
121121
}

0 commit comments

Comments
 (0)