This is an automated email from the ASF dual-hosted git repository.

HuangZhenQiu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 990bc73dd25 [FLINK-39956][metrics] Add heap memory pool metrics 
(Used/Max/CollectionUsed/CollectionMax) (#28582)
990bc73dd25 is described below

commit 990bc73dd250f1a88edc104b16fb55e36b431896
Author: Yiming Jin <[email protected]>
AuthorDate: Wed Jul 1 09:53:50 2026 -0700

    [FLINK-39956][metrics] Add heap memory pool metrics 
(Used/Max/CollectionUsed/CollectionMax) (#28582)
    
    Expose per-pool heap memory metrics via instantiateMemoryPoolMetrics, 
grouped
    under a new "Pool" metric group, to surface finer-grained GC and memory pool
    information for heap pools reported by MemoryPoolMXBean.
    
    Co-authored-by: Yiming Jin <[email protected]>
---
 .../flink/runtime/metrics/util/MetricUtils.java    | 28 +++++++++++++++++++
 .../runtime/metrics/util/MetricUtilsTest.java      | 31 ++++++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git 
a/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/util/MetricUtils.java
 
b/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/util/MetricUtils.java
index e208c465400..162738ae40c 100644
--- 
a/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/util/MetricUtils.java
+++ 
b/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/util/MetricUtils.java
@@ -57,6 +57,7 @@ import java.lang.management.ClassLoadingMXBean;
 import java.lang.management.GarbageCollectorMXBean;
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryPoolMXBean;
+import java.lang.management.MemoryType;
 import java.lang.management.MemoryUsage;
 import java.lang.management.ThreadMXBean;
 import java.time.Duration;
@@ -85,6 +86,8 @@ public class MetricUtils {
 
     @VisibleForTesting static final String METRIC_GROUP_MEMORY = "Memory";
 
+    @VisibleForTesting static final String METRIC_GROUP_POOL_NAME = "Pool";
+
     @VisibleForTesting static final String METRIC_GROUP_MANAGED_MEMORY = 
"Managed";
     private static final String WRITER_SUFFIX = ": " + 
ConfigConstants.WRITER_NAME;
     private static final String COMMITTER_SUFFIX = ": " + 
ConfigConstants.COMMITTER_NAME;
@@ -263,6 +266,7 @@ public class MetricUtils {
         instantiateHeapMemoryMetrics(metrics.addGroup(METRIC_GROUP_HEAP_NAME));
         
instantiateNonHeapMemoryMetrics(metrics.addGroup(METRIC_GROUP_NONHEAP_NAME));
         instantiateMetaspaceMemoryMetrics(metrics);
+        instantiateMemoryPoolMetrics(metrics.addGroup(METRIC_GROUP_POOL_NAME));
 
         final MBeanServer con = ManagementFactory.getPlatformMBeanServer();
 
@@ -342,6 +346,30 @@ public class MetricUtils {
         }
     }
 
+    @VisibleForTesting
+    static void instantiateMemoryPoolMetrics(MetricGroup metrics) {
+        for (final MemoryPoolMXBean pool : 
ManagementFactory.getMemoryPoolMXBeans()) {
+            if (pool.getType() != MemoryType.HEAP) {
+                continue;
+            }
+            final MetricGroup poolGroup = metrics.addGroup(pool.getName());
+            poolGroup.<Long, Gauge<Long>>gauge("Used", () -> 
usageUsed(pool.getUsage()));
+            poolGroup.<Long, Gauge<Long>>gauge("Max", () -> 
usageMax(pool.getUsage()));
+            poolGroup.<Long, Gauge<Long>>gauge(
+                    "CollectionUsed", () -> 
usageUsed(pool.getCollectionUsage()));
+            poolGroup.<Long, Gauge<Long>>gauge(
+                    "CollectionMax", () -> 
usageMax(pool.getCollectionUsage()));
+        }
+    }
+
+    private static long usageUsed(MemoryUsage usage) {
+        return usage == null ? -1L : usage.getUsed();
+    }
+
+    private static long usageMax(MemoryUsage usage) {
+        return usage == null ? -1L : usage.getMax();
+    }
+
     static void instantiateFileDescriptorMetrics(MetricGroup metrics) {
         if (OperatingSystem.isWindows()) {
             if (!fileDescriptorWarningShown) {
diff --git 
a/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/util/MetricUtilsTest.java
 
b/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/util/MetricUtilsTest.java
index 8628d86fa68..b71df9a22a4 100644
--- 
a/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/util/MetricUtilsTest.java
+++ 
b/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/util/MetricUtilsTest.java
@@ -168,6 +168,37 @@ class MetricUtilsTest {
         assertThat(perSecond.getRate()).isGreaterThan(0.);
     }
 
+    @Test
+    void testMemoryPoolMetricsCompleteness() {
+        final Map<String, InterceptingOperatorMetricGroup> addedGroups = new 
HashMap<>();
+        final InterceptingOperatorMetricGroup poolMetrics =
+                new InterceptingOperatorMetricGroup() {
+                    @Override
+                    public MetricGroup addGroup(String name) {
+                        return addedGroups.computeIfAbsent(
+                                name, k -> new 
InterceptingOperatorMetricGroup());
+                    }
+                };
+
+        MetricUtils.instantiateMemoryPoolMetrics(poolMetrics);
+
+        assertThat(addedGroups)
+                .withFailMessage("Expected at least one heap memory pool group 
to be registered")
+                .isNotEmpty();
+        assertThat(addedGroups).doesNotContainKey("Metaspace");
+
+        for (Map.Entry<String, InterceptingOperatorMetricGroup> e : 
addedGroups.entrySet()) {
+            final InterceptingOperatorMetricGroup g = e.getValue();
+            assertThat(g.get("Used")).isNotNull();
+            assertThat(g.get("Max")).isNotNull();
+            assertThat(g.get("CollectionUsed")).isNotNull();
+            assertThat(g.get("CollectionMax")).isNotNull();
+            @SuppressWarnings("unchecked")
+            final Gauge<Long> used = (Gauge<Long>) g.get("Used");
+            assertThat(used.getValue()).isGreaterThanOrEqualTo(0L);
+        }
+    }
+
     @Test
     void testHeapMetricsCompleteness() {
         final InterceptingOperatorMetricGroup heapMetrics = new 
InterceptingOperatorMetricGroup();

Reply via email to