aboutsummaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-01-26 11:25:48 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-01-26 11:25:48 +0100
commit2dd47be649163d21bb09ca27d5e8d5973ea8f93a (patch)
tree31077135b734fda753f440c68a0b69d2dbe938ca /container-core
parent2d6ab5b6fe52e8066aa559ff6cee3cb4b1cde8bc (diff)
Use a separate thread for reporting metrics instead of doing all the on every request. 10hz should do.
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/ThreadPoolProvider.java23
1 files changed, 20 insertions, 3 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/handler/ThreadPoolProvider.java b/container-core/src/main/java/com/yahoo/container/handler/ThreadPoolProvider.java
index f6851a0683e..6a1746ccc39 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/ThreadPoolProvider.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/ThreadPoolProvider.java
@@ -9,7 +9,7 @@ import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import com.google.inject.Inject;
@@ -92,6 +92,8 @@ public class ThreadPoolProvider extends AbstractComponent implements Provider<Ex
private final Metric metric;
private final ProcessTerminator processTerminator;
private final long maxThreadExecutionTimeMillis;
+ private final Thread metricReporter;
+ private final AtomicBoolean closed = new AtomicBoolean(false);
private ExecutorServiceWrapper(WorkerCompletionTimingThreadPoolExecutor wrapped,
Metric metric, ProcessTerminator processTerminator,
@@ -104,6 +106,23 @@ public class ThreadPoolProvider extends AbstractComponent implements Provider<Ex
metric.set(MetricNames.THREAD_POOL_SIZE, wrapped.getPoolSize(), null);
metric.set(MetricNames.ACTIVE_THREADS, wrapped.getActiveCount(), null);
metric.add(MetricNames.REJECTED_REQUEST, 0, null);
+ metricReporter = new Thread(this::reportMetrics);
+ metricReporter.setDaemon(true);
+ metricReporter.start();
+ }
+
+ private final void reportMetrics() {
+ while (! closed.get() ) {
+ metric.set(MetricNames.THREAD_POOL_SIZE, wrapped.getPoolSize(), null);
+ metric.set(MetricNames.ACTIVE_THREADS, wrapped.getActiveCount(), null);
+ try {Thread.sleep(100);} catch (InterruptedException e) { }
+ }
+ }
+
+ @Override
+ public void shutdown() {
+ super.shutdown();
+ closed.set(true);
}
/**
@@ -115,8 +134,6 @@ public class ThreadPoolProvider extends AbstractComponent implements Provider<Ex
@Override
public void execute(Runnable command) {
try {
- metric.set(MetricNames.THREAD_POOL_SIZE, wrapped.getPoolSize(), null);
- metric.set(MetricNames.ACTIVE_THREADS, wrapped.getActiveCount(), null);
super.execute(command);
} catch (RejectedExecutionException e) {
metric.add(MetricNames.REJECTED_REQUEST, 1, null);