Skip to content

Commit b33c049

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 b33c049

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

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

Lines changed: 17 additions & 10 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;
@@ -51,7 +51,6 @@
5151
import org.apache.zookeeper.metrics.MetricsProviderLifeCycleException;
5252
import org.apache.zookeeper.metrics.Summary;
5353
import org.apache.zookeeper.metrics.SummarySet;
54-
import org.apache.zookeeper.server.RateLogger;
5554
import org.eclipse.jetty.security.ConstraintMapping;
5655
import org.eclipse.jetty.security.ConstraintSecurityHandler;
5756
import org.eclipse.jetty.server.Server;
@@ -102,7 +101,6 @@ public class PrometheusMetricsProvider implements MetricsProvider {
102101
* </p>
103102
*/
104103
private final CollectorRegistry collectorRegistry = CollectorRegistry.defaultRegistry;
105-
private final RateLogger rateLogger = new RateLogger(LOG, 60 * 1000);
106104
private String host = "0.0.0.0";
107105
private int httpPort = -1;
108106
private int httpsPort = -1;
@@ -677,7 +675,9 @@ private Optional<ExecutorService> createExecutor() {
677675
numWorkerThreads,
678676
0L,
679677
TimeUnit.MILLISECONDS,
680-
queue, new PrometheusWorkerThreadFactory());
678+
queue,
679+
new PrometheusWorkerThreadFactory(),
680+
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)