fetch heap & nonHeap memory metrics together

This commit is contained in:
aboyko
2022-11-08 13:30:55 -05:00
parent a411663833
commit 4864c95a86
7 changed files with 111 additions and 70 deletions

View File

@@ -305,10 +305,14 @@ public class SpringProcessCommandHandler {
SpringProcessGcPausesMetricsLiveData data = connectorService.getGcPausesMetricsLiveData(processKey);
return CompletableFuture.completedFuture(data.getGcPausesMetrics());
}
case SpringProcessConnectorService.MEMORY: {
case SpringProcessConnectorService.HEAP_MEMORY: {
SpringProcessMemoryMetricsLiveData data = connectorService.getMemoryMetricsLiveData(processKey);
return CompletableFuture.completedFuture(data.getMemoryMetrics());
return CompletableFuture.completedFuture(data.getHeapMemoryMetrics());
}
case SpringProcessConnectorService.NON_HEAP_MEMORY: {
SpringProcessMemoryMetricsLiveData data = connectorService.getMemoryMetricsLiveData(processKey);
return CompletableFuture.completedFuture(data.getNonHeapMemoryMetrics());
}
default: {}
}
}

View File

@@ -149,7 +149,8 @@ public class SpringProcessConnectorOverHttp implements SpringProcessConnector {
this.processName = liveData.getProcessName();
}
if (liveData != null && liveData.getMemoryMetrics() != null && liveData.getMemoryMetrics().length > 0) {
if (liveData != null && liveData.getHeapMemoryMetrics() != null && liveData.getHeapMemoryMetrics().length > 0 &&
liveData.getNonHeapMemoryMetrics() != null && liveData.getNonHeapMemoryMetrics().length > 0) {
return liveData;
}
}

View File

