Skip to content

Commit 56e8e34

Browse files
author
liwang
committed
ZOOKEEPER-4952:Reduce the GC overhead of Prometheus reject exception handling
Author: Li Wang <liwang@apple.com>
1 parent 9d1d25c commit 56e8e34

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.util.concurrent.ConcurrentMap;
3434
import java.util.concurrent.ExecutorService;
3535
import java.util.concurrent.LinkedBlockingQueue;
36-
import java.util.concurrent.RejectedExecutionException;
36+
import java.util.concurrent.RejectedExecutionHandler;
3737
import java.util.concurrent.ThreadFactory;
3838
import java.util.concurrent.ThreadPoolExecutor;
3939
import java.util.concurrent.TimeUnit;
@@ -677,7 +677,7 @@ private Optional<ExecutorService> createExecutor() {
677677
numWorkerThreads,
678678
0L,
679679
TimeUnit.MILLISECONDS,
680-
queue, new PrometheusWorkerThreadFactory());
680+
queue, new PrometheusWorkerThreadFactory(), new PrometheusRejectedExecutionHandler());
681681
LOG.info("Executor service was created with numWorkerThreads {} and maxQueueSize {}",
682682
numWorkerThreads,
683683
maxQueueSize);
@@ -714,14 +714,21 @@ public Thread newThread(final Runnable runnable) {
714714
}
715715
}
716716

717+
private static class PrometheusRejectedExecutionHandler implements RejectedExecutionHandler {
718+
private static boolean maxQueueSizeExceeded = false;
719+
720+
@Override
721+
public void rejectedExecution(final Runnable r, final ThreadPoolExecutor e) {
722+
if (!maxQueueSizeExceeded) {
723+
maxQueueSizeExceeded = true;
724+
LOG.warn("Prometheus metrics queue size exceeded the max");
725+
}
726+
}
727+
}
728+
717729
private void reportMetrics(final Runnable task) {
718730
if (executorOptional.isPresent()) {
719-
try {
720-
executorOptional.get().submit(task);
721-
} catch (final RejectedExecutionException e) {
722-
rateLogger.rateLimitLog("Prometheus metrics reporting task queue size exceeded the max",
723-
String.valueOf(maxQueueSize));
724-
}
731+
executorOptional.get().submit(task);
725732
} else {
726733
task.run();
727734
}

0 commit comments

Comments
 (0)