Skip to content

[ISSUE #10441] Reduce per-RPC allocation in metrics by caching static AttributeKey instances#10443

Open
wang-jiahua wants to merge 1 commit into
apache:developfrom
wang-jiahua:perf/static-attributekey-metrics-caching
Open

[ISSUE #10441] Reduce per-RPC allocation in metrics by caching static AttributeKey instances#10443
wang-jiahua wants to merge 1 commit into
apache:developfrom
wang-jiahua:perf/static-attributekey-metrics-caching

Conversation

@wang-jiahua

Copy link
Copy Markdown

Cache OpenTelemetry AttributeKey instances as static finals instead of creating new instances per RPC call. Also optimize TopicMessageType lookup, add volatile inline cache for RemotingCodeDistributionHandler, and add Logback NopStatusListener to suppress startup log noise.

Which Issue(s) This PR Fixes

Brief Description

Cache OpenTelemetry AttributeKey instances as static finals instead of creating new ones per RPC call. JFR heap dump shows 38,182 AttributeKey instances with only 6 distinct key names — each RPC allocates 3-4 throwaway key objects.

Changes:

  • BrokerMetricsConstant / RemotingMetricsConstant: String labels → AttributeKey<T> static finals
  • BrokerMetricsManager / RemotingMetricsManager / PopMetricsManager: use put(AttributeKey, value) overloads
  • RemotingCodeDistributionHandler: volatile inline cache for counter methods
  • TopicMessageType: direct if-else lookup replacing values() iteration
  • rmq.broker.logback.xml: add NopStatusListener

How Did You Test This Change?

  • JFR profiling (ObjectAllocationSample) on 4×ECS (8c/30G), 128 producer threads, 1KB body, Temurin JDK 21
  • Verified all existing metrics report identically before/after
  • Zero functional change — only metric label construction paths affected

Copilot AI review requested due to automatic review settings June 8, 2026 09:21

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR focuses on reducing allocation/CPU overhead on metrics and remoting hot paths by introducing AttributeKey singletons and adding small caches for frequently repeated attribute/metric lookups.

Changes:

  • Added fast-path caching for remoting request/response code distribution counting.
  • Introduced typed OpenTelemetry AttributeKey constants and attribute caching/build helpers in remoting and broker metrics.
  • Reduced repeated string allocations (e.g., cached lowercase metrics value, avoided Map.getOrDefault boxing paths).

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
remoting/src/main/java/org/apache/rocketmq/remoting/netty/RemotingCodeDistributionHandler.java Adds “last code” fast path to reduce map lookups for hot request/response codes.
remoting/src/main/java/org/apache/rocketmq/remoting/metrics/RemotingMetricsManager.java Adds attribute caching and typed label keys to reduce OpenTelemetry attribute overhead.
remoting/src/main/java/org/apache/rocketmq/remoting/metrics/RemotingMetricsConstant.java Introduces typed AttributeKey singletons for labels.
remoting/src/main/java/org/apache/rocketmq/remoting/common/RemotingHelper.java Minor optimization to avoid getOrDefault overhead for code descriptions.
common/src/main/java/org/apache/rocketmq/common/attribute/TopicMessageType.java Caches lowercase metrics value to avoid repeated conversions.
broker/src/main/resources/rmq.broker.logback.xml Suppresses Logback status output via NopStatusListener.
broker/src/main/java/org/apache/rocketmq/broker/metrics/PopMetricsManager.java Switches to typed label keys for attributes.
broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java Adds topic attributes cache and switches to typed label keys.
broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsConstant.java Introduces typed AttributeKey singletons for broker metrics labels.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread broker/src/main/resources/rmq.broker.logback.xml
@wang-jiahua wang-jiahua force-pushed the perf/static-attributekey-metrics-caching branch 2 times, most recently from 607c58a to 52c49e8 Compare June 8, 2026 10:02
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 28.82883% with 79 lines in your changes missing coverage. Please review.
✅ Project coverage is 47.95%. Comparing base (82a6a78) to head (52c49e8).

Files with missing lines Patch % Lines
.../rocketmq/broker/metrics/BrokerMetricsManager.java 4.76% 40 Missing ⚠️
...ketmq/remoting/metrics/RemotingMetricsManager.java 0.00% 24 Missing ⚠️
...etmq/remoting/metrics/RemotingMetricsConstant.java 0.00% 5 Missing ⚠️
...che/rocketmq/broker/metrics/PopMetricsManager.java 33.33% 4 Missing ⚠️
...pache/rocketmq/remoting/common/RemotingHelper.java 0.00% 4 Missing ⚠️
...emoting/netty/RemotingCodeDistributionHandler.java 85.71% 0 Missing and 2 partials ⚠️
Additional details and impacted files
@@              Coverage Diff              @@
##             develop   #10443      +/-   ##
=============================================
- Coverage      48.05%   47.95%   -0.10%     
+ Complexity     13311    13288      -23     
=============================================
  Files           1377     1377              
  Lines         100632   100707      +75     
  Branches       12995    13006      +11     
=============================================
- Hits           48359    48295      -64     
- Misses         46351    46467     +116     
- Partials        5922     5945      +23     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@oss-sentinel-ai oss-sentinel-ai left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review by github-manager-bot

Summary

This PR caches OpenTelemetry AttributeKey instances as static finals to avoid per-RPC allocation, optimizes TopicMessageType lookup, adds a volatile inline cache for RemotingCodeDistributionHandler, and adds Logback NopStatusListener to suppress startup log noise.

Findings

  • [Good] BrokerMetricsConstant.java:69-86 — Pre-built typed AttributeKey singletons eliminate per-call allocation on the metrics hot path.
  • [Good] BrokerMetricsManager.java:105-120 — Import changes correctly reference the new cached keys.
  • [Good] RemotingCodeDistributionHandler.java:35-68 — Volatile inline cache pattern correctly avoids ConcurrentHashMap.computeIfAbsent() on repeated request codes.
  • [Good] TopicMessageType.java — Enum-based lookup is more efficient than string comparison.
  • [Good] rmq.broker.logback.xml — NopStatusListener suppresses Logback startup noise in production.

Suggestions

  1. The volatile inline cache pattern in RemotingCodeDistributionHandler is effective for sequential workloads. Consider documenting that this optimization assumes temporal locality in request codes.
  2. Consider adding a microbenchmark to quantify the allocation reduction.

Verdict

Approved — Solid performance optimization with clean implementation.


Automated review by github-manager-bot

@wang-jiahua wang-jiahua force-pushed the perf/static-attributekey-metrics-caching branch from 52c49e8 to d61959d Compare June 9, 2026 09:46
…static AttributeKey instances

Cache OpenTelemetry AttributeKey instances as static finals instead of
creating new instances per RPC call. Also optimize TopicMessageType
lookup, add volatile inline cache for RemotingCodeDistributionHandler,
and add Logback NopStatusListener to suppress startup log noise.
@wang-jiahua wang-jiahua force-pushed the perf/static-attributekey-metrics-caching branch from d61959d to 994bf3d Compare June 10, 2026 06:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Enhancement] Reduce per-RPC allocation in metrics and remoting by caching static AttributeKey instances

5 participants