This is an automated email from the ASF dual-hosted git repository.
li4wang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new 9e8296f67 ZOOKEEPER-4952:Reduce the GC overhead of Prometheus reject
exception handling (#2279)
9e8296f67 is described below
commit 9e8296f678a9de8d9c30e3bc086a79c0cd39ef65
Author: li4wang <[email protected]>
AuthorDate: Wed Aug 27 14:47:37 2025 -0700
ZOOKEEPER-4952:Reduce the GC overhead of Prometheus reject exception
handling (#2279)
Author: Li Wang <[email protected]>
Reviewers: kezhuw
---
.../prometheus/PrometheusMetricsProvider.java | 22 ++++++++++++++--------
.../org/apache/zookeeper/server/RateLogger.java | 22 ++++++++++++++--------
2 files changed, 28 insertions(+), 16 deletions(-)
diff --git
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
index cae081f26..d41b0ad5a 100644
---
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
+++
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
@@ -33,7 +33,7 @@
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -677,7 +677,9 @@ private Optional<ExecutorService> createExecutor() {
numWorkerThreads,
0L,
TimeUnit.MILLISECONDS,
- queue, new PrometheusWorkerThreadFactory());
+ queue,
+ new PrometheusWorkerThreadFactory(),
+ new PrometheusRejectedExecutionHandler());
LOG.info("Executor service was created with numWorkerThreads {} and
maxQueueSize {}",
numWorkerThreads,
maxQueueSize);
@@ -714,14 +716,18 @@ public Thread newThread(final Runnable runnable) {
}
}
+ private class PrometheusRejectedExecutionHandler implements
RejectedExecutionHandler {
+ private final String queueExceededMessage = "Prometheus metrics queue
size exceeded the max " + maxQueueSize;
+
+ @Override
+ public void rejectedExecution(final Runnable r, final
ThreadPoolExecutor e) {
+ rateLogger.rateLimitLog(queueExceededMessage);
+ }
+ }
+
private void reportMetrics(final Runnable task) {
if (executorOptional.isPresent()) {
- try {
- executorOptional.get().submit(task);
- } catch (final RejectedExecutionException e) {
- rateLogger.rateLimitLog("Prometheus metrics reporting task
queue size exceeded the max",
- String.valueOf(maxQueueSize));
- }
+ executorOptional.get().submit(task);
} else {
task.run();
}
diff --git
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/RateLogger.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/RateLogger.java
index 21e41b4fb..33908c72e 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/RateLogger.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/RateLogger.java
@@ -46,15 +46,20 @@ public RateLogger(Logger log, long interval) {
public void flush() {
if (msg != null && count > 0) {
- String log = "";
+ // Optimized logging using parameterized messages to reduce string
concatenation overhead
if (count > 1) {
- log = "[" + count + " times] ";
+ if (value != null) {
+ LOG.warn("[{} times] Message: {} Last value:{}", count,
msg, value);
+ } else {
+ LOG.warn("[{} times] Message: {}", count, msg);
+ }
+ } else {
+ if (value != null) {
+ LOG.warn("Message: {} Value:{}", msg, value);
+ } else {
+ LOG.warn("Message: {}", msg);
+ }
}
- log += "Message: " + msg;
- if (value != null) {
- log += " Last value:" + value;
- }
- LOG.warn(log);
}
msg = null;
value = null;
@@ -70,7 +75,8 @@ public void rateLimitLog(String newMsg) {
*/
public void rateLimitLog(String newMsg, String newValue) {
long now = Time.currentElapsedTime();
- if (Objects.equals(newMsg, msg)) {
+ // Optimized string comparison: use reference equality first for
constant strings
+ if (newMsg == msg || Objects.equals(newMsg, msg)) {
++count;
value = newValue;
if (now - timestamp >= LOG_INTERVAL) {