Skip to content

Commit eddb6eb

Browse files
V UdayaniV Udayani
authored andcommitted
fetch and display loglevels
1 parent e281e0f commit eddb6eb

File tree

21 files changed

+808
-6
lines changed

21 files changed

+808
-6
lines changed

headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ public interface STS4LanguageClient extends LanguageClient, SpringIndexLanguageC
5151

5252
@JsonNotification("sts/liveprocess/gcpauses/metrics/updated")
5353
void liveProcessGcPausesMetricsDataUpdated(LiveProcessSummary processKey);
54+
55+
@JsonNotification("sts/liveprocess/loggers/updated")
56+
void liveProcessLoggersDataUpdated(LiveProcessSummary processKey);
57+
58+
@JsonNotification("sts/liveprocess/loglevel/updated")
59+
void liveProcessLogLevelUpdated(LiveProcessSummary processKey);
5460

5561
@JsonNotification("sts/highlight")
5662
void highlight(HighlightParams highlights);

headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,10 @@ public void liveProcessMemoryMetricsDataUpdated(LiveProcessSummary processKey) {
432432
public void liveProcessGcPausesMetricsDataUpdated(LiveProcessSummary processKey) {
433433
}
434434

435+
@Override
436+
public void liveProcessLoggersDataUpdated(LiveProcessSummary processKey) {
437+
}
438+
435439
@Override
436440
public void indexUpdated() {
437441
receiveIndexUpdated();

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/ActuatorConnection.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ public interface ActuatorConnection {
3333
Map<?, ?> getStartup() throws IOException;
3434

3535
String getLiveMetrics(String metricName, String tags) throws IOException;
36+
37+
String getLoggers() throws IOException;
3638
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/HttpActuatorConnection.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,24 @@ public String getBeans() throws IOException {
8080
return restTemplate.getForObject("/beans", String.class);
8181
}
8282

83+
@Override
84+
public String getLoggers() throws IOException {
85+
return restTemplate.getForObject("/loggers", String.class);
86+
}
87+
88+
@Override
89+
public String changeLogLevel(Map<String, String> args) throws IOException {
90+
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromPath("/loggers/"+args.get("packageName"));
91+
if (args != null) {
92+
// for (Entry<String, String> e : args.entrySet()) {
93+
uriBuilder.queryParam("configuredLevel", args.get("configuredLevel"));
94+
// }
95+
}
96+
// /{ownerId}/new cases make REST Template URI template handler to think that {ownerId} is a URI parameter which it is not.
97+
String url = actuatorUrl + uriBuilder.toUriString();
98+
return restTemplate.getForObject(URI.create(url), String.class);
99+
}
100+
83101
@Override
84102
public String getLiveMetrics(String metricName, String tags) throws IOException {
85103
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromPath("/metrics/"+metricName);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.springframework.ide.vscode.boot.java.livehover.v2;
2+
3+
/**
4+
* @author Udayani V
5+
*/
6+
public class LoggerInfo {
7+
8+
private String configuredLevel;
9+
10+
private String effectiveLevel;
11+
12+
public String getConfiguredLevel() {
13+
return configuredLevel;
14+
}
15+
public String getEffectiveLevel() {
16+
return effectiveLevel;
17+
}
18+
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.springframework.ide.vscode.boot.java.livehover.v2;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
7+
8+
/**
9+
* @author Udayani V
10+
*/
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
public class Loggers {
13+
14+
private List<String> levels;
15+
private Map<String, LoggerInfo> loggers;
16+
17+
public List<String> getLevels() {
18+
return levels;
19+
}
20+
21+
public Map<String, LoggerInfo> getLoggers() {
22+
return loggers;
23+
}
24+
25+
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import java.util.ArrayList;
1414
import java.util.Collection;
15+
import java.util.HashMap;
1516
import java.util.HashSet;
1617
import java.util.List;
1718
import java.util.Map;
@@ -43,6 +44,9 @@ public class SpringProcessCommandHandler {
4344
private static final String COMMAND_LIST_CONNECTED = "sts/livedata/listConnected";
4445
private static final String COMMAND_GET_METRICS = "sts/livedata/get/metrics";
4546
private static final String COMMAND_GET_REFRESH_METRICS = "sts/livedata/refresh/metrics";
47+
private static final String COMMAND_GET_LOGGERS = "sts/livedata/getLoggers";
48+
private static final String COMMAND_FETCH_LOGGERS_DATA = "sts/livedata/fetch/loggersData";
49+
private static final String COMMAND_CHANGE_LOGLEVEL = "sts/livedata/change/logLevel";
4650

4751
private final SpringProcessConnectorService connectorService;
4852
private final SpringProcessConnectorLocal localProcessConnector;
@@ -88,6 +92,21 @@ public SpringProcessCommandHandler(SimpleLanguageServer server, SpringProcessCon
8892
return refreshMetrics(params);
8993
});
9094
log.info("Registered command handler: {}",COMMAND_GET_METRICS);
95+
96+
server.onCommand(COMMAND_GET_LOGGERS, (params) -> {
97+
return getLoggers(params);
98+
});
99+
log.info("Registered command handler: {}",COMMAND_GET_LOGGERS);
100+
101+
server.onCommand(COMMAND_FETCH_LOGGERS_DATA, (params) -> {
102+
return handleFetchLoggersDataRequest(params);
103+
});
104+
log.info("Registered command handler: {}",COMMAND_FETCH_LOGGERS_DATA);
105+
106+
server.onCommand(COMMAND_CHANGE_LOGLEVEL, (params) -> {
107+
return changeLogLevel(params);
108+
});
109+
log.info("Registered command handler: {}",COMMAND_CHANGE_LOGLEVEL);
91110

92111
server.onCommand(COMMAND_LIST_CONNECTED, (params) -> {
93112
List<LiveProcessSummary> result = new ArrayList<>();
@@ -320,4 +339,42 @@ private CompletableFuture<Object> handleLiveMetricsProcessRequest(ExecuteCommand
320339
return CompletableFuture.completedFuture(null);
321340
}
322341

342+
343+
private CompletableFuture<Object> getLoggers(ExecuteCommandParams params) {
344+
SpringProcessParams springProcessParams = new SpringProcessParams();
345+
springProcessParams.setProcessKey(getProcessKey(params));
346+
springProcessParams.setEndpoint(getArgumentByKey(params, "endpoint"));
347+
if (springProcessParams.getProcessKey() != null) {
348+
connectorService.getLoggers(springProcessParams);
349+
}
350+
351+
return CompletableFuture.completedFuture(null);
352+
}
353+
354+
private CompletableFuture<Object> handleFetchLoggersDataRequest(ExecuteCommandParams params) {
355+
String processKey = getProcessKey(params);
356+
if (processKey != null) {
357+
SpringProcessLoggersData data = connectorService.getLoggersData(processKey);
358+
return CompletableFuture.completedFuture(data.getLoggers());
359+
}
360+
361+
return CompletableFuture.completedFuture(null);
362+
}
363+
364+
private CompletableFuture<Object> changeLogLevel(ExecuteCommandParams params) {
365+
Map<String, String> args = new HashMap<>();
366+
args.put("packageName", getArgumentByKey(params, "packageName"));
367+
args.put("configuredLevel", getArgumentByKey(params, "configuredLevel"));
368+
SpringProcessParams springProcessParams = new SpringProcessParams();
369+
springProcessParams.setProcessKey(getProcessKey(params));
370+
springProcessParams.setEndpoint("loggers");
371+
springProcessParams.setArgs(args);
372+
373+
if (springProcessParams.getProcessKey() != null) {
374+
connectorService.changeLogLevel(springProcessParams);
375+
}
376+
377+
return CompletableFuture.completedFuture(null);
378+
}
379+
323380
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnector.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.livehover.v2;
1212

13+
import java.util.Map;
14+
1315
/**
1416
* @author Martin Lippert
1517
*/
@@ -29,4 +31,6 @@ public interface SpringProcessConnector {
2931
String getProcessName();
3032
SpringProcessGcPausesMetricsLiveData refreshGcPausesMetrics(SpringProcessLiveData current, String metricName, String tags) throws Exception;
3133
SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLiveData current, String metricName, String tags) throws Exception;
34+
SpringProcessLoggersData getLoggers(SpringProcessLiveData currentData) throws Exception;
35+
void changeLogLevel(SpringProcessLiveData currentData, Map<String, String> args) throws Exception;
3236
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverHttp.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.livehover.v2;
1212

13+
import java.util.Map;
14+
1315
public class SpringProcessConnectorOverHttp implements SpringProcessConnector {
1416

1517
private final ProcessType processType;
@@ -157,6 +159,48 @@ public SpringProcessMemoryMetricsLiveData refreshMemoryMetrics(SpringProcessLive
157159

158160
throw new Exception("no live memory metrics data received, lets try again");
159161
}
162+
163+
164+
@Override
165+
public SpringProcessLoggersData getLoggers(SpringProcessLiveData currentData)
166+
throws Exception {
167+
if (actuatorConnection != null) {
168+
SpringProcessLoggersData loggersData = new SpringProcessLiveDataExtractorOverHttp().retrieveLoggersData(getProcessType(), actuatorConnection, processID, processName, currentData);
169+
170+
if (this.processID == null) {
171+
this.processID = loggersData.getProcessID();
172+
}
173+
174+
if (this.processName == null) {
175+
this.processName = loggersData.getProcessName();
176+
}
177+
178+
if (loggersData != null && loggersData.getLoggers() != null) {
179+
return loggersData;
180+
}
181+
}
182+
183+
throw new Exception("no loggers data received, lets try again");
184+
}
185+
186+
187+
@Override
188+
public void changeLogLevel(SpringProcessLiveData currentData, Map<String, String> args) throws Exception {
189+
if (actuatorConnection != null) {
190+
SpringProcessLoggersData loggersData = new SpringProcessLiveDataExtractorOverHttp().changeLogLevel(getProcessType(), actuatorConnection, processID, processName, currentData, args);
191+
192+
if (this.processID == null) {
193+
this.processID = loggersData.getProcessID();
194+
}
195+
196+
if (this.processName == null) {
197+
this.processName = loggersData.getProcessName();
198+
}
199+
200+
}
201+
202+
throw new Exception("no loggers data received, lets try again");
203+
}
160204

161205

162206
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorOverJMX.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,52 @@ public void disconnect() throws Exception {
210210
log.error("error closing the JMX connection for: " + jmxURL, e);
211211
}
212212
}
213+
214+
@Override
215+
public SpringProcessLoggersData getLoggers(SpringProcessLiveData currentData) throws Exception {
216+
log.info("try to open JMX connection to: " + jmxURL);
217+
218+
if (jmxConnection != null) {
219+
try {
220+
SpringProcessLiveDataExtractorOverJMX springJMXConnector = new SpringProcessLiveDataExtractorOverJMX();
221+
222+
log.info("retrieve live data from: " + jmxURL);
223+
SpringProcessLoggersData loggersData = springJMXConnector.retrieveLoggersData(getProcessType(), jmxConnection, processID, processName, currentData);
224+
225+
if (loggersData != null) {
226+
return loggersData;
227+
}
228+
}
229+
catch (Exception e) {
230+
log.error("exception while connecting to jmx: " + jmxURL, e);
231+
}
232+
}
233+
234+
throw new Exception("no loggers data received, lets try again");
235+
}
236+
237+
@Override
238+
public void changeLogLevel(SpringProcessLiveData currentData, Map<String, String> args) throws Exception {
239+
log.info("try to open JMX connection to: " + jmxURL);
240+
241+
if (jmxConnection != null) {
242+
try {
243+
SpringProcessLiveDataExtractorOverJMX springJMXConnector = new SpringProcessLiveDataExtractorOverJMX();
244+
245+
log.info("retrieve live data from: " + jmxURL);
246+
springJMXConnector.changeLogLevel(getProcessType(), jmxConnection, processID, processName, currentData, args);
247+
248+
// if (loggersData != null) {
249+
// return loggersData;
250+
// }
251+
}
252+
catch (Exception e) {
253+
log.error("exception while connecting to jmx: " + jmxURL, e);
254+
}
255+
}
256+
257+
throw new Exception("no loggers data received, lets try again");
258+
}
213259

214260
@Override
215261
public void addConnectorChangeListener(SpringProcessConnectionChangeListener listener) {

0 commit comments

Comments
 (0)