From 755ec458d57093059b83cd138f1ee13a4a5b9a5e Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Fri, 22 Jan 2021 19:14:31 +0100 Subject: [PATCH] Fixes #5787 - Make ManagedSelector report better JMX data. Added SampleStatistics to record data and JMX methods to export it. Signed-off-by: Simone Bordet --- .../org/eclipse/jetty/io/ManagedSelector.java | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java index 616176303da0..4d6fcf731c81 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java @@ -44,11 +44,14 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.annotation.ManagedAttribute; +import org.eclipse.jetty.util.annotation.ManagedOperation; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.component.Dumpable; import org.eclipse.jetty.util.component.DumpableCollection; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; +import org.eclipse.jetty.util.statistic.SampleStatistic; import org.eclipse.jetty.util.thread.ExecutionStrategy; import org.eclipse.jetty.util.thread.Scheduler; import org.eclipse.jetty.util.thread.strategy.EatWhatYouKill; @@ -86,6 +89,7 @@ public class ManagedSelector extends ContainerLifeCycle implements Dumpable private Selector _selector; private Deque _updates = new ArrayDeque<>(); private Deque _updateable = new ArrayDeque<>(); + private final SampleStatistic _keyStats = new SampleStatistic(); public ManagedSelector(SelectorManager selectorManager, int id) { @@ -144,6 +148,36 @@ protected void doStop() throws Exception super.doStop(); } + @ManagedAttribute(value = "Total number of keys", readonly = true) + public int getTotalKeys() + { + return _selector.keys().size(); + } + + @ManagedAttribute(value = "Average number of selected keys", readonly = true) + public double getAverageSelectedKeys() + { + return _keyStats.getMean(); + } + + @ManagedAttribute(value = "Maximum number of selected keys", readonly = true) + public double getMaxSelectedKeys() + { + return _keyStats.getMax(); + } + + @ManagedAttribute(value = "Total number of select() calls", readonly = true) + public long getSelectCount() + { + return _keyStats.getCount(); + } + + @ManagedOperation(value = "Resets the statistics", impact = "ACTION") + public void resetStats() + { + _keyStats.reset(); + } + protected int nioSelect(Selector selector, boolean now) throws IOException { return now ? selector.selectNow() : selector.select(); @@ -586,9 +620,12 @@ private boolean select() } _keys = selector.selectedKeys(); - _cursor = _keys.isEmpty() ? Collections.emptyIterator() : _keys.iterator(); + int selectedKeys = _keys.size(); + if (selectedKeys > 0) + _keyStats.record(selectedKeys); + _cursor = selectedKeys > 0 ? _keys.iterator() : Collections.emptyIterator(); if (LOG.isDebugEnabled()) - LOG.debug("Selector {} processing {} keys, {} updates", selector, _keys.size(), updates); + LOG.debug("Selector {} processing {} keys, {} updates", selector, selectedKeys, updates); return true; }