Skip to content

feat(metrics): add block transaction count and SR set change monitoring#6624

Open
warku123 wants to merge 7 commits intotronprotocol:developfrom
warku123:metric_modify_clean
Open

feat(metrics): add block transaction count and SR set change monitoring#6624
warku123 wants to merge 7 commits intotronprotocol:developfrom
warku123:metric_modify_clean

Conversation

@warku123
Copy link
Copy Markdown

@warku123 warku123 commented Apr 1, 2026

What does this PR do?

Add two new metrics enhancements for better network monitoring:

  1. Block Transaction Count Histogram

    • Replace tron:block_empty_total counter with tron:block_transaction_count histogram
    • Track transaction count distribution per block with buckets: [0, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
    • Empty blocks can be monitored via le=0.0 bucket
    • Remove unused BLOCK_EMPTY counter
  2. SR Set Change Monitoring

    • Add tron:sr_set_change counter to track SR membership changes
    • Detect SR additions and removals at each maintenance time interval
    • Labels: action (add/remove), witness (SR address)

Changes:

  • Add overloaded init() method in MetricsHistogram for custom buckets
  • Add BLOCK_TRANSACTION_COUNT histogram metric
  • Add SR_SET_CHANGE counter with SR_ADD/SR_REMOVE labels
  • Implement SR set change detection logic in BlockChainMetricManager
  • Update PrometheusApiServiceTest with comprehensive test coverage

Why are these changes required?

  • Transaction histogram provides richer insights than simple counter for network analysis while maintaining empty block detection capability
  • SR set change monitoring enables tracking of network consensus participant changes for governance analysis

Compared to #6602, this PR provides a cleaner implementation focused solely on metrics enhancement without additional complexity.

This PR has been tested by:

  • Unit Tests (updated PrometheusApiServiceTest)
  • Manual Testing

Follow up

N/A

Extra details

…monitoring

Replace the dedicated tron:block_empty_total counter with a more comprehensive
tron:block_transaction_count histogram that tracks the distribution of
transaction counts per block.

Changes:
- Add overloaded init() method in MetricsHistogram to support custom buckets
- Add BLOCK_TRANSACTION_COUNT histogram with buckets [0, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
- Record transaction count for all blocks (including empty blocks with txCount=0)
- Empty blocks can be queried via bucket le=0.0
- Remove unused BLOCK_EMPTY counter

This provides richer insights for network analysis while still supporting
empty block monitoring via histogram bucket queries.

Closes tronprotocol#6590
@warku123 warku123 changed the title feat(metrics): add block transaction count histogram for empty block monitoring feat(metrics): add block transaction count and SR set change monitoring Apr 1, 2026
warku123 added a commit to warku123/java-tron that referenced this pull request Apr 2, 2026
Replace duplicated miner string literal with MINER_LABEL constant
to fix SonarQube code smell.

Relates tronprotocol#6624
warku123 added a commit to warku123/java-tron that referenced this pull request Apr 2, 2026
- Replace duplicated miner string literal with MINER_LABEL constant
  in PrometheusApiServiceTest to fix SonarQube code smell
- Add //NOSONAR comment for new BLOCK_TRANSACTION_COUNT histogram
  label name in MetricsHistogram

Relates tronprotocol#6624
@warku123 warku123 force-pushed the metric_modify_clean branch from 4433c52 to 93d0083 Compare April 2, 2026 03:44
warku123 added a commit to warku123/java-tron that referenced this pull request Apr 2, 2026
Extract repeated 'miner' string literal into MINER_LABEL constant
in MetricsHistogram to follow DRY principle and fix SonarQube warning.

Also update PrometheusApiServiceTest to use MINER_LABEL constant
for test assertions.

Relates tronprotocol#6624
@warku123 warku123 force-pushed the metric_modify_clean branch from 93d0083 to 6315ffc Compare April 2, 2026 03:54
Extract repeated 'miner' string literal into MINER_LABEL constant
in MetricsHistogram to follow DRY principle and fix SonarQube warning.

Also update PrometheusApiServiceTest to use MINER_LABEL constant
for test assertions.

Relates tronprotocol#6624
public static final String TXS = "tron:txs";
public static final String MINER = "tron:miner";
public static final String BLOCK_FORK = "tron:block_fork";
public static final String SR_SET_CHANGE = "tron:sr_set_change";
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name tron:sr_set_change can be misleading — it sounds like it tracks changes to the entire SR set, when it actually monitors rotation of the top 27 block-producing SRs (Active Witnesses).

Suggested alternatives for better clarity:

  • tron:active_sr_change

  • tron:active_witness_change

  • tron:top27_sr_change

This way, operators can immediately understand what the metric represents when viewing Prometheus dashboards.

init(MetricKeys.Counter.TXS, "tron txs info .", "type", "detail");
init(MetricKeys.Counter.MINER, "tron miner info .", "miner", "type");
init(MetricKeys.Counter.BLOCK_FORK, "tron block fork info .", "type");
init(MetricKeys.Counter.SR_SET_CHANGE, "tron sr set change .", "action", "witness");
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The witness label uses addresses. Although the Active SR pool is relatively limited (27 slots), as SRs rotate in and out over time, label values will accumulate monotonically — they only grow, never shrink. This is a known Prometheus anti-pattern.

Practical impact assessment:

  • TRON's SR candidate pool is not infinite, and rotation frequency is low, so it won't explode in the short term

  • However, as a long-running node metric, months or years of operation could still accumulate a significant number of time series

Possible approaches:

  • If the address dimension is truly needed, keep the current design, but document this characteristic

  • Or remove the witness label entirely, keeping only action (add/remove), and output address details via logs instead. Follow the principle that Prometheus should be used for alerting and awareness, while logs are for precise investigation and root-cause analysis.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

[Feature] Add Prometheus metrics for empty blocks and SR set changes

3 participants