Source code for teatime.plugins.eth1.sync

"""This module contains a plugin checking for node sync issues."""

from teatime.plugins import Context, JSONRPCPlugin
from teatime.reporting import Issue, Severity


[docs]class NodeSync(JSONRPCPlugin): """Check the node's sync state and whether it's stuck. Severity: None/Critical This plugin fetches the sync state if the node. If it is not syncing, the most recent block number is fetched from Infura using the :code:`eth_blockNumber` method. If the most recent block number is higher than the node's block number with a certain threshold, the node might be stuck and out of sync with the mainnet. In that case, a critical issue is logged. Otherwise, an informational issue on the current sync state is logged. """ INTRUSIVE = False def __init__(self, infura_url, block_threshold: int = 10): self.infura_url = infura_url self.block_threshold = block_threshold def _check(self, context: Context) -> None: node_syncing = self.get_rpc_json(context.target, "eth_syncing") node_blocknum = int(self.get_rpc_json(context.target, "eth_blockNumber"), 16) net_blocknum = self.get_rpc_int(self.infura_url, "eth_blockNumber") if node_blocknum < (net_blocknum - self.block_threshold) and not node_syncing: context.report.add_issue( Issue( title="Synchronization Status", description=( "The node's block number is stale and " "its not synchronizing. The node is stuck!" ), raw_data=node_syncing, severity=Severity.CRITICAL, ) ) else: context.report.add_issue( Issue( title="Synchronization Status", description=f"Syncing: {node_syncing} Block Number: {node_blocknum}", raw_data=node_syncing, severity=Severity.NONE, ) )