@@ -159,7 +159,8 @@ public class SpringProcessConnectorOverJMX implements SpringProcessConnector {
log.info("retrieve live data from: " + jmxURL);
SpringProcessMemoryMetricsLiveData liveData = springJMXConnector.retrieveLiveMemoryMetricsData(getProcessType(), jmxConnection, processID, processName, currentData, metricName, tags);
if (liveData != null && liveData.getMemoryMetrics() != null && liveData.getMemoryMetrics().length > 0) {
if (liveData != null && liveData.getHeapMemoryMetrics() != null && liveData.getHeapMemoryMetrics().length > 0 &&
liveData.getNonHeapMemoryMetrics() != null && liveData.getNonHeapMemoryMetrics().length > 0) {
return liveData;
}
}

View File

@@ -31,7 +31,8 @@ public class SpringProcessConnectorService {
private static final String METRICS = "metrics";
public static final String GC_PAUSES = "gcPauses";
public static final String MEMORY = "memory";
public static final String HEAP_MEMORY = "heapMemory";
public static final String NON_HEAP_MEMORY = "nonHeapMemory";
private static final Logger log = LoggerFactory.getLogger(SpringProcessConnectorService.class);
@@ -175,7 +176,7 @@ public class SpringProcessConnectorService {
progressTask.progressDone();
refreshProcess(new SpringProcessParams(processKey, "", "", ""));
refreshProcess(new SpringProcessParams(processKey, METRICS, MEMORY, "area:heap"));
refreshProcess(new SpringProcessParams(processKey, METRICS, HEAP_MEMORY, "area:heap"));
refreshProcess(new SpringProcessParams(processKey, METRICS, GC_PAUSES, ""));
}
catch (Exception e) {
@@ -236,7 +237,7 @@ public class SpringProcessConnectorService {
try {
progressTask.progressEvent(progressMessage);
if(METRICS.equals(endpoint) && MEMORY.equals(metricName)) {
if(METRICS.equals(endpoint) && (HEAP_MEMORY.equals(metricName) || NON_HEAP_MEMORY.equals(metricName))) {
SpringProcessMemoryMetricsLiveData newMetricsLiveData = connector.refreshMemoryMetrics(this.liveDataProvider.getCurrent(processKey), metricName, springProcessParams.getTags());
if (newMetricsLiveData != null) {

View File

@@ -120,8 +120,8 @@ public class SpringProcessLiveDataExtractorOverHttp {
public SpringProcessMemoryMetricsLiveData retrieveLiveMemoryMetricsData(ProcessType processType, ActuatorConnection connection, String processID, String processName,
SpringProcessLiveData currentData, String metricName, String tags) {
List<String> memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max");
List<LiveMemoryMetricsModel> memoryMetricsList = new ArrayList<>();
List<LiveMemoryMetricsModel> heapMemoryMetricsList = new ArrayList<>();
List<LiveMemoryMetricsModel> nonHeapMemoryMetricsList = new ArrayList<>();
try {
@@ -137,34 +137,16 @@ public class SpringProcessLiveDataExtractorOverHttp {
}
}
LiveMemoryMetricsModel jvmMemUsedMetrics = getLiveMetrics(connection, "jvm.memory.used", tags);
if(jvmMemUsedMetrics != null) {
memoryMetricsList.add(jvmMemUsedMetrics);
Arrays.sort(jvmMemUsedMetrics.getAvailableTags()[0].getValues());
String[] memoryZones = jvmMemUsedMetrics.getAvailableTags()[0].getValues();
for(String zone : memoryZones) {
String tag = tags+",id:"+zone;
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, "jvm.memory.used", tag );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
LiveMemoryMetricsModel[] heapMemResults = getMemoryMetrics(connection, heapMemoryMetricsList, "area:heap");
LiveMemoryMetricsModel[] nonHeapMemResults = getMemoryMetrics(connection, nonHeapMemoryMetricsList, "area:nonheap");
for(String metric : memoryMetrics) {
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, metric, tags );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
}
LiveMemoryMetricsModel[] res = (LiveMemoryMetricsModel[]) memoryMetricsList.toArray(new LiveMemoryMetricsModel[memoryMetricsList.size()]);
return new SpringProcessMemoryMetricsLiveData(
processType,
processName,
processID,
res
);
heapMemResults,
nonHeapMemResults
);
}
catch (Exception e) {
log.error("error reading live metrics data from: " + processID + " - " + processName, e);
@@ -173,6 +155,36 @@ public class SpringProcessLiveDataExtractorOverHttp {
return null;
}
private LiveMemoryMetricsModel[] getMemoryMetrics(ActuatorConnection connection,
List<LiveMemoryMetricsModel> memoryMetricsList, String tags) {
List<String> memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max");
LiveMemoryMetricsModel jvmMemUsedMetrics = getLiveMetrics(connection, "jvm.memory.used", tags);
if(jvmMemUsedMetrics != null) {
memoryMetricsList.add(jvmMemUsedMetrics);
Arrays.sort(jvmMemUsedMetrics.getAvailableTags()[0].getValues());
String[] memoryZones = jvmMemUsedMetrics.getAvailableTags()[0].getValues();
for(String zone : memoryZones) {
String tag = tags+",id:"+zone;
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, "jvm.memory.used", tag );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
for(String metric : memoryMetrics) {
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, metric, tags );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
}
LiveMemoryMetricsModel[] res = (LiveMemoryMetricsModel[]) memoryMetricsList.toArray(new LiveMemoryMetricsModel[memoryMetricsList.size()]);
return res;
}
/**
* @param processType
* @param processID if null, will be determined searching existing mbeans for that information (for remote processes via platform beans runtime name)

View File

@@ -141,11 +141,10 @@ public class SpringProcessLiveDataExtractorOverJMX {
public SpringProcessMemoryMetricsLiveData retrieveLiveMemoryMetricsData(ProcessType processType, JMXConnector jmxConnector, String processID, String processName,
SpringProcessLiveData currentData, String metricName, String tags) {
List<String> memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max");
try {
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
List<LiveMemoryMetricsModel> memoryMetricsList = new ArrayList<>();
List<LiveMemoryMetricsModel> heapMemoryMetricsList = new ArrayList<>();
List<LiveMemoryMetricsModel> nonHeapMemoryMetricsList = new ArrayList<>();
String domain = getDomainForActuator(connection);
if (processID == null) {
@@ -160,34 +159,19 @@ public class SpringProcessLiveDataExtractorOverJMX {
}
}
LiveMemoryMetricsModel jvmMemUsedMetrics = getLiveMetrics(connection, domain, "jvm.memory.used", tags);
if(jvmMemUsedMetrics != null ) {
memoryMetricsList.add(jvmMemUsedMetrics);
Arrays.sort(jvmMemUsedMetrics.getAvailableTags()[0].getValues());
String[] memoryZones = jvmMemUsedMetrics.getAvailableTags()[0].getValues();
for(String zone : memoryZones) {
String tag = tags+",id:"+zone;
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, "jvm.memory.used", tag );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
for(String metric : memoryMetrics) {
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, metric, tags );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
}
LiveMemoryMetricsModel[] heapMemResults = getMemoryMetrics(connection, heapMemoryMetricsList,
domain, "area:heap");
LiveMemoryMetricsModel[] nonHeapMemResults = getMemoryMetrics(connection, nonHeapMemoryMetricsList,
domain, "area:nonheap");
LiveMemoryMetricsModel[] res = (LiveMemoryMetricsModel[]) memoryMetricsList.toArray(new LiveMemoryMetricsModel[memoryMetricsList.size()]);
return new SpringProcessMemoryMetricsLiveData(
processType,
processName,
processID,
res
);
heapMemResults,
nonHeapMemResults
);
}
catch (Exception e) {
log.error("error reading live metrics data from: " + processID + " - " + processName, e);
@@ -196,6 +180,37 @@ public class SpringProcessLiveDataExtractorOverJMX {
return null;
}
private LiveMemoryMetricsModel[] getMemoryMetrics(MBeanServerConnection connection,
List<LiveMemoryMetricsModel> memoryMetricsList, String domain, String tags) {
List<String> memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max");
LiveMemoryMetricsModel jvmMemUsedMetrics = getLiveMetrics(connection, domain, "jvm.memory.used", tags);
if(jvmMemUsedMetrics != null ) {
memoryMetricsList.add(jvmMemUsedMetrics);
Arrays.sort(jvmMemUsedMetrics.getAvailableTags()[0].getValues());
String[] memoryZones = jvmMemUsedMetrics.getAvailableTags()[0].getValues();
for(String zone : memoryZones) {
String tag = tags+",id:"+zone;
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, "jvm.memory.used", tag );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
for(String metric : memoryMetrics) {
LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, metric, tags );
if(metrics != null) {
memoryMetricsList.add(metrics);
}
}
}
LiveMemoryMetricsModel[] res = (LiveMemoryMetricsModel[]) memoryMetricsList.toArray(new LiveMemoryMetricsModel[memoryMetricsList.size()]);
return res;
}
/**
* @param processType
* @param processID if null, will be determined searching existing mbeans for that information (for remote processes via platform beans runtime name)

View File

@@ -11,25 +11,28 @@
package org.springframework.ide.vscode.boot.java.livehover.v2;
/**
* @author V Udayani
* @author V Udayani
*/
public class SpringProcessMemoryMetricsLiveData {
private final ProcessType processType;
private final String processName;
private final String processID;
private final LiveMemoryMetricsModel[] memoryMetrics;
public SpringProcessMemoryMetricsLiveData(ProcessType processType, String processName, String processID, LiveMemoryMetricsModel[] memoryMetrics) {
private final LiveMemoryMetricsModel[] heapMemoryMetrics;
private final LiveMemoryMetricsModel[] nonHeapMemoryMetrics;
public SpringProcessMemoryMetricsLiveData(ProcessType processType, String processName, String processID,
LiveMemoryMetricsModel[] heapMemoryMetrics, LiveMemoryMetricsModel[] nonHeapMemoryMetrics) {
super();
this.processType = processType;
this.processName = processName;
this.processID = processID;
this.memoryMetrics = memoryMetrics;
this.heapMemoryMetrics = heapMemoryMetrics;
this.nonHeapMemoryMetrics = nonHeapMemoryMetrics;
}
public ProcessType getProcessType() {
return processType;
}
@@ -41,9 +44,13 @@ public class SpringProcessMemoryMetricsLiveData {
public String getProcessID() {
return this.processID;
}
public LiveMemoryMetricsModel[] getMemoryMetrics() {
return this.memoryMetrics;
public LiveMemoryMetricsModel[] getHeapMemoryMetrics() {
return this.heapMemoryMetrics;
}
public LiveMemoryMetricsModel[] getNonHeapMemoryMetrics() {
return nonHeapMemoryMetrics;
}
}