CavalliumDBEngine/src/main/java/it/cavallium/dbengine/netty/JMXNettyMonitoringManager.java

69 lines
2.7 KiB
Java
Raw Normal View History

2021-05-03 18:07:18 +02:00
package it.cavallium.dbengine.netty;
2021-09-17 16:56:28 +02:00
import io.net5.buffer.api.BufferAllocator;
import io.net5.buffer.api.DefaultGlobalBufferAllocator;
import io.net5.buffer.api.pool.MetricUtils;
import io.net5.buffer.api.pool.PoolArenaMetric;
import io.net5.buffer.api.pool.PooledBufferAllocator;
2021-05-03 18:07:18 +02:00
import java.lang.management.ManagementFactory;
2021-09-09 15:21:20 +02:00
import java.util.Map;
import java.util.Map.Entry;
2021-05-03 21:41:51 +02:00
import java.util.concurrent.atomic.AtomicInteger;
2021-09-09 15:21:20 +02:00
import java.util.stream.Stream;
2021-05-03 18:07:18 +02:00
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.StandardMBean;
public class JMXNettyMonitoringManager {
2021-05-03 21:41:51 +02:00
private final AtomicInteger nextArenaId = new AtomicInteger();
2021-05-03 18:07:18 +02:00
private static JMXNettyMonitoringManager instance;
private final MBeanServer platformMBeanServer;
private JMXNettyMonitoringManager() {
this.platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
}
2021-05-03 21:41:51 +02:00
public static void initialize() {
2021-09-09 16:18:47 +02:00
var instance = getInstance();
2021-10-01 19:17:33 +02:00
instance.register("global", DefaultGlobalBufferAllocator.DEFAULT_GLOBAL_BUFFER_ALLOCATOR);
2021-05-03 21:41:51 +02:00
}
public synchronized static JMXNettyMonitoringManager getInstance() {
2021-05-03 18:07:18 +02:00
if (instance == null) {
instance = new JMXNettyMonitoringManager();
}
2021-05-03 21:41:51 +02:00
return instance;
2021-05-03 18:07:18 +02:00
}
2021-09-09 15:34:31 +02:00
public void register(String name, BufferAllocator allocator) {
2021-05-03 21:41:51 +02:00
try {
name = name.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}_]", "_");
String type;
StandardMBean mbean;
2021-09-09 15:34:31 +02:00
if (allocator instanceof PooledBufferAllocator pooledAllocator) {
for (var arenaMetric : MetricUtils.getPoolArenaMetrics(pooledAllocator)) {
String arenaType = pooledAllocator.isDirectBufferPooled() ? "direct" : "heap";
2021-09-09 15:21:20 +02:00
var jmx = new JMXPoolArenaNettyMonitoring(arenaMetric);
mbean = new StandardMBean(jmx, JMXPoolArenaNettyMonitoringMBean.class);
ObjectName botObjectName = new ObjectName("io.netty.stats:name=PoolArena,type=" + arenaType + ",arenaId=" + nextArenaId.getAndIncrement());
platformMBeanServer.registerMBean(mbean, botObjectName);
}
2021-09-09 15:34:31 +02:00
var jmx = new JMXPooledNettyMonitoring(name, pooledAllocator);
2021-05-03 21:41:51 +02:00
type = "pooled";
mbean = new StandardMBean(jmx, JMXNettyMonitoringMBean.class);
2021-08-31 09:14:46 +02:00
ObjectName botObjectName = new ObjectName("io.netty.stats:name=ByteBufAllocator,allocatorName=" + name + ",type=" + type);
platformMBeanServer.registerMBean(mbean, botObjectName);
}
2021-09-09 16:18:47 +02:00
2021-05-03 18:07:18 +02:00
} catch (MalformedObjectNameException | NotCompliantMBeanException | InstanceAlreadyExistsException | MBeanRegistrationException e) {
throw new RuntimeException(e);
}
}
}