-
-
Save kw4s/8b4b3f9e076bec01f2a29f3651ce1d06 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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