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 58460b26b..03308a34b 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 @@ -150,7 +150,7 @@ public class SpringProcessCommandHandler { String processKey = getProcessKey(params); String endpoint = getArgumentByKey(params, "endpoint"); if (processKey != null) { - connectorService.refreshProcess(processKey, endpoint, ""); + connectorService.refreshProcess(processKey, endpoint, "", null); } return CompletableFuture.completedFuture(null); @@ -160,8 +160,9 @@ public class SpringProcessCommandHandler { String processKey = getProcessKey(params); String endpoint = getArgumentByKey(params, "endpoint"); String metricName = getArgumentByKey(params, "metricName"); + String tags = getArgumentByKey(params, "tags"); if (processKey != null) { - connectorService.refreshProcess(processKey, endpoint, metricName); + connectorService.refreshProcess(processKey, endpoint, metricName, tags); } return CompletableFuture.completedFuture(null); @@ -245,8 +246,10 @@ public class SpringProcessCommandHandler { } else if (arg instanceof JsonObject) { JsonElement element = ((JsonObject) arg).get(name); - if (element != null) { - return element.getAsString(); + if (element != null && element instanceof JsonObject) { + return element.toString(); + } else if ( element != null) { + return element.getAsString(); } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnector.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnector.java index 534621726..3e8d22bab 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnector.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnector.java @@ -27,6 +27,6 @@ public interface SpringProcessConnector { String getProjectName(); String getProcessId(); String getProcessName(); - SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData current, String metricName) throws Exception; - SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData current, String metricName) throws Exception; + SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData current, String metricName, String tags) throws Exception; + SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData current, String metricName, String tags) throws Exception; } 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 8080fb52d..f7d39753f 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 @@ -104,13 +104,13 @@ public class SpringProcessConnectorOverHttp implements SpringProcessConnector { } @Override - public SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData current, String metricName) + public SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData current, String metricName, String tags) throws Exception { return null; } @Override - public SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData current, String metricName) + public SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData current, String metricName, String tags) throws Exception { return null; } 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 7f075668c..3522ec58b 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 @@ -149,7 +149,7 @@ public class SpringProcessConnectorOverJMX implements SpringProcessConnector { } @Override - public SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData currentData, String metricName) throws Exception { + public SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData currentData, String metricName, String tags) throws Exception { log.info("try to open JMX connection to: " + jmxURL); if (jmxConnection != null) { @@ -157,7 +157,7 @@ public class SpringProcessConnectorOverJMX implements SpringProcessConnector { SpringProcessLiveDataExtractorOverJMX springJMXConnector = new SpringProcessLiveDataExtractorOverJMX(); log.info("retrieve live data from: " + jmxURL); - SpringProcessMemoryMetricsLiveData liveData = springJMXConnector.retrieveLiveMemoryMetricsData(getProcessType(), jmxConnection, processID, processName, currentData, metricName); + SpringProcessMemoryMetricsLiveData liveData = springJMXConnector.retrieveLiveMemoryMetricsData(getProcessType(), jmxConnection, processID, processName, currentData, metricName, tags); if (liveData != null && liveData.getMemoryMetrics() != null && liveData.getMemoryMetrics().length > 0) { return liveData; @@ -172,7 +172,7 @@ public class SpringProcessConnectorOverJMX implements SpringProcessConnector { } @Override - public SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData currentData, String metricName) throws Exception { + public SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData currentData, String metricName, String tags) throws Exception { log.info("try to open JMX connection to: " + jmxURL); if (jmxConnection != null) { @@ -180,7 +180,7 @@ public class SpringProcessConnectorOverJMX implements SpringProcessConnector { SpringProcessLiveDataExtractorOverJMX springJMXConnector = new SpringProcessLiveDataExtractorOverJMX(); log.info("retrieve live data from: " + jmxURL); - SpringProcessGcPausesMetricsLiveData liveData = springJMXConnector.retrieveLiveGcPausesMetricsData(getProcessType(), jmxConnection, processID, processName, currentData, metricName); + SpringProcessGcPausesMetricsLiveData liveData = springJMXConnector.retrieveLiveGcPausesMetricsData(getProcessType(), jmxConnection, processID, processName, currentData, metricName, tags); if (liveData != null && liveData.getGcPausesMetrics() != null && liveData.getGcPausesMetrics().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 6b1b59fe9..6a4c97585 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 @@ -99,7 +99,7 @@ public class SpringProcessConnectorService { } } - public void refreshProcess(String processKey, String endpoint, String metricName) { + public void refreshProcess(String processKey, String endpoint, String metricName, String tags) { log.info("refresh process: " + processKey); SpringProcessConnector connector = this.connectors.get(processKey); @@ -109,7 +109,7 @@ public class SpringProcessConnectorService { progressTask.progressBegin("Refresh", null); - scheduleRefresh(progressTask, processKey, connector, 0, TimeUnit.SECONDS, 0, endpoint, metricName); + scheduleRefresh(progressTask, processKey, connector, 0, TimeUnit.SECONDS, 0, endpoint, metricName, tags); } } @@ -170,9 +170,9 @@ public class SpringProcessConnectorService { connector.connect(); progressTask.progressDone(); - refreshProcess(processKey, "", ""); - refreshProcess(processKey, "metrics", "memory"); - refreshProcess(processKey, "metrics", "gcPauses"); + refreshProcess(processKey, "", "", ""); + refreshProcess(processKey, "metrics", "memory", "area:heap"); + refreshProcess(processKey, "metrics", "gcPauses", ""); } catch (Exception e) { log.info("problem occured during process connect", e); @@ -220,7 +220,7 @@ public class SpringProcessConnectorService { }, delay, unit); } - private void scheduleRefresh(ProgressTask progressTask, String processKey, SpringProcessConnector connector, long delay, TimeUnit unit, int retryNo, String endpoint, String metricName) { + private void scheduleRefresh(ProgressTask progressTask, String processKey, SpringProcessConnector connector, long delay, TimeUnit unit, int retryNo, String endpoint, String metricName, String tags) { String progressMessage = "Refreshing data from Spring process: " + processKey + " - retry no: " + retryNo; log.info(progressMessage); @@ -230,7 +230,7 @@ public class SpringProcessConnectorService { try { progressTask.progressEvent(progressMessage); if(endpoint.equals("metrics") && metricName.equals("memory")) { - SpringProcessMemoryMetricsLiveData newMetricsLiveData = connector.refreshMemoryMetrics(this.liveDataProvider.getCurrent(processKey), metricName); + SpringProcessMemoryMetricsLiveData newMetricsLiveData = connector.refreshMemoryMetrics(this.liveDataProvider.getCurrent(processKey), metricName, tags); if (newMetricsLiveData != null) { if (!this.liveDataProvider.addMemoryMetrics(processKey, newMetricsLiveData)) { @@ -241,7 +241,7 @@ public class SpringProcessConnectorService { } } else if(endpoint.equals("metrics") && metricName.equals("gcPauses")) { - SpringProcessGcPausesMetricsLiveData newMetricsLiveData = connector.refreshGcPausesMetrics(this.liveDataProvider.getCurrent(processKey), metricName); + SpringProcessGcPausesMetricsLiveData newMetricsLiveData = connector.refreshGcPausesMetrics(this.liveDataProvider.getCurrent(processKey), metricName, tags); if (newMetricsLiveData != null) { if (!this.liveDataProvider.addGcPausesMetrics(processKey, newMetricsLiveData)) { @@ -270,7 +270,7 @@ public class SpringProcessConnectorService { if (retryNo < maxRetryCount && isKnownProcessKey(processKey)) { scheduleRefresh(progressTask, processKey, connector, retryDelayInSeconds, TimeUnit.SECONDS, - retryNo + 1, endpoint, metricName); + retryNo + 1, endpoint, metricName, tags); } else { progressTask.progressDone(); 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 bd393f2da..d98417b65 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 @@ -97,8 +97,6 @@ public class SpringProcessLiveDataExtractorOverJMX { LiveBeansModel beans = getBeans(connection, domain); LiveMetricsModel metrics = getMetrics(connection, domain); StartupMetricsModel startup = getStartupMetrics(connection, domain, currentData == null ? null : currentData.getStartupMetrics()); -// LiveMemoryMetricsModel[] memoryMetrics = getLiveMemoryMetrics(connection, domain); -// LiveMemoryMetricsModel gcPausesMetrics = getGcPausesMetrics(connection, domain); if (contextPath == null) { contextPath = getContextPath(connection, domain, environment); @@ -123,8 +121,6 @@ public class SpringProcessLiveDataExtractorOverJMX { properties, metrics, startup -// memoryMetrics, -// gcPausesMetrics ); } catch (Exception e) { @@ -142,9 +138,9 @@ public class SpringProcessLiveDataExtractorOverJMX { * @param metricName */ public SpringProcessMemoryMetricsLiveData retrieveLiveMemoryMetricsData(ProcessType processType, JMXConnector jmxConnector, String processID, String processName, - SpringProcessLiveData currentData, String metricName) { + SpringProcessLiveData currentData, String metricName, String tags) { - List memoryTags = Arrays.asList( "jvm.memory.used", "jvm.memory.committed", "jvm.memory.max"); + List memoryMetrics = Arrays.asList("jvm.memory.committed", "jvm.memory.max"); try { MBeanServerConnection connection = jmxConnector.getMBeanServerConnection(); @@ -163,16 +159,26 @@ public class SpringProcessLiveDataExtractorOverJMX { } } -// if(metricName.equals("memory")) { - for(String metric : memoryTags) { - LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, metric); - if(metrics != null) { - memoryMetricsList.add(metrics); - } - } - -// } - + LiveMemoryMetricsModel jvmMemUsedMetrics = getLiveMetrics(connection, domain, "jvm.memory.used", tags); + if(jvmMemUsedMetrics != null ) { + String[] memoryZones = jvmMemUsedMetrics.getAvailableTags()[0].getValues(); + Arrays.sort(memoryZones); + 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 new SpringProcessMemoryMetricsLiveData( processType, @@ -196,7 +202,7 @@ public class SpringProcessLiveDataExtractorOverJMX { * @param metricName */ public SpringProcessGcPausesMetricsLiveData retrieveLiveGcPausesMetricsData(ProcessType processType, JMXConnector jmxConnector, String processID, String processName, - SpringProcessLiveData currentData, String metricName) { + SpringProcessLiveData currentData, String metricName, String tags) { try { MBeanServerConnection connection = jmxConnector.getMBeanServerConnection(); @@ -215,9 +221,9 @@ public class SpringProcessLiveDataExtractorOverJMX { } } - LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, "jvm.gc.pause"); + LiveMemoryMetricsModel metrics = getLiveMetrics(connection, domain, "jvm.gc.pause", tags); if(metrics != null) { - memoryMetricsList.add(getLiveMetrics(connection, domain, "jvm.gc.pause")); + memoryMetricsList.add(getLiveMetrics(connection, domain, "jvm.gc.pause", tags)); } @@ -368,9 +374,8 @@ public class SpringProcessLiveDataExtractorOverJMX { } - public LiveMemoryMetricsModel getLiveMetrics(MBeanServerConnection connection, String domain, String metricName) { + public LiveMemoryMetricsModel getLiveMetrics(MBeanServerConnection connection, String domain, String metricName, String tags) { - List tags = new ArrayList<>(); Object[] params1 = new Object[] {metricName, tags}; String[] signature = new String[] {String.class.getName(), List.class.getName()}; diff --git a/vscode-extensions/vscode-spring-boot/lib/api.d.ts b/vscode-extensions/vscode-spring-boot/lib/api.d.ts index acbfce999..c7921bf53 100644 --- a/vscode-extensions/vscode-spring-boot/lib/api.d.ts +++ b/vscode-extensions/vscode-spring-boot/lib/api.d.ts @@ -81,6 +81,5 @@ interface BeansQuery extends LiveProcessDataQuery { interface MetricsQuery extends LiveProcessDataQuery { endpoint: "metrics"; metricName: string; - tag?: { key: string; value: string }; - -} + tags?: string; +} \ No newline at end of file diff --git a/vscode-extensions/vscode-spring-boot/lib/apiManager.ts b/vscode-extensions/vscode-spring-boot/lib/apiManager.ts index 377b57e9a..922f96fbd 100644 --- a/vscode-extensions/vscode-spring-boot/lib/apiManager.ts +++ b/vscode-extensions/vscode-spring-boot/lib/apiManager.ts @@ -35,14 +35,11 @@ export class ApiManager { const COMMAND_LIVEDATA_GET_METRICS = "sts/livedata/get/metrics" const getLiveProcessMetricsData = async (query) : Promise => { - console.log(query); - console.log("in get live metrics function"); return await commands.executeCommand(COMMAND_LIVEDATA_GET_METRICS, query); } const COMMAND_LIVEDATA_REFRESH_METRICS = "sts/livedata/refresh/metrics"; const refreshLiveProcessMetricsData = async (query) => { - console.log("in get live metrics refresh function"); return await commands.executeCommand(COMMAND_LIVEDATA_REFRESH_METRICS, query); }