Troubleshooting
Overview
This page is a troubleshooting runbook for Hiero Block Nodes. It assumes you are an operator with SSH or kubectl access to both the node and the appropriate Prometheus / Grafana UI.
Use it when:
Block ingest or backfill stalls
Subscriber or Mirror Node cannot connect
Disk or storage is under pressure
Metrics or dashboards look wrong
Observability & Diagnostics
Block Nodes are generally robust, but like any distributed system component, operators occasionally encounter issues related to networking, storage, synchronization, or configuration. The reference implementation includes comprehensive logging, CLI tools, and Prometheus / Grafana metrics to identify and resolve problems quickly.
1.1 Logs & diagnostics
Logs: Single-line text logs are written to stdout / stderr (easily ingested by Loki, ELK, Splunk, etc.). In Docker / Kubernetes the format is
java.util.logging.SimpleFormatter; local dev uses a coloured single-line variant (CleanColorfulFormatter).Log levels: Controlled via values.yaml (
blockNode.logs.level):ALL FINEST FINER FINE CONFIG INFO WARNING SEVERE OFF.Key log tags to grep:
StreamPublisherPlugin: incoming blocks from consensus nodesVerificationServicePlugin: signature / proof failures
Example log lines
1.2 Prometheus metrics & monitoring
The Block Node exposes a rich set of Prometheus metrics on /metrics (default port 16007). Key Grafana dashboards are available in the official Hiero Block Node dashboards/ folder.
All metrics are prefixed with blocknode (for example, blocknode_publisher_block_items_received). See the full list in the metrics reference.
Category
Important Metrics
What to Watch For
Node State
app_state_status, app_historical_oldest_block, app_historical_newest_block
Non‑RUNNING status or stalled block height progress
Ingestion (Publisher)
publisher_block_items_received, publisher_open_connections, publisher_stream_errors, publisher_receive_latency_ns
Drop in receive rate, rising latency, or stream errors
Verification
verification_blocks_failed, verification_blocks_error, verification_block_time, hashing_block_time
Spikes in failures or verification time
Storage (Recent/Historic)
files_recent_total_bytes_stored, files_historic_total_bytes_stored, files_recent_persistence_time_latency_ns
Storage growth or persistence latency spikes
Messaging / Backpressure
messaging_item_queue_percent_used, messaging_notification_queue_percent_used
Queue saturation / backpressure
Subscribers
subscriber_open_connections, subscriber_errors
Dropped clients or streaming errors
Backfill
backfill_blocks_backfilled, backfill_fetch_errors, backfill_pending_blocks, backfill_status
Rising errors or stuck backfill status
Cloud Archive
cloud_storage_archive_failed_tasks, cloud_storage_archive_blocks_written
Archival failures or stalled block write count
Use the runbooks below during incidents. Each follows a consistent pattern:
Triage – confirm what is actually broken
Logs / Metrics / Configuration – narrow down root cause
Resolution – apply fixes
Verification – confirm recovery
Block Node not receiving new blocks
Tip: Use this runbook when ingest appears stalled and logs show little or no publish activity for new blocks.
Triage
Confirm symptoms:
publisher_block_items_receivedflat or near-zero.publisher_open_connectionsdropping toward zero.Logs show no recent block publish events.
Check node health:
Verify process is running and not crashlooping.
Confirm CPU / memory are not obviously saturated.
From a trusted host, test connectivity to the Block Node:
nc -vz <IP_OF_BLOCK_NODE> 40840Success: TCP reachability is OK.
Failure: suspect firewall, security group, or local iptables.
If
ncfails:Verify host firewall rules on both sides (Block Node and CN).
Check any intermediate firewalls / load balancers for drops.
Confirm the correct IP and port for the CN endpoint.
Logs
Search for:
Connection-related errors to consensus nodes.
Repeated reconnect attempts or backoff warnings.
Metrics
Confirm:
publisher_block_items_receivedhas stalled.publisher_stream_errorsis non-zero.
Correlate with time of any infrastructure changes (deploys, config updates, firewall changes).
Resolution
Fix firewall / security group rules on gossip / ingest port (default
40840, or configured port).Restart the Block Node if needed once connectivity is restored.
Verification
Confirm
publisher_block_items_receivedincreases steadily.publisher_open_connectionsis stable and non-zero.Logs show continuous block publish / ingest activity.
Block Node operator: subscribers cannot connect
If you operate a Mirror Node that cannot subscribe to a Block Node, see Mirror Node operator: Mirror Node cannot connect to Block Node instead.
Triage
Confirm symptoms from client side:
gRPC connection failures, timeouts, or TLS errors when subscribing.
Clients repeatedly reconnecting or backing off.
Confirm on the Block Node:
Service is running and listening on the expected gRPC port.
No obvious CPU / memory starvation.
Network and endpoint checks
From a trusted host (for example, Mirror Node):
nc -vz <IP_OF_BLOCK_NODE> <GRPC_PORT>Success: TCP reachability is OK.
Failure: suspect firewall, security group, or local iptables.
Optional gRPC sanity checks (requires
grpcurland proto files, which can be found in the Hiero Block Node repo release artifacts):
Verify the correct advertised hostname / IP and port in Block Node config, and that DNS or load balancer points to the active node.
TLS (if TLS is enabled at your ingress or proxy)
Check client logs for:
x509: certificate has expired or is not yet valid.Hostname mismatch between certificate and endpoint.
Unknown CA / trust failures.
TLS termination is at the ingress or reverse proxy in front of the Block Node, not on the Block Node itself. Confirm TLS cert and key paths are correct, readable, and not expired at that layer.
Service configuration
Ensure
stream-subscriberis present in the Block Node plugin configuration.Check any rate limits or
max-connectionssettings that might be rejecting clients.
Resolution
Fix endpoint configuration (advertise address / port), update DNS or load balancer if needed.
If using a TLS-terminating proxy or ingress, renew or reinstall certificates there and restart the proxy as needed.
Update firewall / security groups to allow gRPC traffic from subscribers.
Verification
Confirm clients successfully establish long-lived gRPC streams without continuous reconnects.
blocknode_subscriber_open_connectionsis stable and non-zero;blocknode_subscriber_errorsis not climbing.
Mirror Node operator: Mirror Node cannot connect to Block Node
Tip: Use this runbook when the Mirror Node's last committed block is not advancing, importer logs show repeated subscribe errors, or all configured Block Nodes are reported as inactive.
Triage
Confirm symptoms:
Mirror Node importer logs show repeated subscribe failures or all Block Nodes marked inactive.
The Mirror Node's last committed block is not advancing.
blocknode_subscriber_open_connectionson the Block Node side is zero or not incrementing (if you have access to it).
Network reachability
From the Mirror Node host, confirm TCP connectivity to each configured Block Node:
Success:
Connection to <BLOCK_NODE_HOST> port 40840 succeeded!— proceed to the next step.Failure: TCP reachability is broken. Check firewall rules, security groups, and that the Block Node process is running. Confirm the port matches
hiero.mirror.importer.block.nodes[].portin the Mirror Node configuration.
Block Node status
Query
serverStatusto confirm blocks are available and the gRPC endpoint is responding. See Step 1 in Connecting a Mirror Node to a Block Node for the exact command.If both
firstAvailableBlockandlastAvailableBlockequal18446744073709551615, the Block Node has not yet ingested any blocks — wait before subscribing.If
serverStatusitself fails to connect, the Block Node may be unreachable, the port may be wrong, or TLS is required but not configured on the client side.
Subscribe smoke test
Attempt a manual
subscribeBlockStreamcall from the Mirror Node host to confirm the Block Node will accept a subscription and identify the exact terminal status code. See Step 3 in Connecting a Mirror Node to a Block Node for the exact command.Match the returned
statuscode against the Troubleshooting table in Connecting a Mirror Node to a Block Node to identify the specific cause and resolution.
Mirror Node configuration
Verify:
hiero.mirror.importer.block.enabledistrue.hiero.mirror.importer.block.nodes[].hostand.portmatch the actual Block Node endpoint.hiero.mirror.importer.block.nodes[].requiresTlsmatches whether the endpoint uses TLS (falsefor plain gRPC,trueif TLS is terminated at the Block Node or a load balancer in front of it).hiero.mirror.importer.block.sourceTypeisBLOCK_NODE(orAUTOto try Block Node first and fall back to block files from cloud storage if the Block Node becomes unavailable).
Resolution
After correcting any configuration, restart the Mirror Node importer and re-run the reachability and smoke-test checks above to confirm the fix.
For each specific terminal status code or error message, consult the Troubleshooting table in Connecting a Mirror Node to a Block Node.
Verification
Confirm the Mirror Node's last committed block advances monotonically.
Importer logs show active subscribe sessions without repeated reconnects.
If you operate the Block Node,
blocknode_subscriber_open_connectionsis non-zero andblocknode_subscriber_errorsis not climbing.
Escalation
If the steps above do not resolve the issue, collect the following before opening a ticket:
Output of
nc -vz <BLOCK_NODE_HOST> <PORT>.Output of the
serverStatuscall (or the error it returned).Mirror Node importer log excerpt showing subscribe errors (remove sensitive values).
Mirror Node
application.ymlblock configuration section (remove credentials).Block Node version, if available.
If the Block Node returns unexpected status codes, errors, or is unreachable despite correct networking, open an issue in
hiero-ledger/hiero-block-node.If the Mirror Node configuration appears correct but the importer still does not connect or process blocks as expected, open an issue in
hiero-ledger/hiero-mirror-node.
Disk full / out of space
Triage
Confirm symptoms:
Node crashes, refuses new blocks, or logs I/O errors.
Alerts on storage utilization from Grafana / Prometheus.
Check capacity on the host:
df -hfor filesystem usage.iostat,files_recent_total_bytes_stored, andfiles_recent_persistence_time_latency_nsfor pressure.
Identify what is consuming space
Determine which volume(s) hold block data, snapshots, and logs.
Inspect directories for unexpected growth (logs, temp, or backup folders).
TODO: document the canonical data directory layout for Block Nodes (paths for blocks, snapshots, logs). ← GAP
Short-term mitigation
If safe, rotate / compress / prune logs.
If using partial-history nodes, enable or adjust pruning according to policy.
Temporarily add storage space to the affected volume if possible.
Longer-term resolution
For archival needs, migrate to a node with larger storage or externalize cold data.
Tune retention settings for blocks, snapshots, and logs.
Ensure monitoring alerts fire well before 100% usage (for example, at 75%, 85%, 95%).
Verification
Confirm
files_recent_total_bytes_stored(and/orfiles_historic_total_bytes_stored) and hostdf -hfall below alert thresholds.Block ingest resumes normally and no further I/O errors appear in logs.
Metrics endpoint not accessible
Triage
Confirm that Grafana / Prometheus cannot scrape
/metricsfor this Block Node.Attempt to curl from a nearby host:
curl -v http://<IP_OF_BLOCK_NODE>:16007/metricsSuccess: HTTP 200 with Prometheus text output.
Failure: connection refused / timeout.
Node-local checks
From the node itself:
curl -v http://localhost:16007/metricsIf this fails, suspect local config or process issues.
Confirm
metrics.exporter.openmetrics.http.portmatches the expected port (default16007). In Kubernetes, checkblockNode.metrics.portin your Helm values.
Bind address
If localhost works but remote scrape fails, verify the metrics server binds to
0.0.0.0(all interfaces) and not127.0.0.1(localhost only).Check
blockNode.metrics.hostnamein your Helm values (default:0.0.0.0).Outside Kubernetes, check
metrics.exporter.openmetrics.http.hostnameinapp.propertiesor via-Dmetrics.exporter.openmetrics.http.hostname=0.0.0.0.Binding to
127.0.0.1will cause all remote Prometheus scrapes to fail with "connection refused".
Network and firewall
If the bind address is correct but remote scrape still fails:
Check host firewall / security group rules for port
16007.Confirm any load balancers or service meshes expose the metrics port.
Scraper configuration
Verify Prometheus target configuration:
Correct job name, scheme (http / https), and port.
No incorrect path overrides.
Resolution
Enable metrics in config and restart the Block Node if required.
Open or adjust firewall / security rules for the metrics port.
Fix Prometheus / Grafana scrape configuration.
Verification
Confirm the Prometheus target is
UPandup\{job="block-node-metrics", instance="\<node\>"\} == 1.Grafana dashboards populate and scrape errors clear.
Blocks are not being backfilled
Triage
Confirm symptoms:
Gaps in block height or missing historical ranges expected to be present.
Backfill-related alerts firing.
Check logs for explicit backfill warnings or errors.
Metrics and topology
Review backfill metrics such as
blocknode_backfill\*:Backfill rate, errors, and lag.
Confirm which upstream nodes this node is allowed to backfill from and that they are healthy.
Configuration checks
Verify
BLOCK_NODE_EARLIEST_MANAGED_BLOCKreflects the earliest block this node should own.Verify
BACKFILL_START_BLOCK/BACKFILL_END_BLOCKare set correctly relative to available upstream history.Ensure backfill is enabled in the node configuration and not paused.
Network and permissions
Confirm this node can reach upstream Block Nodes over the required ports.
Check that any authentication / TLS between nodes is valid.
Resolution
Correct misconfigured earliest-block values (
BLOCK_NODE_EARLIEST_MANAGED_BLOCK,BACKFILL_START_BLOCK,BACKFILL_END_BLOCK) and apply changes.Restart the Block Node if configuration changes require it.
If upstream history is incomplete, coordinate with operators of archival nodes to provide the missing range.
Verification
Monitor backfill metrics until the node catches up to the desired block height.
Confirm local block height matches expected network height for the configured range.
Quick Reference Table
The table below is a summary-only quick reference. Use the runbooks above for full diagnosis and remediation steps.
Issue
Symptoms
Diagnosis
Resolution
Node not receiving new blocks
Ingest appears stalled, logs show no publish activity
Check firewall on ingest port (default 40840), Consensus Node logs
Open inbound port, ensure node is authorized / whitelisted by upstream CN; check ingress cert if using TLS termination
Block Node operator: subscribers cannot connect
gRPC connection failures; clients repeatedly reconnecting
Endpoint config; stream-subscriber plugin present; TLS cert check at ingress (if TLS is enabled)
Fix endpoint or firewall; renew ingress TLS certs (if TLS is enabled); add stream-subscriber to plugin configuration
Mirror Node operator: Mirror Node cannot connect
MN block height not advancing; repeated subscribe errors in importer logs
nc reachability; serverStatus output; subscribe smoke test; MN block.* config
Fix endpoint or firewall; correct requiresTls; see connecting guide
Disk full / out of space
Node crashes or refuses new blocks
df -h, files_recent_total_bytes_stored nearing limit
Prune old blocks (partial-history), expand volume, or migrate to archive node
Metrics endpoint not accessible
Grafana dashboards empty, Prometheus target DOWN
Port 16007 blocked or metrics disabled via config
Open port, enable metrics, fix Prometheus scrape job
Blocks not being backfilled
Log entries show backfill warnings, missing historical ranges
Check blocknode_backfill* metrics, BLOCK_NODE_EARLIEST_MANAGED_BLOCK / BACKFILL_START_BLOCK config
Fix earliest-block config, restart node if required, ensure healthy upstream archival source
For help, open a GitHub issue in hiero-ledger/hiero-block-node.
Last updated