Skip to content

Commit 6d4c771

Browse files
committed
Implement dogecoin
1 parent 86be6e9 commit 6d4c771

File tree

5 files changed

+141
-45
lines changed

5 files changed

+141
-45
lines changed

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,3 @@ web3==v6.0.0-beta.4
77
solana==0.25.1
88
conflux-web3==1.0.0b1
99
bitcoinrpc==0.5.0
10-

src/collectors/bitcoin.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,38 @@
44
from time import perf_counter
55
from settings import cfg, logger
66

7+
78
class bitcoin_collector():
89

910
def __init__(self, https_url, provider):
10-
self.https_url = https_url
11-
self.labels = ['https_url', 'provider', 'blockchain', 'network_name', 'network_type']
11+
self.https_url = https_url
12+
self.labels = [
13+
'https_url', 'provider', 'blockchain', 'network_name',
14+
'network_type'
15+
]
1216
self.labels_values = [
13-
https_url, provider, cfg.blockchain, cfg.network_name, cfg.network_type
17+
https_url, provider, cfg.blockchain, cfg.network_name,
18+
cfg.network_type
1419
]
15-
16-
async def _probe(self, metrics):
20+
21+
async def _probe(self, metrics):
1722
try:
1823
async with BitcoinRPC(self.https_url, "admin", "admin") as rpc:
1924
start = perf_counter()
2025
chain_info = await rpc.getblockchaininfo()
2126
latency = (perf_counter() - start) * 1000
22-
27+
2328
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, chain_info['headers'])
26-
metrics['ws_rpc_total_difficulty'].add_metric(self.labels_values, chain_info['difficulty'])
29+
metrics['ws_rpc_latency'].add_metric(self.labels_values,
30+
latency)
31+
metrics['ws_rpc_block_height'].add_metric(
32+
self.labels_values, chain_info['headers'])
33+
metrics['ws_rpc_total_difficulty'].add_metric(
34+
self.labels_values, chain_info['difficulty'])
2735
except Exception as exc:
28-
logger.error("Failed probing {} with error: {}".format(strip_url(self.url), exc))
36+
logger.error("Failed probing {} with error: {}".format(
37+
strip_url(self.url), exc))
2938
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
30-
39+
3140
def probe(self, metrics):
32-
asyncio.run(self._probe(metrics))
41+
asyncio.run(self._probe(metrics))

src/collectors/dogecoin.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from helpers import strip_url
2+
from settings import cfg, logger
3+
from time import perf_counter
4+
import requests
5+
6+
7+
class doge_collector():
8+
9+
def __init__(self, https_url, provider):
10+
self.https_url = https_url
11+
self.labels = [
12+
'https_url', 'provider', 'blockchain', 'network_name',
13+
'network_type'
14+
]
15+
self.labels_values = [
16+
https_url, provider, cfg.blockchain, cfg.network_name,
17+
cfg.network_type
18+
]
19+
20+
def probe(self, metrics):
21+
try:
22+
payload = {'version': '1.1', 'method': "getinfo", 'id': 1}
23+
start = perf_counter()
24+
response = requests.post(self.https_url, json=payload).json()
25+
latency = (perf_counter() - start) * 1000
26+
27+
if response:
28+
metrics['ws_rpc_health'].add_metric(self.labels_values, True)
29+
metrics['ws_rpc_latency'].add_metric(self.labels_values,
30+
latency)
31+
metrics['ws_rpc_block_height'].add_metric(
32+
self.labels_values, response['result']['blocks'])
33+
metrics['ws_rpc_total_difficulty'].add_metric(
34+
self.labels_values, response['result']['difficulty'])
35+
else:
36+
logger.error("Bad response from client {}: {}".format(
37+
strip_url(self.https_url), exc))
38+
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
39+
except requests.RequestException as exc:
40+
logger.error("Health check failed for {}: {}".format(
41+
strip_url(self.https_url), exc))
42+
metrics['ws_rpc_health'].add_metric(self.labels_values, False)
43+
except Exception as e:
44+
logger.error("Health check failed for {}: {}".format(
45+
strip_url(self.https_url), exc))
46+
metrics['ws_rpc_health'].add_metric(self.labels_values, False)

src/exporter.py

