Skip to content

Commit b9bd779

Browse files
authored
[Fix-17173] [JVM Metrics] Fix JVM memory monitoring metrics (#17174)
1 parent 3275a76 commit b9bd779

5 files changed

Lines changed: 60 additions & 3 deletions

File tree

dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/model/BaseHeartBeat.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public class BaseHeartBeat implements HeartBeat {
3636
protected double jvmCpuUsage;
3737
protected double cpuUsage;
3838
protected double jvmMemoryUsage;
39+
private double jvmHeapUsed;
40+
private double jvmNonHeapUsed;
41+
private double jvmHeapMax;
42+
private double jvmNonHeapMax;
3943
protected double memoryUsage;
4044
protected double diskUsage;
4145
protected ServerStatus serverStatus;

dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterHeartBeatTask.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ public MasterHeartBeat getHeartBeat() {
7474
.jvmCpuUsage(systemMetrics.getJvmCpuUsagePercentage())
7575
.cpuUsage(systemMetrics.getSystemCpuUsagePercentage())
7676
.jvmMemoryUsage(systemMetrics.getJvmMemoryUsedPercentage())
77+
.jvmHeapUsed(systemMetrics.getJvmHeapUsed())
78+
.jvmHeapMax(systemMetrics.getJvmHeapMax())
79+
.jvmNonHeapUsed(systemMetrics.getJvmNonHeapUsed())
80+
.jvmNonHeapMax(systemMetrics.getJvmNonHeapMax())
7781
.memoryUsage(systemMetrics.getSystemMemoryUsedPercentage())
7882
.diskUsage(systemMetrics.getDiskUsedPercentage())
7983
.processId(processId)

dolphinscheduler-meter/src/main/java/org/apache/dolphinscheduler/meter/metrics/DefaultMetricsProvider.java

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.dolphinscheduler.common.utils.OSUtils;
2121

2222
import lombok.extern.slf4j.Slf4j;
23+
import io.micrometer.core.instrument.Meter;
2324
import io.micrometer.core.instrument.MeterRegistry;
2425

2526
@Slf4j
@@ -59,8 +60,19 @@ public SystemMetrics getSystemMetrics() {
5960
lastProcessCpuUsage = processCpuUsage;
6061
}
6162

62-
double jvmMemoryUsed = meterRegistry.get("jvm.memory.used").meter().measure().iterator().next().getValue();
63-
double jvmMemoryMax = meterRegistry.get("jvm.memory.max").meter().measure().iterator().next().getValue();
63+
// Calculate JVM memory usage and maximum values
64+
double jvmHeapUsed = calculateTotalMemory(meterRegistry, "heap", "jvm.memory.used");
65+
double jvmNonHeapUsed = calculateTotalMemory(meterRegistry, "nonheap", "jvm.memory.used");
66+
67+
double jvmHeapMax = calculateTotalMemory(meterRegistry, "heap", "jvm.memory.max");
68+
double jvmNonHeapMax = calculateTotalMemory(meterRegistry, "nonheap", "jvm.memory.max");
69+
70+
// Calculate totals
71+
double jvmMemoryUsed = jvmHeapUsed + jvmNonHeapUsed;
72+
double jvmMemoryMax = jvmHeapMax + jvmNonHeapMax;
73+
74+
// Ensure jvmMemoryMax is not zero
75+
double jvmMemoryUsedPercentage = (jvmMemoryMax > 0) ? (jvmMemoryUsed / jvmMemoryMax) : 0.0;
6476

6577
long totalSystemMemory = OSUtils.getTotalSystemMemory();
6678
long systemMemoryAvailable = OSUtils.getSystemAvailableMemoryUsed();
@@ -73,7 +85,11 @@ public SystemMetrics getSystemMetrics() {
7385
.jvmCpuUsagePercentage(processCpuUsage)
7486
.jvmMemoryUsed(jvmMemoryUsed)
7587
.jvmMemoryMax(jvmMemoryMax)
76-
.jvmMemoryUsedPercentage(jvmMemoryUsed / jvmMemoryMax)
88+
.jvmHeapUsed(jvmHeapUsed)
89+
.jvmHeapMax(jvmHeapMax)
90+
.jvmNonHeapUsed(jvmNonHeapUsed)
91+
.jvmNonHeapMax(jvmNonHeapMax)
92+
.jvmMemoryUsedPercentage(jvmMemoryUsedPercentage)
7793
.systemMemoryUsed(totalSystemMemory - systemMemoryAvailable)
7894
.systemMemoryMax(totalSystemMemory)
7995
.systemMemoryUsedPercentage((double) (totalSystemMemory - systemMemoryAvailable) / totalSystemMemory)
@@ -85,4 +101,29 @@ public SystemMetrics getSystemMetrics() {
85101
return systemMetrics;
86102
}
87103

104+
/**
105+
* Calculate the total memory usage for a specified area
106+
* This method calculates the total memory usage by iterating over all meters in the MeterRegistry that match the given name
107+
* It only sums up meters that have the same area tag and a value greater than 0
108+
*
109+
* @param meterRegistry A MeterRegistry instance used to retrieve memory data
110+
* @param area The memory area type ("heap" or "nonheap")
111+
* @param name The meter name to match, used to find related meters in the MeterRegistry
112+
* @return The total memory usage for the specified area
113+
*/
114+
private double calculateTotalMemory(MeterRegistry meterRegistry, String area, String name) {
115+
double memory = 0.0;
116+
Iterable<Meter> meters = meterRegistry.find(name).meters();
117+
for (Meter meter : meters) {
118+
if (area.equals(meter.getId().getTag("area"))) {
119+
double value = meter.measure().iterator().next().getValue();
120+
// Ignore undefined maximum values (-1)
121+
if (value > 0) {
122+
memory += value;
123+
}
124+
}
125+
}
126+
return memory;
127+
}
128+
88129
}

dolphinscheduler-meter/src/main/java/org/apache/dolphinscheduler/meter/metrics/SystemMetrics.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public class SystemMetrics {
3636
// todo: get pod memory usage
3737
private double jvmMemoryUsed;
3838
private double jvmMemoryMax;
39+
private double jvmHeapUsed;
40+
private double jvmNonHeapUsed;
41+
private double jvmHeapMax;
42+
private double jvmNonHeapMax;
3943
private double jvmMemoryUsedPercentage;
4044

4145
// System-Memory

dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/task/WorkerHeartBeatTask.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ public WorkerHeartBeat getHeartBeat() {
7171
.jvmCpuUsage(systemMetrics.getJvmCpuUsagePercentage())
7272
.cpuUsage(systemMetrics.getSystemCpuUsagePercentage())
7373
.jvmMemoryUsage(systemMetrics.getJvmMemoryUsedPercentage())
74+
.jvmHeapUsed(systemMetrics.getJvmHeapUsed())
75+
.jvmHeapMax(systemMetrics.getJvmHeapMax())
76+
.jvmNonHeapUsed(systemMetrics.getJvmNonHeapUsed())
77+
.jvmNonHeapMax(systemMetrics.getJvmNonHeapMax())
7478
.memoryUsage(systemMetrics.getSystemMemoryUsedPercentage())
7579
.diskUsage(systemMetrics.getDiskUsedPercentage())
7680
.processId(processId)

0 commit comments

Comments
 (0)