com.codahale.metrics.InstrumentedThreadFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com.liferay.saml.opensaml.integration Show documentation
Show all versions of com.liferay.saml.opensaml.integration Show documentation
Liferay SAML OpenSAML Integration
package com.codahale.metrics;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;
/**
* A {@link ThreadFactory} that monitors the number of threads created, running and terminated.
*
* It will register the metrics using the given (or auto-generated) name as classifier, e.g:
* "your-thread-delegate.created", "your-thread-delegate.running", etc.
*/
public class InstrumentedThreadFactory implements ThreadFactory {
private static final AtomicLong nameCounter = new AtomicLong();
private final ThreadFactory delegate;
private final Meter created;
private final Counter running;
private final Meter terminated;
/**
* Wraps a {@link ThreadFactory}, uses a default auto-generated name.
*
* @param delegate {@link ThreadFactory} to wrap.
* @param registry {@link MetricRegistry} that will contain the metrics.
*/
public InstrumentedThreadFactory(ThreadFactory delegate, MetricRegistry registry) {
this(delegate, registry, "instrumented-thread-delegate-" + nameCounter.incrementAndGet());
}
/**
* Wraps a {@link ThreadFactory} with an explicit name.
*
* @param delegate {@link ThreadFactory} to wrap.
* @param registry {@link MetricRegistry} that will contain the metrics.
* @param name name for this delegate.
*/
public InstrumentedThreadFactory(ThreadFactory delegate, MetricRegistry registry, String name) {
this.delegate = delegate;
this.created = registry.meter(MetricRegistry.name(name, "created"));
this.running = registry.counter(MetricRegistry.name(name, "running"));
this.terminated = registry.meter(MetricRegistry.name(name, "terminated"));
}
/**
* {@inheritDoc}
*/
@Override
public Thread newThread(Runnable runnable) {
Runnable wrappedRunnable = new InstrumentedRunnable(runnable);
Thread thread = delegate.newThread(wrappedRunnable);
created.mark();
return thread;
}
private class InstrumentedRunnable implements Runnable {
private final Runnable task;
InstrumentedRunnable(Runnable task) {
this.task = task;
}
@Override
public void run() {
running.inc();
try {
task.run();
} finally {
running.dec();
terminated.mark();
}
}
}
}