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) {

Reply via email to