diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-01-26 11:25:48 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-01-26 11:25:48 +0100 |
commit | 2dd47be649163d21bb09ca27d5e8d5973ea8f93a (patch) | |
tree | 31077135b734fda753f440c68a0b69d2dbe938ca /container-core | |
parent | 2d6ab5b6fe52e8066aa559ff6cee3cb4b1cde8bc (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.java | 23 |
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); |