package com.codahale.metrics.jetty9;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.RatioGauge;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import java.util.concurrent.BlockingQueue;
import static com.codahale.metrics.MetricRegistry.name;
public class InstrumentedQueuedThreadPool extends QueuedThreadPool {
private final MetricRegistry metricRegistry;
private String prefix;
public InstrumentedQueuedThreadPool(@Name("registry") MetricRegistry registry) {
this(registry, 200);
}
public InstrumentedQueuedThreadPool(@Name("registry") MetricRegistry registry,
@Name("maxThreads") int maxThreads) {
this(registry, maxThreads, 8);
}
public InstrumentedQueuedThreadPool(@Name("registry") MetricRegistry registry,
@Name("maxThreads") int maxThreads,
@Name("minThreads") int minThreads) {
this(registry, maxThreads, minThreads, 60000);
}
public InstrumentedQueuedThreadPool(@Name("registry") MetricRegistry registry,
@Name("maxThreads") int maxThreads,
@Name("minThreads") int minThreads,
@Name("idleTimeout") int idleTimeout) {
this(registry, maxThreads, minThreads, idleTimeout, null);
}
public InstrumentedQueuedThreadPool(@Name("registry") MetricRegistry registry,
@Name("maxThreads") int maxThreads,
@Name("minThreads") int minThreads,
@Name("idleTimeout") int idleTimeout,
@Name("queue") BlockingQueue<Runnable> queue) {
this(registry, maxThreads, minThreads, idleTimeout, queue, null);
}
public InstrumentedQueuedThreadPool(@Name("registry") MetricRegistry registry,
@Name("maxThreads") int maxThreads,
@Name("minThreads") int minThreads,
@Name("idleTimeout") int idleTimeout,
@Name("queue") BlockingQueue<Runnable> queue,
@Name("prefix") String prefix) {
super(maxThreads, minThreads, idleTimeout, queue);
this.metricRegistry = registry;
this.prefix = prefix;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
@Override
protected void doStart() throws Exception {
super.doStart();
final String prefix = this.prefix == null ? name(QueuedThreadPool.class, getName()) : name(this.prefix, getName());
metricRegistry.register(name(prefix, "utilization"), new RatioGauge() {
@Override
protected Ratio getRatio() {
return Ratio.of(getThreads() - getIdleThreads(), getThreads());
}
});
metricRegistry.register(name(prefix, "utilization-max"), new RatioGauge() {
@Override
protected Ratio getRatio() {
return Ratio.of(getThreads() - getIdleThreads(), getMaxThreads());
}
});
metricRegistry.register(name(prefix, "size"), (Gauge<Integer>) this::getThreads);
metricRegistry.register(name(prefix, "jobs"), (Gauge<Integer>) () -> {
return getQueue().size();
});
metricRegistry.register(name(prefix, "jobs-queue-utilization"), new RatioGauge() {
@Override
protected Ratio getRatio() {
BlockingQueue<Runnable> queue = getQueue();
return Ratio.of(queue.size(), queue.size() + queue.remainingCapacity());
}
});
}
}