From 4df75c2fa5a0deae4b09c9f05daa933e9542f5bc Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 16:35:33 +0900 Subject: [PATCH 01/17] Add Finalized Block Height Monitoring to Exporter --- docker-compose.yml | 8 ++-- src/collectors.py | 88 ++++++++++++++++-------------------------- src/metrics.py | 12 ++++++ src/test_collectors.py | 80 +++++++++++++++++++++++++++++++------- 4 files changed, 114 insertions(+), 74 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5d1caa3..cd9ae69 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,11 +19,11 @@ services: - monitoring volumes: - type: bind - source: ${PWD}/${CONFIG_FILE_PATH} + source: ./config.yml target: /config/config.yml - - type: bind - source: ${PWD}/${VALIDATION_FILE_PATH} - target: /config/validation.yml + # - type: bind + # source: ${PWD}/${VALIDATION_FILE_PATH} + # target: /config/validation.yml prometheus: image: prom/prometheus:latest logging: diff --git a/src/collectors.py b/src/collectors.py index 52a3118..fff4fe9 100644 --- a/src/collectors.py +++ b/src/collectors.py @@ -28,6 +28,23 @@ def block_height(self): """Returns latest block height.""" return self.interface.get_message_property_to_hex('number') + def finalized_block_height(self): + """Runs a query to return finalized block height""" + payload = { + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["finalized", False], + "id": self.chain_id + } + + finalized_block = self.interface.query(payload) + if finalized_block is None: + return None + block_number_hex = finalized_block.get('number') + if block_number_hex is None: + return None + return int(block_number_hex, 16) + def heads_received(self): """Returns amount of received messages from the subscription.""" return self.interface.heads_received @@ -54,7 +71,6 @@ def client_version(self): client_version = {"client_version": version} return client_version - class ConfluxCollector(): """A collector to fetch information about conflux RPC endpoints.""" @@ -394,60 +410,6 @@ def latency(self): """Returns connection latency.""" return self.interface.latest_query_latency -class TronCollector(): - """A collector to fetch information from Tron endpoints.""" - - def __init__(self, url, labels, chain_id, **client_parameters): - - self.labels = labels - self.chain_id = chain_id - self.interface = HttpsInterface(url, client_parameters.get('open_timeout'), - client_parameters.get('ping_timeout')) - - self._logger_metadata = { - 'component': 'TronCollector', - 'url': strip_url(url) - } - self.client_version_payload = { - 'jsonrpc': '2.0', - 'method': "web3_clientVersion", - 'id': 1 - } - self.block_height_payload = { - 'jsonrpc': '2.0', - 'method': "eth_blockNumber", - 'id': 1 - } - - def alive(self): - """Returns true if endpoint is alive, false if not.""" - # Run cached query because we can also fetch client version from this - # later on. This will save us an RPC call per run. - return self.interface.cached_json_rpc_post( - self.client_version_payload) is not None - - def block_height(self): - """Cached query and returns blockheight after converting hex string value to an int""" - result = self.interface.cached_json_rpc_post(self.block_height_payload) - - if result and isinstance(result, str) and result.startswith('0x'): - return int(result, 16) - raise ValueError(f"Invalid block height result: {result}") - - def client_version(self): - """Runs a cached query to return client version.""" - version = self.interface.cached_json_rpc_post( - self.client_version_payload) - if version is None: - return None - client_version = {"client_version": version} - return client_version - - def latency(self): - """Returns connection latency.""" - return self.interface.latest_query_latency - - class EvmHttpCollector(): """A collector to fetch information from EVM HTTPS endpoints.""" @@ -472,6 +434,12 @@ def __init__(self, url, labels, chain_id, **client_parameters): 'method': "eth_blockNumber", 'id': 1 } + self.finalized_block_height_payload = { + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["finalized", False], + "id": 1 + } def alive(self): """Returns true if endpoint is alive, false if not.""" @@ -488,6 +456,16 @@ def block_height(self): return int(result, 16) raise ValueError(f"Invalid block height result: {result}") + def finalized_block_height(self): + """Cached query and returns finalized blockheight after converting hex string value to an int""" + finalized_block = self.interface.json_rpc_post(self.finalized_block_height_payload) + if finalized_block is None: + return None + block_number_hex = finalized_block.get('number') + if block_number_hex is None: + return None + return int(block_number_hex, 16) + def client_version(self): """Runs a cached query to return client version.""" version = self.interface.cached_json_rpc_post( diff --git a/src/metrics.py b/src/metrics.py index af0f8da..33011fb 100644 --- a/src/metrics.py +++ b/src/metrics.py @@ -45,6 +45,14 @@ def block_height_metric(self): 'Latest observed block_height.', labels=self._labels) + @property + def finalized_block_height_metric(self): + """Returns instantiated finalized block height metric""" + return GaugeMetricFamily( + 'brpc_finalized_block_height', + 'Latest finalized block height', + labels=self._labels) + @property def client_version_metric(self): """Returns instantiated client version metric.""" @@ -126,6 +134,7 @@ def collect(self): heads_received_metric = self._metrics_loader.heads_received_metric disconnects_metric = self._metrics_loader.disconnects_metric block_height_metric = self._metrics_loader.block_height_metric + finalized_block_height_metric = self._metrics_loader.finalized_block_height_metric client_version_metric = self._metrics_loader.client_version_metric total_difficulty_metric = self._metrics_loader.total_difficulty_metric latency_metric = self._metrics_loader.latency_metric @@ -142,6 +151,8 @@ def collect(self): client_version_metric, 'client_version') executor.submit(self._write_metric, collector, block_height_metric, 'block_height') + executor.submit(self._write_metric, collector, + finalized_block_height_metric, 'finalized_block_height') executor.submit(self._write_metric, collector, heads_received_metric, 'heads_received') executor.submit(self._write_metric, collector, @@ -159,6 +170,7 @@ def collect(self): yield heads_received_metric yield disconnects_metric yield block_height_metric + yield finalized_block_height_metric yield client_version_metric yield total_difficulty_metric yield latency_metric diff --git a/src/test_collectors.py b/src/test_collectors.py index d9e9900..16ae242 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -62,6 +62,56 @@ def test_block_height(self): self.mocked_websocket.return_value.get_message_property_to_hex.assert_called_once_with( 'number') + def test_finalized_block_height(self): + """Tests the finalized_block_height function uses the correct call and args to get finalized block height""" + payload = { + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": ["finalized", False], + "id": self.chain_id + } + self.evm_collector.finalized_block_height() + self.mocked_websocket.return_value.query.assert_called_once_with(payload) + + def test_finalized_block_height_return_none_when_query_none(self): + """Tests that finalized_block_height returns None if the query returns None""" + self.mocked_websocket.return_value.query.return_value = None + result = self.evm_collector.finalized_block_height() + self.assertEqual(None, result) + + def test_finalized_block_height_return_none_when_no_number_field(self): + """Tests that finalized_block_height returns None if the response has no 'number' field""" + self.mocked_websocket.return_value.query.return_value = {"hash": "0x123"} + result = self.evm_collector.finalized_block_height() + self.assertEqual(None, result) + + def test_finalized_block_height_return(self): + """Tests that finalized_block_height converts hex block number to integer correctly""" + mock_block_response = { + "number": "0x1a2b3c", + "hash": "0x456def" + } + self.mocked_websocket.return_value.query.return_value = mock_block_response + result = self.evm_collector.finalized_block_height() + # 0x1a2b3c = 1715004 in decimal + self.assertEqual(1715004, result) + + def test_finalized_block_height_hex_conversion(self): + """Tests that finalized_block_height handles various hex values correctly""" + test_cases = [ + ("0x0", 0), + ("0x1", 1), + ("0xff", 255), + ("0x1000", 4096) + ] + + for hex_value, expected_int in test_cases: + with self.subTest(hex_value=hex_value): + mock_block_response = {"number": hex_value} + self.mocked_websocket.return_value.query.return_value = mock_block_response + result = self.evm_collector.finalized_block_height() + self.assertEqual(expected_int, result) + def test_client_version(self): """Tests the client_version function uses the correct call and args to get client version""" payload = { @@ -735,8 +785,8 @@ def test_latency(self): self.mocked_connection.return_value.latest_query_latency = 0.123 self.assertEqual(0.123, self.aptos_collector.latency()) -class TestTronCollector(TestCase): - """Tests the Tron collector class""" +class TestEvmHttpCollector(TestCase): + """Tests the EvmHttp collector class""" def setUp(self): self.url = "https://test.com" @@ -747,7 +797,7 @@ def setUp(self): self.client_params = { "open_timeout": self.open_timeout, "ping_timeout": self.ping_timeout} with mock.patch('collectors.HttpsInterface') as mocked_connection: - self.tron_collector = collectors.TronCollector( + self.evmhttp_collector = collectors.EvmHttpCollector( self.url, self.labels, self.chain_id, **self.client_params) self.mocked_connection = mocked_connection @@ -756,7 +806,7 @@ def test_logger_metadata(self): expected_metadata = { 'component': 'TronCollector', 'url': 'test.com'} self.assertEqual(expected_metadata, - self.tron_collector._logger_metadata) + self.evmhttp_collector._logger_metadata) def test_https_interface_created(self): """Tests that the Tron collector calls the https interface with the correct args""" @@ -765,52 +815,52 @@ def test_https_interface_created(self): def test_interface_attribute_exists(self): """Tests that the interface attribute exists.""" - self.assertTrue(hasattr(self.tron_collector, 'interface')) + self.assertTrue(hasattr(self.evmhttp_collector, 'interface')) def test_alive_call(self): """Tests the alive function uses the correct call""" - self.tron_collector.alive() + self.evmhttp_collector.alive() self.mocked_connection.return_value.cached_json_rpc_post.assert_called_once_with( - self.tron_collector.client_version_payload) + self.evmhttp_collector.client_version_payload) def test_alive_false(self): """Tests the alive function returns false when post returns None""" self.mocked_connection.return_value.cached_json_rpc_post.return_value = None - result = self.tron_collector.alive() + result = self.evmhttp_collector.alive() self.assertFalse(result) def test_block_height(self): """Tests the block_height function uses the correct call to get block height""" self.mocked_connection.return_value.cached_json_rpc_post.return_value = "0x1a2b3c" - result = self.tron_collector.block_height() + result = self.evmhttp_collector.block_height() self.mocked_connection.return_value.cached_json_rpc_post.assert_called_once_with( - self.tron_collector.block_height_payload) + self.evmhttp_collector.block_height_payload) self.assertEqual(result, 1715004) def test_block_height_raises_value_error(self): """Tests that the block height raises ValueError if result is invalid""" self.mocked_connection.return_value.cached_json_rpc_post.return_value = "invalid" with self.assertRaises(ValueError): - self.tron_collector.block_height() + self.evmhttp_collector.block_height() def test_client_version(self): """Tests the client_version function uses the correct call to get client version""" self.mocked_connection.return_value.cached_json_rpc_post.return_value = "Tron/v1.0.0" - result = self.tron_collector.client_version() + result = self.evmhttp_collector.client_version() self.mocked_connection.return_value.cached_json_rpc_post.assert_called_once_with( - self.tron_collector.client_version_payload) + self.evmhttp_collector.client_version_payload) self.assertEqual(result, {"client_version": "Tron/v1.0.0"}) def test_client_version_returns_none(self): """Tests that the client_version returns None if cached_json_rpc_post returns None""" self.mocked_connection.return_value.cached_json_rpc_post.return_value = None - result = self.tron_collector.client_version() + result = self.evmhttp_collector.client_version() self.assertIsNone(result) def test_latency(self): """Tests that the latency is obtained from the interface based on latest_query_latency""" self.mocked_connection.return_value.latest_query_latency = 0.123 - self.assertEqual(0.123, self.tron_collector.latency()) + self.assertEqual(0.123, self.evmhttp_collector.latency()) class TestXRPLCollector(TestCase): """Tests the XRPL collector class""" From 3ecd6d513d72257102a8779bca6307f595345cf2 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 16:36:23 +0900 Subject: [PATCH 02/17] docker-compose --- docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index cd9ae69..5d1caa3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,11 +19,11 @@ services: - monitoring volumes: - type: bind - source: ./config.yml + source: ${PWD}/${CONFIG_FILE_PATH} target: /config/config.yml - # - type: bind - # source: ${PWD}/${VALIDATION_FILE_PATH} - # target: /config/validation.yml + - type: bind + source: ${PWD}/${VALIDATION_FILE_PATH} + target: /config/validation.yml prometheus: image: prom/prometheus:latest logging: From 1d1126f90980b3ed8aa07d0d58cc7a07867cc0f3 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:16:18 +0900 Subject: [PATCH 03/17] fix tests --- src/test_collectors.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index 16ae242..650d3e6 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -85,29 +85,23 @@ def test_finalized_block_height_return_none_when_no_number_field(self): result = self.evm_collector.finalized_block_height() self.assertEqual(None, result) - def test_finalized_block_height_return(self): - """Tests that finalized_block_height converts hex block number to integer correctly""" + def test_finalized_block_height_return_int(self): + """Tests that finalized_block_height returns integer block number correctly""" mock_block_response = { - "number": "0x1a2b3c", + "number": 1715004, # Already an integer, not hex string "hash": "0x456def" } self.mocked_websocket.return_value.query.return_value = mock_block_response result = self.evm_collector.finalized_block_height() - # 0x1a2b3c = 1715004 in decimal self.assertEqual(1715004, result) - def test_finalized_block_height_hex_conversion(self): - """Tests that finalized_block_height handles various hex values correctly""" - test_cases = [ - ("0x0", 0), - ("0x1", 1), - ("0xff", 255), - ("0x1000", 4096) - ] - - for hex_value, expected_int in test_cases: - with self.subTest(hex_value=hex_value): - mock_block_response = {"number": hex_value} + def test_finalized_block_height_various_integers(self): + """Tests that finalized_block_height handles various integer values correctly""" + test_cases = [0, 1, 255, 4096, 1000000] + + for expected_int in test_cases: + with self.subTest(block_number=expected_int): + mock_block_response = {"number": expected_int} self.mocked_websocket.return_value.query.return_value = mock_block_response result = self.evm_collector.finalized_block_height() self.assertEqual(expected_int, result) From 29c2506f1907fda70298943d5bc3ca98aa79e9c6 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:19:59 +0900 Subject: [PATCH 04/17] fix tests --- src/test_collectors.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test_collectors.py b/src/test_collectors.py index 650d3e6..f1a8cd3 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -64,6 +64,10 @@ def test_block_height(self): def test_finalized_block_height(self): """Tests the finalized_block_height function uses the correct call and args to get finalized block height""" + # Mock the response to prevent the actual logic from executing + mock_block_response = {"number": 1715004} + self.mocked_websocket.return_value.query.return_value = mock_block_response + payload = { "jsonrpc": "2.0", "method": "eth_getBlockByNumber", From 176156f08696971dbe6e3f8e35312c63139c25cb Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:25:17 +0900 Subject: [PATCH 05/17] fix tests --- src/test_collectors.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index f1a8cd3..d6b6363 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -64,8 +64,8 @@ def test_block_height(self): def test_finalized_block_height(self): """Tests the finalized_block_height function uses the correct call and args to get finalized block height""" - # Mock the response to prevent the actual logic from executing - mock_block_response = {"number": 1715004} + # Mock with hex string, not integer + mock_block_response = {"number": "0x1a2b3c"} self.mocked_websocket.return_value.query.return_value = mock_block_response payload = { @@ -89,27 +89,17 @@ def test_finalized_block_height_return_none_when_no_number_field(self): result = self.evm_collector.finalized_block_height() self.assertEqual(None, result) - def test_finalized_block_height_return_int(self): - """Tests that finalized_block_height returns integer block number correctly""" + def test_finalized_block_height_return(self): + """Tests that finalized_block_height converts hex block number to integer correctly""" mock_block_response = { - "number": 1715004, # Already an integer, not hex string + "number": "0x1a2b3c", # Hex string as your code expects "hash": "0x456def" } self.mocked_websocket.return_value.query.return_value = mock_block_response result = self.evm_collector.finalized_block_height() + # 0x1a2b3c = 1715004 in decimal self.assertEqual(1715004, result) - def test_finalized_block_height_various_integers(self): - """Tests that finalized_block_height handles various integer values correctly""" - test_cases = [0, 1, 255, 4096, 1000000] - - for expected_int in test_cases: - with self.subTest(block_number=expected_int): - mock_block_response = {"number": expected_int} - self.mocked_websocket.return_value.query.return_value = mock_block_response - result = self.evm_collector.finalized_block_height() - self.assertEqual(expected_int, result) - def test_client_version(self): """Tests the client_version function uses the correct call and args to get client version""" payload = { From 95b84e2fa554ed41ffe0b8f8f8a988943602682e Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:31:09 +0900 Subject: [PATCH 06/17] fix tests --- src/test_collectors.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index d6b6363..e92531e 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -792,12 +792,12 @@ def setUp(self): def test_logger_metadata(self): """Validate logger metadata. Makes sure url is stripped by helpers.strip_url function.""" expected_metadata = { - 'component': 'TronCollector', 'url': 'test.com'} + 'component': 'EvmHttpCollector', 'url': 'test.com'} self.assertEqual(expected_metadata, self.evmhttp_collector._logger_metadata) def test_https_interface_created(self): - """Tests that the Tron collector calls the https interface with the correct args""" + """Tests that the EvmHttp collector calls the https interface with the correct args""" self.mocked_connection.assert_called_once_with( self.url, self.open_timeout, self.ping_timeout) @@ -832,12 +832,16 @@ def test_block_height_raises_value_error(self): self.evmhttp_collector.block_height() def test_client_version(self): - """Tests the client_version function uses the correct call to get client version""" - self.mocked_connection.return_value.cached_json_rpc_post.return_value = "Tron/v1.0.0" - result = self.evmhttp_collector.client_version() - self.mocked_connection.return_value.cached_json_rpc_post.assert_called_once_with( - self.evmhttp_collector.client_version_payload) - self.assertEqual(result, {"client_version": "Tron/v1.0.0"}) + """Tests the client_version function uses the correct call and args to get client version""" + payload = { + "jsonrpc": "2.0", + "method": "web3_clientVersion", + "params": [], + "id": self.chain_id + } + self.evmhttp_collector.client_version() + self.mocked_websocket.return_value.cached_query.assert_called_once_with( + payload) def test_client_version_returns_none(self): """Tests that the client_version returns None if cached_json_rpc_post returns None""" From d99cd709378f74da3bf8bd477cd01dc690be7df6 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:32:42 +0900 Subject: [PATCH 07/17] fix tests --- src/test_collectors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index e92531e..2eee54f 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -840,7 +840,7 @@ def test_client_version(self): "id": self.chain_id } self.evmhttp_collector.client_version() - self.mocked_websocket.return_value.cached_query.assert_called_once_with( + self.mocked_connection.return_value.cached_query.assert_called_once_with( payload) def test_client_version_returns_none(self): From 88b5a23a96817f943d13a9fceffb8e3b19051062 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:35:38 +0900 Subject: [PATCH 08/17] fix tests --- src/test_collectors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index 2eee54f..aaa151f 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -840,7 +840,7 @@ def test_client_version(self): "id": self.chain_id } self.evmhttp_collector.client_version() - self.mocked_connection.return_value.cached_query.assert_called_once_with( + self.mocked_connection.return_value.cached_json_rpc_post.assert_called_once_with( payload) def test_client_version_returns_none(self): From 12f9309d28ab3ed7ee8d72c0c4dc5f2eab590169 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:37:12 +0900 Subject: [PATCH 09/17] fix tests --- src/test_collectors.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index aaa151f..6d1a3fd 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -836,7 +836,6 @@ def test_client_version(self): payload = { "jsonrpc": "2.0", "method": "web3_clientVersion", - "params": [], "id": self.chain_id } self.evmhttp_collector.client_version() From e8c802f0c27d00ba72af08dda78e8686f8b6325e Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:38:39 +0900 Subject: [PATCH 10/17] fix tests --- src/test_collectors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_collectors.py b/src/test_collectors.py index 6d1a3fd..2889bff 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -836,7 +836,7 @@ def test_client_version(self): payload = { "jsonrpc": "2.0", "method": "web3_clientVersion", - "id": self.chain_id + "id": 1 } self.evmhttp_collector.client_version() self.mocked_connection.return_value.cached_json_rpc_post.assert_called_once_with( From a29129147544a5d20b12aa5b82b537f930c91a6c Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:41:50 +0900 Subject: [PATCH 11/17] fix tests --- src/test_metrics.py | 3 ++- src/test_registries.py | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/test_metrics.py b/src/test_metrics.py index f16b3ee..856d48e 100644 --- a/src/test_metrics.py +++ b/src/test_metrics.py @@ -13,7 +13,7 @@ class TestMetricsLoader(TestCase): def setUp(self): self.metrics_loader = MetricsLoader() self.labels = [ - 'url', 'provider', 'blockchain', 'network_name', 'network_type', + 'url', 'provider', 'blockchain', 'network_name', 'network_type', 'integration_maturity', 'canonical_name', 'chain_selector', 'evmChainID' ] @@ -171,6 +171,7 @@ def test_collect_yields_correct_metrics(self): self.mocked_loader.return_value.heads_received_metric, self.mocked_loader.return_value.disconnects_metric, self.mocked_loader.return_value.block_height_metric, + self.mocked_loader.return_value.finalized_block_height_metric, self.mocked_loader.return_value.client_version_metric, self.mocked_loader.return_value.total_difficulty_metric, self.mocked_loader.return_value.latency_metric, diff --git a/src/test_registries.py b/src/test_registries.py index b8af412..143795b 100644 --- a/src/test_registries.py +++ b/src/test_registries.py @@ -148,13 +148,13 @@ def test_get_collector_registry_for_aptos(self): helper_test_collector_registry(self, collector) @mock.patch.dict(os.environ, { - "CONFIG_FILE_PATH": "tests/fixtures/configuration_tron.yaml", + "CONFIG_FILE_PATH": "tests/fixtures/configuration_evmhttp.yaml", "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" }) - def test_get_collector_registry_for_tron(self): - """Tests that the Tron collector is called with the correct args""" + def test_get_collector_registry_for_evmhttp(self): + """Tests that the EvmHttp collector is called with the correct args""" self.collector_registry = CollectorRegistry() - with mock.patch('collectors.TronCollector', new=mock.Mock()) as collector: + with mock.patch('collectors.EvmHttpCollector', new=mock.Mock()) as collector: helper_test_collector_registry(self, collector) @mock.patch.dict(os.environ, { From ed419369224bc5cebccf2b394eb2027449c017de Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:43:18 +0900 Subject: [PATCH 12/17] fix tests --- src/test_metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_metrics.py b/src/test_metrics.py index 856d48e..8e3f5a0 100644 --- a/src/test_metrics.py +++ b/src/test_metrics.py @@ -185,7 +185,7 @@ def test_collect_yields_correct_metrics(self): def test_collect_number_of_yields(self): """Tests that the collect method yields the expected number of values""" results = self.prom_collector.collect() - self.assertEqual(9, len(list(results))) + self.assertEqual(10, len(list(results))) def test_get_thread_count(self): """Tests get thread count returns the expected number of threads From f409ee219ec9cc724b3ca064c2002df2d2709894 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:44:31 +0900 Subject: [PATCH 13/17] fix tests --- src/test_metrics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test_metrics.py b/src/test_metrics.py index 8e3f5a0..8c0a927 100644 --- a/src/test_metrics.py +++ b/src/test_metrics.py @@ -191,8 +191,8 @@ def test_get_thread_count(self): """Tests get thread count returns the expected number of threads based on number of metrics and collectors""" thread_count = self.prom_collector.get_thread_count() - # Total of 9 metrics times 2 items in our mocked pool should give 18 - self.assertEqual(18, thread_count) + # Total of 10 metrics times 2 items in our mocked pool should give 20 + self.assertEqual(20, thread_count) def test_collect_thread_max_workers(self): """Tests the max workers is correct for the collect threads""" From a600b2a1aeb0edcf7bfc13985d3e526f3f5419bd Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:50:19 +0900 Subject: [PATCH 14/17] fix tests --- src/collectors.py | 2 +- src/registries.py | 2 -- src/test_collectors.py | 2 +- src/test_registries.py | 10 ---------- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/collectors.py b/src/collectors.py index fff4fe9..c67685b 100644 --- a/src/collectors.py +++ b/src/collectors.py @@ -457,7 +457,7 @@ def block_height(self): raise ValueError(f"Invalid block height result: {result}") def finalized_block_height(self): - """Cached query and returns finalized blockheight after converting hex string value to an int""" + """Returns finalized blockheight after converting hex string value to an int""" finalized_block = self.interface.json_rpc_post(self.finalized_block_height_payload) if finalized_block is None: return None diff --git a/src/registries.py b/src/registries.py index 300154f..a0a90c7 100644 --- a/src/registries.py +++ b/src/registries.py @@ -88,8 +88,6 @@ def get_collector_registry(self) -> list: collector = collectors.StarknetCollector case "aptos", "aptos": collector = collectors.AptosCollector - case "tron", "tron": - collector = collectors.TronCollector case "xrpl", "xrpl": collector = collectors.XRPLCollector case "evmhttp", other: # pylint: disable=unused-variable diff --git a/src/test_collectors.py b/src/test_collectors.py index 2889bff..0e69cb8 100644 --- a/src/test_collectors.py +++ b/src/test_collectors.py @@ -63,7 +63,7 @@ def test_block_height(self): 'number') def test_finalized_block_height(self): - """Tests the finalized_block_height function uses the correct call and args to get finalized block height""" + """Tests that finalized_block_height uses correct call and args to get finalized block""" # Mock with hex string, not integer mock_block_response = {"number": "0x1a2b3c"} self.mocked_websocket.return_value.query.return_value = mock_block_response diff --git a/src/test_registries.py b/src/test_registries.py index 143795b..5c725ff 100644 --- a/src/test_registries.py +++ b/src/test_registries.py @@ -171,16 +171,6 @@ def test_get_collector_registry_for_xrpl(self): "CONFIG_FILE_PATH": "tests/fixtures/configuration_evmhttp.yaml", "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" }) - def test_get_collector_registry_for_evmhttp(self): - """Tests that the EVM HTTP collector is called with the correct args""" - self.collector_registry = CollectorRegistry() - with mock.patch('collectors.EvmHttpCollector', new=mock.Mock()) as collector: - helper_test_collector_registry(self, collector) - - @mock.patch.dict(os.environ, { - "CONFIG_FILE_PATH": "tests/fixtures/configuration_evm.yaml", - "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" - }) def test_get_collector_registry_for_evm(self): """Tests that the evm collector is called with the correct args""" self.collector_registry = CollectorRegistry() From 48bac1665b31d2c6a674a7ed6d385e89b5e8be46 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:54:00 +0900 Subject: [PATCH 15/17] fix tests --- src/test_registries.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/test_registries.py b/src/test_registries.py index 5c725ff..1681a9d 100644 --- a/src/test_registries.py +++ b/src/test_registries.py @@ -168,7 +168,7 @@ def test_get_collector_registry_for_xrpl(self): helper_test_collector_registry(self, collector) @mock.patch.dict(os.environ, { - "CONFIG_FILE_PATH": "tests/fixtures/configuration_evmhttp.yaml", + "CONFIG_FILE_PATH": "tests/fixtures/configuration_evm.yaml", "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" }) def test_get_collector_registry_for_evm(self): @@ -177,6 +177,16 @@ def test_get_collector_registry_for_evm(self): with mock.patch('collectors.EvmCollector', new=mock.Mock()) as collector: helper_test_collector_registry(self, collector) + @mock.patch.dict(os.environ, { + "CONFIG_FILE_PATH": "tests/fixtures/configuration_evmhttp.yaml", + "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" + }) + def test_get_collector_registry_for_evm(self): + """Tests that the evm collector is called with the correct args""" + self.collector_registry = CollectorRegistry() + with mock.patch('collectors.EvmHttpCollector', new=mock.Mock()) as collector: + helper_test_collector_registry(self, collector) + @mock.patch.dict(os.environ, { "CONFIG_FILE_PATH": "tests/fixtures/configuration_unsupported_blockchain.yaml", "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" From 03973d0358a2a18e6b82ec3a7a37b7ddf397bbcb Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:55:22 +0900 Subject: [PATCH 16/17] fix tests --- src/test_registries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test_registries.py b/src/test_registries.py index 1681a9d..8e13762 100644 --- a/src/test_registries.py +++ b/src/test_registries.py @@ -181,7 +181,7 @@ def test_get_collector_registry_for_evm(self): "CONFIG_FILE_PATH": "tests/fixtures/configuration_evmhttp.yaml", "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" }) - def test_get_collector_registry_for_evm(self): + def test_get_collector_registry_for_evmhttp(self): """Tests that the evm collector is called with the correct args""" self.collector_registry = CollectorRegistry() with mock.patch('collectors.EvmHttpCollector', new=mock.Mock()) as collector: From 6994168484d03b0aa661a925c77c42b793f64f11 Mon Sep 17 00:00:00 2001 From: rodgerjohnson Date: Fri, 23 May 2025 17:57:28 +0900 Subject: [PATCH 17/17] fix tests --- src/test_registries.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/test_registries.py b/src/test_registries.py index 8e13762..1b37b84 100644 --- a/src/test_registries.py +++ b/src/test_registries.py @@ -177,16 +177,6 @@ def test_get_collector_registry_for_evm(self): with mock.patch('collectors.EvmCollector', new=mock.Mock()) as collector: helper_test_collector_registry(self, collector) - @mock.patch.dict(os.environ, { - "CONFIG_FILE_PATH": "tests/fixtures/configuration_evmhttp.yaml", - "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml" - }) - def test_get_collector_registry_for_evmhttp(self): - """Tests that the evm collector is called with the correct args""" - self.collector_registry = CollectorRegistry() - with mock.patch('collectors.EvmHttpCollector', new=mock.Mock()) as collector: - helper_test_collector_registry(self, collector) - @mock.patch.dict(os.environ, { "CONFIG_FILE_PATH": "tests/fixtures/configuration_unsupported_blockchain.yaml", "VALIDATION_FILE_PATH": "tests/fixtures/validation.yaml"