From 81be494e9b0dffe762d70c1f3de67dadb468d698 Mon Sep 17 00:00:00 2001 From: Danny Thomas Date: Tue, 3 Sep 2024 00:21:22 +0000 Subject: [PATCH] Improve GC measures --- .../spectator/jvm/JavaFlightRecorder.java | 20 +++++++++---------- .../spectator/jvm/JavaFlightRecorderTest.java | 12 +++++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/spectator-ext-jvm/src/main/java17/com/netflix/spectator/jvm/JavaFlightRecorder.java b/spectator-ext-jvm/src/main/java17/com/netflix/spectator/jvm/JavaFlightRecorder.java index 57f0d337a..cc92989c3 100644 --- a/spectator-ext-jvm/src/main/java17/com/netflix/spectator/jvm/JavaFlightRecorder.java +++ b/spectator-ext-jvm/src/main/java17/com/netflix/spectator/jvm/JavaFlightRecorder.java @@ -35,9 +35,9 @@ public class JavaFlightRecorder { private static final String JavaThreadStatistics = PREFIX + "JavaThreadStatistics"; private static final String VirtualThreadPinned = PREFIX + "VirtualThreadPinned"; private static final String VirtualThreadSubmitFailed = PREFIX + "VirtualThreadSubmitFailed"; + private static final String YoungGarbageCollection = PREFIX + "YoungGarbageCollection"; private static final String ZAllocationStall = PREFIX + "ZAllocationStall"; private static final String ZYoungGarbageCollection = PREFIX + "ZYoungGarbageCollection"; - private static final String ZOldGarbageCollection = PREFIX + "ZOldGarbageCollection"; private JavaFlightRecorder() { } @@ -62,7 +62,7 @@ public static AutoCloseable monitorDefaultEvents(Registry registry, Executor exe collectCompilerStatistics(registry, rs); collectThreadStatistics(registry, rs); collectVirtualThreadEvents(registry, rs); - collectZgcEvents(registry, rs); + collectGcEvents(registry, rs); executor.execute(rs::start); return rs::close; } @@ -113,17 +113,15 @@ private static void collectVirtualThreadEvents(Registry registry, RecordingStrea ); } - private static void collectZgcEvents(Registry registry, RecordingStream rs) { - consume(ZYoungGarbageCollection, rs, event -> - registry.timer("jvm.zgc.youngCollection", "tenuringThreshold", event.getString("tenuringThreshold")) - .record(event.getDuration())); - - consume(ZOldGarbageCollection, rs, event -> - registry.timer("jvm.zgc.oldCollection") - .record(event.getDuration())); + private static void collectGcEvents(Registry registry, RecordingStream rs) { + Consumer tenuringThreshold = event -> + registry.gauge("jvm.gc.tenuringThreshold") + .set(event.getLong("tenuringThreshold")); + consume(YoungGarbageCollection, rs, tenuringThreshold); + consume(ZYoungGarbageCollection, rs, tenuringThreshold); consume(ZAllocationStall, rs, event -> - registry.timer("jvm.zgc.allocationStall", "type", event.getString("type")) + registry.timer("jvm.gc.allocationStall", "type", event.getString("type")) .record(event.getDuration())); } diff --git a/spectator-ext-jvm/src/test/java17/com/netflix/spectator/jvm/JavaFlightRecorderTest.java b/spectator-ext-jvm/src/test/java17/com/netflix/spectator/jvm/JavaFlightRecorderTest.java index b03d83489..40fbf3974 100644 --- a/spectator-ext-jvm/src/test/java17/com/netflix/spectator/jvm/JavaFlightRecorderTest.java +++ b/spectator-ext-jvm/src/test/java17/com/netflix/spectator/jvm/JavaFlightRecorderTest.java @@ -31,6 +31,8 @@ public class JavaFlightRecorderTest { + public static volatile Object obj; + @Test public void isSupported() { assertTrue(JavaFlightRecorder.isSupported()); @@ -41,6 +43,12 @@ public void checkDefaultMeasures() throws Exception { Registry registry = new DefaultRegistry(); ExecutorService executor = Executors.newSingleThreadExecutor(); try (var closable = JavaFlightRecorder.monitorDefaultEvents(registry, executor)) { + // allocate rapidly to trigger a GC, black holing using the approach from + // https://github.com/openjdk/jdk/blob/master/test/hotspot/jtreg/gc/testlibrary/Allocation.java + for (int i = 0; i < 100; i++) { + obj = new byte[4 * 1024 * 1024]; + obj = null; + } Thread.sleep(6000); } executor.shutdownNow(); @@ -48,6 +56,10 @@ public void checkDefaultMeasures() throws Exception { Map measures = registry.measurements() .collect(Collectors.toMap(Measurement::id, m -> m)); + Measurement tenuringThreshold = measures.get(Id.create("jvm.gc.tenuringThreshold")); + assertNotEquals(null, tenuringThreshold); + assertTrue(tenuringThreshold.value() > 0); + Measurement classesLoaded = measures.get(Id.create("jvm.classloading.classesLoaded")); Measurement classesUnloaded = measures.get(Id.create("jvm.classloading.classesUnloaded")); assertNotEquals(null, classesLoaded);