diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java index 905a9a53d..d248c30fc 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java @@ -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: {} } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverHttp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverHttp.java index 10ba6dc33..fa6282bf6 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverHttp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverHttp.java @@ -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; } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverJMX.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverJMX.java index 3522ec58b..b9025d734 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverJMX.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverJMX.java @@ -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; } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java index a8f5e3a01..0c5dfc3bf 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java @@ -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) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverHttp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverHttp.java index 556846198..d1a9b1497 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverHttp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverHttp.java @@ -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 memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max"); - List memoryMetricsList = new ArrayList<>(); + List heapMemoryMetricsList = new ArrayList<>(); + List 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 memoryMetricsList, String tags) { + + List 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) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverJMX.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverJMX.java index 508c27047..ecfc97290 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverJMX.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataExtractorOverJMX.java @@ -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 memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max"); - try { MBeanServerConnection connection = jmxConnector.getMBeanServerConnection(); - List memoryMetricsList = new ArrayList<>(); + List heapMemoryMetricsList = new ArrayList<>(); + List 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 memoryMetricsList, String domain, String tags) { + + List 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) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessMemoryMetricsLiveData.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessMemoryMetricsLiveData.java index b566154cd..7a49a1904 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessMemoryMetricsLiveData.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessMemoryMetricsLiveData.java @@ -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; } }