Lines changed: 69 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from collectors.cardano import cardano_collector
99
from collectors.conflux import conflux_collector
1010
from collectors.bitcoin import bitcoin_collector
11+
from collectors.dogecoin import doge_collector
1112
from settings import logger, cfg
1213

1314

@@ -27,69 +28,107 @@ def __init__(self):
2728
self._instantiate_conflux()
2829
if cfg.isBitcoin():
2930
self._instantiate_bitcoin()
31+
if cfg.isDoge():
32+
self._instantiate_doge()
3033

3134
def _instantiate_evm(self):
3235
for item in cfg.endpoints:
33-
logger.info("Initializing evm node {}".format(strip_url(item['ws_url'])))
34-
self.collectors.append(evm_collector(item['ws_url'], item['https_url'], item['provider']))
36+
logger.info("Initializing evm node {}".format(
37+
strip_url(item['ws_url'])))
38+
self.collectors.append(
39+
evm_collector(item['ws_url'], item['https_url'],
40+
item['provider']))
3541
self.labels = self.collectors[0].labels
3642

3743
def _instantiate_conflux(self):
3844
for item in cfg.endpoints:
39-
logger.info("Initializing conflux node {}".format(strip_url(item['ws_url'])))
40-
self.collectors.append(conflux_collector(item['ws_url'], item['https_url'], item['provider']))
45+
logger.info("Initializing conflux node {}".format(
46+
strip_url(item['ws_url'])))
47+
self.collectors.append(
48+
conflux_collector(item['ws_url'], item['https_url'],
49+
item['provider']))
4150
self.labels = self.collectors[0].labels
4251

4352
def _instantiate_solana(self):
4453
for item in cfg.endpoints:
45-
logger.info("Initializing solana node {}".format(strip_url(item['https_url'])))
46-
self.collectors.append(solana_collector(item['ws_url'], item['https_url'], item['provider']))
54+
logger.info("Initializing solana node {}".format(
55+
strip_url(item['https_url'])))
56+
self.collectors.append(
57+
solana_collector(item['ws_url'], item['https_url'],
58+
item['provider']))
4759
self.labels = self.collectors[0].labels
4860

4961
def _instantiate_cardano(self):
5062
for item in cfg.endpoints:
51-
logger.info("Initializing cardano node {}".format(strip_url(item['ws_url'])))
52-
self.collectors.append(cardano_collector(item['ws_url'], item['provider']))
63+
logger.info("Initializing cardano node {}".format(
64+
strip_url(item['ws_url'])))
65+
self.collectors.append(
66+
cardano_collector(item['ws_url'], item['provider']))
5367
self.labels = self.collectors[0].labels
5468

5569
def _instantiate_bitcoin(self):
5670
for item in cfg.endpoints:
57-
logger.info("Initializing bitcoin node {}".format(strip_url(item['https_url'])))
58-
self.collectors.append(bitcoin_collector(item['https_url'], item['provider']))
71+
logger.info("Initializing bitcoin node {}".format(
72+
strip_url(item['https_url'])))
73+
self.collectors.append(
74+
bitcoin_collector(item['https_url'], item['provider']))
75+
self.labels = self.collectors[0].labels
76+
77+
def _instantiate_doge(self):
78+
for item in cfg.endpoints:
79+
logger.info("Initializing doge node {}".format(
80+
strip_url(item['https_url'])))
81+
self.collectors.append(
82+
doge_collector(item['https_url'], item['provider']))
5983
self.labels = self.collectors[0].labels
6084

