Skip to content

Instantly share code, notes, and snippets.

@kw4s
Created June 13, 2024 08:32
Show Gist options
  • Save kw4s/8b4b3f9e076bec01f2a29f3651ce1d06 to your computer and use it in GitHub Desktop.
Save kw4s/8b4b3f9e076bec01f2a29f3651ce1d06 to your computer and use it in GitHub Desktop.
class Scratch {
public interface SampleMBean {
ObjectName getObjectName();
}
static class Sample implements SampleMBean {
ObjectName objectName;
static Sample registerBean(MBeanServer mbs) {
try {
Sample bean = new Sample();
bean.objectName = new ObjectName("io.prometheus.jmx.test:name=Sample,uuid=" + UUID.randomUUID());
mbs.registerMBean(bean, bean.objectName);
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
void unregister(MBeanServer mbs) {
try {
mbs.unregisterMBean(objectName);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public ObjectName getObjectName() {
return objectName;
}
}
public static void main(String... args) throws Exception {
PrometheusRegistry prometheusRegistry = new PrometheusRegistry();
JmxCollector jc = new JmxCollector(
"\n---\nrules:\n- pattern: `^hadoop<service=DataNode, name=DataNodeActivity-ams-hdd001-50010><>replaceBlockOpMinTime:`\n name: foo"
.replace('`', '"'))
.register(prometheusRegistry);
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
while (true) {
Sample sample = Sample.registerBean(mbs); // register bean before scrape
prometheusRegistry.scrape(); // during scrape new entry has been added to the exclusion map
sample.unregister(mbs); // unregister bean after scrape, bean no longer registered in MBeanServer, will be eligible for garbage collection on next loop iteration
// print MBeanMBeanServer and filter stats
Field cfg = JmxCollector.class.getDeclaredField("config");
cfg.setAccessible(true);
Object config = cfg.get(jc);
Field fil = config.getClass().getDeclaredField("objectNameAttributeFilter");
fil.setAccessible(true);
Object objectNameAttributeFilter = fil.get(config);
Field map = objectNameAttributeFilter.getClass().getDeclaredField("dynamicExcludeObjectNameAttributesMap");
map.setAccessible(true);
Map excludeObjectNameAttributesMap = (Map) map.get(objectNameAttributeFilter);
System.out.println("MBeanServer bean count: " + mbs.getMBeanCount());
System.out.println("Filter size: " + excludeObjectNameAttributesMap.size());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment