in geronimo-metrics-extensions/geronimo-metrics-tomcat/src/main/java/org/apache/geronimo/microprofile/metrics/extension/tomcat/TomcatRegistrar.java [54:104]
public void start() {
final Collection<Integer> ports = new HashSet<>();
Stream.concat(
findServers(),
StreamSupport.stream(ServiceLoader.load(ServerRegistration.class).spliterator(), false)
.map(Supplier::get))
.filter(Objects::nonNull)
.distinct()
.map(Server::findServices)
.flatMap(Stream::of)
.map(Service::findConnectors)
.flatMap(Stream::of)
.map(Connector::getProtocolHandler)
.filter(AbstractProtocol.class::isInstance)
.map(AbstractProtocol.class::cast)
.forEach(protocol -> {
final Executor executor = protocol.getExecutor();
final int port = protocol.getPort();
if (!ports.add(port)) {
return;
}
final String prefix = "server.executor.port_" + port + ".";
if (java.util.concurrent.ThreadPoolExecutor.class.isInstance(executor)) {
final java.util.concurrent.ThreadPoolExecutor pool =
java.util.concurrent.ThreadPoolExecutor.class.cast(executor);
addGauge(prefix + "queue.size", "Connector Queue Size", () -> pool.getQueue().size());
addGauge(prefix + "active", "Connector Active Count", pool::getActiveCount);
addGauge(prefix + "tasks.completed", "Connector Completed Tasks", pool::getCompletedTaskCount);
addGauge(prefix + "tasks.count", "Connector Tasks Count", pool::getTaskCount);
}
if (ThreadPoolExecutor.class.isInstance(executor)) {
final ThreadPoolExecutor pool = ThreadPoolExecutor.class.cast(executor);
addGauge(prefix + "submitted", "Connector Submitted Tasks", pool::getSubmittedCount);
}
});
// plain tomcat, test on jmx, not as rich as from the instance (this is why we have a SPI)
final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
try {
server.queryMBeans(new ObjectName("*:type=ThreadPool,*"), null).stream()
.map(ObjectInstance::getObjectName)
.filter(it -> ports.add(getPort(it)))
.forEach(name -> {
final String prefix = "server.executor.port_" + getPort(name) + ".";
addGauge(prefix + "thread.count", "Connector Thread Count", () -> Number.class.cast(server.getAttribute(name, "currentThreadCount")));
addGauge(prefix + "active", "Connector Thread Busy", () -> Number.class.cast(server.getAttribute(name, "currentThreadsBusy")));
});
} catch (final Exception e) {
// no-op
}
}