From c3b43b085415ba08657d8036c28568b6c0a62c17 Mon Sep 17 00:00:00 2001 From: brunobat Date: Mon, 17 Nov 2025 09:42:49 +0000 Subject: [PATCH] List JFR events used in metrics --- .../library/README.md | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/README.md b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/README.md index d77fe5b14b4f..5eed38ef70be 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/README.md +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java17/library/README.md @@ -35,16 +35,30 @@ default, and the telemetry each produces: -| JfrFeature | Default Enabled | Metrics | -|---------------------------|-----------------|-------------------------------------------------------------------------------------------------------------------| -| BUFFER_METRICS | `false` | `jvm.buffer.count`, `jvm.buffer.memory.limit`, `jvm.buffer.memory.used` | -| CLASS_LOAD_METRICS | `false` | `jvm.class.count`, `jvm.class.loaded`, `jvm.class.unloaded` | -| CONTEXT_SWITCH_METRICS | `true` | `jvm.cpu.context_switch` | -| CPU_COUNT_METRICS | `true` | `jvm.cpu.limit` | -| CPU_UTILIZATION_METRICS | `false` | `jvm.cpu.recent_utilization`, `jvm.system.cpu.utilization` | -| GC_DURATION_METRICS | `false` | `jvm.gc.duration` | -| LOCK_METRICS | `true` | `jvm.cpu.longlock` | -| MEMORY_ALLOCATION_METRICS | `true` | `jvm.memory.allocation` | -| MEMORY_POOL_METRICS | `false` | `jvm.memory.committed`, `jvm.memory.init`, `jvm.memory.limit`, `jvm.memory.used`, `jvm.memory.used_after_last_gc` | -| NETWORK_IO_METRICS | `true` | `jvm.network.io`, `jvm.network.time` | -| THREAD_METRICS | `false` | `jvm.thread.count` | +**Warning**: JFR events might not be available for all JVMs or with a GraalVM native image, therefore limiting the produced metrics. The original implementation was done for Hotspot. OpenJ9 currently (Nov. 2025) only has the VM-level JFR implementation. So events emitted at the Java level (ie. in jdk.jfr) will not be present. Meaning, jdk.SocketRead, jdk.SocketWrite won't work. + +| JfrFeature | Jfr Event names | Default Enabled | Metric names | +|---------------------------|----------------------------------------------------------------------------------------------|-----------------|-------------------------------------------------------------------------------------------------------------------| +| BUFFER_METRICS | `jdk.DirectBufferStatistics`[6] | `false` | `jvm.buffer.count`, `jvm.buffer.memory.limit`, `jvm.buffer.memory.used` | +| CLASS_LOAD_METRICS | `jdk.ClassLoadingStatistics`[5] | `false` | `jvm.class.count`, `jvm.class.loaded`, `jvm.class.unloaded` | +| CONTEXT_SWITCH_METRICS | `jdk.ThreadContextSwitchRate`[6] | `true` | `jvm.cpu.context_switch` | +| CPU_COUNT_METRICS | `jdk.ContainerConfiguration` | `true` | `jvm.cpu.limit` | +| CPU_UTILIZATION_METRICS | `jdk.CPULoad`[6] | `false` | `jvm.cpu.recent_utilization`, `jvm.system.cpu.utilization` | +| GC_DURATION_METRICS | `jdk.G1GarbageCollection`[1], `jdk.OldGarbageCollection`[4], `jdk.YoungGarbageCollection`[4] | `false` | `jvm.gc.duration` | +| LOCK_METRICS | `jdk.JavaMonitorWait` | `true` | `jvm.cpu.longlock` | +| MEMORY_ALLOCATION_METRICS | `jdk.ObjectAllocationInNewTLAB`, `jdk.ObjectAllocationOutsideTLAB`[2] | `true` | `jvm.memory.allocation` | +| MEMORY_POOL_METRICS | `jdk.G1HeapSummary`[1], `jdk.MetaspaceSummary`[2], `jdk.PSHeapSummary`[3] | `false` | `jvm.memory.committed`, `jvm.memory.init`, `jvm.memory.limit`, `jvm.memory.used`, `jvm.memory.used_after_last_gc` | +| NETWORK_IO_METRICS | `jdk.SocketRead`, `jdk.SocketWrite` | `true` | `jvm.network.io`, `jvm.network.time` | +| THREAD_METRICS | `jdk.JavaThreadStatistics` | `false` | `jvm.thread.count` | + +**[1]** - G1 doesn't exist if you use the [community edition](https://www.graalvm.org/community/) for GraalVM native image. + +**[2]** - Not applicable for GraalVM native image. + +**[3]** - No parallel GC on GraalVM native image. + +**[4]** - On GraalVM there is no true "old" and "eden" spaces. Everything is allocated in linked heap chunks. + +**[5]** - No dynamic class loading on GraalVM. + +**[6]** - Possible but not implemented on GraalVM, as of Nov. 2025.