Skip to content

Commit ba220f7

Browse files
kebuubrian-brazil
authored andcommitted
Add a class cast check to avoid ClassCastException (#505)
FIX #504 Signed-off-by: Christophe TARDELLA <christophe.tardella@gmail.com>
1 parent cc85e9a commit ba220f7

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

simpleclient_hotspot/src/main/java/io/prometheus/client/hotspot/MemoryAllocationExports.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ public class MemoryAllocationExports extends Collector {
2525

2626
public MemoryAllocationExports() {
2727
AllocationCountingNotificationListener listener = new AllocationCountingNotificationListener(allocatedCounter);
28-
for (GarbageCollectorMXBean garbageCollectorMXBean : ManagementFactory.getGarbageCollectorMXBeans()) {
29-
((NotificationEmitter) garbageCollectorMXBean).addNotificationListener(listener, null, null);
28+
for (GarbageCollectorMXBean garbageCollectorMXBean : getGarbageCollectorMXBeans()) {
29+
if (garbageCollectorMXBean instanceof NotificationEmitter) {
30+
((NotificationEmitter) garbageCollectorMXBean).addNotificationListener(listener, null, null);
31+
}
3032
}
3133
}
3234

@@ -97,4 +99,8 @@ private static long getAndSet(Map<String, Long> map, String key, long value) {
9799
return last == null ? 0 : last;
98100
}
99101
}
102+
103+
protected List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
104+
return ManagementFactory.getGarbageCollectorMXBeans();
105+
}
100106
}

simpleclient_hotspot/src/test/java/io/prometheus/client/hotspot/MemoryAllocationExportsTest.java

+23
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
import io.prometheus.client.Counter;
44
import org.junit.Test;
5+
import org.mockito.Mockito;
6+
7+
import javax.management.NotificationEmitter;
8+
import javax.management.NotificationFilter;
9+
import java.lang.management.GarbageCollectorMXBean;
10+
import java.util.Arrays;
11+
import java.util.List;
512

613
import static org.junit.Assert.assertEquals;
714

@@ -42,4 +49,20 @@ public void testListenerLogic() {
4249
listener.handleMemoryPool("TestPool", 17, 20);
4350
assertEquals(153, child.get(), 0.001);
4451
}
52+
53+
@Test
54+
public void testConstructorShouldIgnoreNotNotificationEmitterClasses() {
55+
final GarbageCollectorMXBean notificationEmitterMXBean = Mockito.mock(GarbageCollectorMXBean.class, Mockito.withSettings().extraInterfaces(NotificationEmitter.class));
56+
final GarbageCollectorMXBean notNotificationEmitterMXBean = Mockito.mock(GarbageCollectorMXBean.class);
57+
58+
new MemoryAllocationExports() {
59+
@Override
60+
protected List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
61+
return Arrays.asList(notificationEmitterMXBean, notNotificationEmitterMXBean);
62+
}
63+
};
64+
65+
Mockito.verify((NotificationEmitter) notificationEmitterMXBean).addNotificationListener(Mockito.any(MemoryAllocationExports.AllocationCountingNotificationListener.class), Mockito.isNull(NotificationFilter.class), Mockito.isNull());
66+
Mockito.verifyZeroInteractions(notNotificationEmitterMXBean);
67+
}
4568
}

0 commit comments

Comments
 (0)