6185
def collect(self):
6286
metrics = {
6387
"ws_rpc_health":
64-
GaugeMetricFamily('ws_rpc_health',
65-
'Returns 1 if rpc websocket server established a connection with the probe client.',
66-
labels=self.labels),
88+
GaugeMetricFamily(
89+
'ws_rpc_health',
90+
'Returns 1 if rpc websocket server established a connection with the probe client.',
91+
labels=self.labels),
6792
"ws_rpc_latency":
68-
GaugeMetricFamily('ws_rpc_latency',
69-
'Latency in milliseconds of the websocket keepalive ping.',
70-
labels=self.labels),
93+
GaugeMetricFamily(
94+
'ws_rpc_latency',
95+
'Latency in milliseconds of the websocket keepalive ping.',
96+
labels=self.labels),
7197
"ws_rpc_disconnects":
72-
GaugeMetricFamily('ws_rpc_disconnects', 'How many times rpc has disconnected.', labels=self.labels),
98+
GaugeMetricFamily('ws_rpc_disconnects',
99+
'How many times rpc has disconnected.',
100+
labels=self.labels),
73101
"ws_rpc_block_height":
74-
GaugeMetricFamily('ws_rpc_block_height', 'Latest observed block_height.', labels=self.labels),
102+
GaugeMetricFamily('ws_rpc_block_height',
103+
'Latest observed block_height.',
104+
labels=self.labels),
75105
"ws_rpc_head_count":
76-
CounterMetricFamily('ws_rpc_head_count', 'Heads received total.', labels=self.labels),
106+
CounterMetricFamily('ws_rpc_head_count',
107+
'Heads received total.',
108+
labels=self.labels),
77109
"ws_rpc_difficulty":
78-
GaugeMetricFamily('ws_rpc_difficulty', 'Difficulty of the latest observed block.', labels=self.labels),
79-
"ws_rpc_total_difficulty":
80-
GaugeMetricFamily('ws_rpc_total_difficulty',
81-
'Total canonical chain difficulty observed from the first to the latest block.',
110+
GaugeMetricFamily('ws_rpc_difficulty',
111+
'Difficulty of the latest observed block.',
82112
labels=self.labels),
113+
"ws_rpc_total_difficulty":
114+
GaugeMetricFamily(
115+
'ws_rpc_total_difficulty',
116+
'Total canonical chain difficulty observed from the first to the latest block.',
117+
labels=self.labels),
83118
"ws_rpc_gas_price":
84-
GaugeMetricFamily('ws_rpc_gas_price', 'The current gas price in Wei.', labels=self.labels),
85-
"ws_rpc_max_priority_fee":
86-
GaugeMetricFamily('ws_rpc_max_priority_fee',
87-
'Suggested max priority fee for dynamic fee transactions in Wei.',
119+
GaugeMetricFamily('ws_rpc_gas_price',
120+
'The current gas price in Wei.',
88121
labels=self.labels),
122+
"ws_rpc_max_priority_fee":
123+
GaugeMetricFamily(
124+
'ws_rpc_max_priority_fee',
125+
'Suggested max priority fee for dynamic fee transactions in Wei.',
126+
labels=self.labels),
89127
"ws_rpc_net_peer_count":
90-
GaugeMetricFamily('ws_rpc_net_peer_count',
91-
'Number of peers currently connected to the client.',
92-
labels=self.labels)
128+
GaugeMetricFamily(
129+
'ws_rpc_net_peer_count',
130+
'Number of peers currently connected to the client.',
131+
labels=self.labels)
93132
}
94133

95134
def write_metrics(prom_collector, metrics):

src/settings.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, config_file_path: str, validation_file_path: str):
1818
self.configuration = self._load_configuration_file(config_file_path)
1919
self.blockchain = self.configuration['blockchain']
2020
# Load chain_id only if evm compatible collector
21-
if self.configuration['collector'] not in ['cardano', 'solana', 'bitcoin']:
21+
if self.configuration['collector'] not in ['cardano', 'solana', 'bitcoin', 'doge']:
2222
try:
2323
self.chain_id = self.configuration['chain_id']
2424
except KeyError:
@@ -79,6 +79,9 @@ def isConflux(self) -> bool:
7979
def isBitcoin(self) -> bool:
8080
return self.configuration['collector'] == "bitcoin"
8181

82+
def isDoge(self) -> bool:
83+
return self.configuration['collector'] == "doge"
84+
8285
def _load_configuration_file(self, path):
8386
logger.info('Loading {}'.format(path))
8487
configuration_file_schema = Schema({
@@ -91,7 +94,7 @@ def _load_configuration_file(self, path):
9194
'network_type':
9295
And(str, lambda s: s in ('Testnet', 'Mainnet')),
9396
'collector':
94-
And(str, lambda s: s in ('evm', 'cardano', 'conflux', 'solana', 'bitcoin')),
97+
And(str, lambda s: s in ('evm', 'cardano', 'conflux', 'solana', 'bitcoin', 'doge')),
9598
Optional('connection_parameters'): {
9699
Optional('open_timeout'): And(int),
97100
Optional('close_timeout'): And(int),

0 commit comments

Comments
 (0)