Skip to content

Commit e189fcb

Browse files
authored
Feature/usage status of environments (#97)
1 parent 188ab10 commit e189fcb

File tree

29 files changed

+466
-134
lines changed

29 files changed

+466
-134
lines changed

analytics-provider/src/main/java/org/digma/intellij/plugin/analytics/AnalyticsProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.digma.intellij.plugin.model.rest.insights.InsightsRequest;
77
import org.digma.intellij.plugin.model.rest.summary.CodeObjectSummary;
88
import org.digma.intellij.plugin.model.rest.summary.CodeObjectSummaryRequest;
9+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusRequest;
10+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
911

1012
import java.io.Closeable;
1113
import java.util.List;
@@ -22,4 +24,6 @@ public interface AnalyticsProvider extends Closeable {
2224

2325
CodeObjectErrorDetails getCodeObjectErrorDetails(String errorSourceId);
2426

27+
UsageStatusResult getUsageStatus(UsageStatusRequest usageStatusRequest);
28+
2529
}

analytics-provider/src/main/java/org/digma/intellij/plugin/analytics/RestAnalyticsProvider.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.digma.intellij.plugin.model.rest.insights.InsightsRequest;
1010
import org.digma.intellij.plugin.model.rest.summary.CodeObjectSummary;
1111
import org.digma.intellij.plugin.model.rest.summary.CodeObjectSummaryRequest;
12+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusRequest;
13+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
1214
import retrofit2.Call;
1315
import retrofit2.Response;
1416
import retrofit2.Retrofit;
@@ -32,7 +34,7 @@ public class RestAnalyticsProvider implements AnalyticsProvider, Closeable {
3234
private final Client client;
3335

3436
public RestAnalyticsProvider(String baseUrl) {
35-
this(baseUrl,null);
37+
this(baseUrl, null);
3638
}
3739

3840
public RestAnalyticsProvider(String baseUrl, String apiToken) {
@@ -64,6 +66,11 @@ public CodeObjectErrorDetails getCodeObjectErrorDetails(String errorSourceId) {
6466
return execute(() -> client.analyticsProvider.getCodeObjectErrorDetails(errorSourceId));
6567
}
6668

69+
@Override
70+
public UsageStatusResult getUsageStatus(UsageStatusRequest usageStatusRequest) {
71+
return execute(() -> client.analyticsProvider.getUsageStatus(usageStatusRequest));
72+
}
73+
6774
public <T> T execute(Supplier<Call<T>> supplier) {
6875

6976
Response<T> response;
@@ -248,6 +255,13 @@ private interface AnalyticsProviderRetrofit {
248255
@GET("/CodeAnalytics/codeObjects/errors/{errorSourceId}")
249256
Call<CodeObjectErrorDetails> getCodeObjectErrorDetails(@Path("errorSourceId") String errorSourceId);
250257

258+
@Headers({
259+
"Accept: application/+json",
260+
"Content-Type:application/json"
261+
})
262+
@POST("/CodeAnalytics/codeobjects/status")
263+
Call<UsageStatusResult> getUsageStatus(@Body UsageStatusRequest usageStatusRequest);
264+
251265
}
252266

253267
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.digma.intellij.plugin.analytics;
2+
3+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusRequest;
4+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
5+
import org.junit.jupiter.api.Test;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
public class UsageStatusTests extends AbstractAnalyticsProviderTest {
11+
12+
//run against running env just for local test
13+
//@Test
14+
public void getUsageStatusTemp() {
15+
{
16+
List<String> ids = new ArrayList<>();
17+
ids.add("method:Sample.MoneyTransfer.API.Controllers.TransferController$_$TransferFunds(TransferRequest)");
18+
ids.add("span:MoneyTransferDomainService$_$Peristing balance transfer");
19+
UsageStatusRequest usageStatusRequest = new UsageStatusRequest(ids);
20+
AnalyticsProvider analyticsProvider = new RestAnalyticsProvider("https://localhost:5051");
21+
UsageStatusResult usageStatusResult = analyticsProvider.getUsageStatus(usageStatusRequest);
22+
23+
System.out.println(usageStatusResult);
24+
}
25+
}
26+
27+
@Test
28+
public void doNothing() {
29+
}
30+
}

ide-common/src/main/java/org/digma/intellij/plugin/analytics/AnalyticsService.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.digma.intellij.plugin.model.rest.insights.InsightsRequest;
1212
import org.digma.intellij.plugin.model.rest.summary.CodeObjectSummary;
1313
import org.digma.intellij.plugin.model.rest.summary.CodeObjectSummaryRequest;
14+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusRequest;
15+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
1416
import org.digma.intellij.plugin.notifications.NotificationUtil;
1517
import org.digma.intellij.plugin.persistence.PersistenceService;
1618
import org.digma.intellij.plugin.settings.SettingsState;
@@ -24,7 +26,12 @@
2426
import java.lang.reflect.InvocationTargetException;
2527
import java.lang.reflect.Method;
2628
import java.net.ConnectException;
27-
import java.util.*;
29+
import java.util.ArrayList;
30+
import java.util.Arrays;
31+
import java.util.HashMap;
32+
import java.util.List;
33+
import java.util.Map;
34+
import java.util.Objects;
2835
import java.util.stream.Collectors;
2936

3037
public class AnalyticsService implements Disposable {
@@ -123,14 +130,22 @@ public List<CodeObjectInsight> getInsights(List<String> objectIds) throws Analyt
123130
return analyticsProviderProxy.getInsights(new InsightsRequest(getCurrentEnvironment(), objectIds));
124131
}
125132

126-
public List<CodeObjectError> getErrorsOfCodeObject( String codeObjectId) throws AnalyticsServiceException {
133+
public List<CodeObjectError> getErrorsOfCodeObject(String codeObjectId) throws AnalyticsServiceException {
127134
return analyticsProviderProxy.getErrorsOfCodeObject(getCurrentEnvironment(), codeObjectId);
128135
}
129136

130137
public CodeObjectErrorDetails getErrorDetails(String errorUid) throws AnalyticsServiceException {
131138
return analyticsProviderProxy.getCodeObjectErrorDetails(errorUid);
132139
}
133140

141+
public UsageStatusResult getUsageStatus(List<String> objectIds) throws AnalyticsServiceException {
142+
return analyticsProviderProxy.getUsageStatus(new UsageStatusRequest(objectIds));
143+
}
144+
145+
public UsageStatusResult getUsageStatusOfErrors(List<String> objectIds) throws AnalyticsServiceException {
146+
return analyticsProviderProxy.getUsageStatus(new UsageStatusRequest(objectIds, List.of("Error")));
147+
}
148+
134149
@Override
135150
public void dispose() {
136151
try {
@@ -219,7 +234,7 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
219234
}
220235

221236
private boolean isConnectionException(InvocationTargetException e) {
222-
237+
223238
var ex = e.getCause();
224239
while (ex != null && !(ex instanceof ConnectException)){
225240
ex = ex.getCause();
@@ -241,7 +256,7 @@ private String getConnectExceptionMessage(InvocationTargetException e) {
241256
if (ex != null){
242257
return ex.getMessage();
243258
}
244-
259+
245260
return e.getCause() != null? e.getCause().getMessage():e.getMessage();
246261
}
247262

ide-common/src/main/java/org/digma/intellij/plugin/common/CommonUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.digma.intellij.plugin.common;
22

3+
import org.ocpsoft.prettytime.PrettyTime;
4+
35
import java.net.InetAddress;
46
import java.net.UnknownHostException;
7+
import java.util.Date;
58

69
public final class CommonUtils {
710

@@ -30,4 +33,9 @@ private static String hostnameByEnvVar() {
3033
}
3134
return hostname;
3235
}
36+
37+
public static String prettyTimeOf(Date date) {
38+
PrettyTime ptNow = new PrettyTime();
39+
return ptNow.format(date);
40+
}
3341
}

ide-common/src/main/java/org/digma/intellij/plugin/document/DocumentInfoContainer.java

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.digma.intellij.plugin.model.rest.summary.EndpointCodeObjectSummary;
1212
import org.digma.intellij.plugin.model.rest.summary.MethodCodeObjectSummary;
1313
import org.digma.intellij.plugin.model.rest.summary.SpanCodeObjectSummary;
14+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
1415
import org.jetbrains.annotations.NotNull;
1516
import org.jetbrains.annotations.Nullable;
1617

@@ -22,6 +23,8 @@
2223
import java.util.stream.Collectors;
2324
import java.util.stream.Stream;
2425

26+
import static org.digma.intellij.plugin.model.Models.Empties.EmptyUsageStatusResult;
27+
2528
public class DocumentInfoContainer {
2629

2730
private final Logger LOGGER = Logger.getInstance(DocumentInfoContainer.class);
@@ -32,6 +35,8 @@ public class DocumentInfoContainer {
3235
private Map<String, MethodCodeObjectSummary> methodSummaries;
3336
private Map<String, SpanCodeObjectSummary> spanSummaries;
3437
private Map<String, EndpointCodeObjectSummary> endpointSummaries;
38+
private UsageStatusResult usageStatus = EmptyUsageStatusResult;
39+
private UsageStatusResult usageStatusOfErrors = EmptyUsageStatusResult;
3540

3641
public DocumentInfoContainer(@NotNull PsiFile psiFile, @NotNull AnalyticsService analyticsService) {
3742
this.psiFile = psiFile;
@@ -75,11 +80,11 @@ private void loadSummaries() {
7580

7681
summaries.forEach(codeObjectSummary -> {
7782

78-
if (codeObjectSummary instanceof MethodCodeObjectSummary){
83+
if (codeObjectSummary instanceof MethodCodeObjectSummary) {
7984
methodSummaries.put(codeObjectSummary.getCodeObjectId(), (MethodCodeObjectSummary) codeObjectSummary);
80-
}else if (codeObjectSummary instanceof SpanCodeObjectSummary){
85+
} else if (codeObjectSummary instanceof SpanCodeObjectSummary) {
8186
spanSummaries.put(codeObjectSummary.getCodeObjectId(), (SpanCodeObjectSummary) codeObjectSummary);
82-
}else if (codeObjectSummary instanceof EndpointCodeObjectSummary){
87+
} else if (codeObjectSummary instanceof EndpointCodeObjectSummary) {
8388
endpointSummaries.put(codeObjectSummary.getCodeObjectId(), (EndpointCodeObjectSummary) codeObjectSummary);
8489
}
8590

@@ -91,6 +96,19 @@ private void loadSummaries() {
9196
spanSummaries = null;
9297
endpointSummaries = null;
9398
}
99+
100+
try {
101+
Log.log(LOGGER::debug, "Requesting usage status for {}: with ids {}", psiFile.getVirtualFile(), objectIds);
102+
usageStatus = analyticsService.getUsageStatus(objectIds);
103+
Log.log(LOGGER::debug, "Got usage status for {}: {}", psiFile.getVirtualFile(), usageStatus);
104+
105+
Log.log(LOGGER::debug, "Requesting usage status of errors for {}: with ids {}", psiFile.getVirtualFile(), objectIds);
106+
usageStatusOfErrors = analyticsService.getUsageStatusOfErrors(objectIds);
107+
Log.log(LOGGER::debug, "Got usage status of errors for {}: {}", psiFile.getVirtualFile(), usageStatusOfErrors);
108+
} catch (AnalyticsServiceException e) {
109+
usageStatus = EmptyUsageStatusResult;
110+
usageStatusOfErrors = EmptyUsageStatusResult;
111+
}
94112
}
95113

96114

@@ -104,7 +122,7 @@ public PsiFile getPsiFile() {
104122

105123
public Map<String, MethodCodeObjectSummary> getMethodsSummaries() {
106124
//if methodSummaries is null try to recover
107-
if (methodSummaries == null){
125+
if (methodSummaries == null) {
108126
loadSummaries();
109127
}
110128
//if methodSummaries is still null it means there is still an error loading, return an empty map to keep everything
@@ -114,7 +132,7 @@ public Map<String, MethodCodeObjectSummary> getMethodsSummaries() {
114132

115133
public Map<String, SpanCodeObjectSummary> getSpanSummaries() {
116134
//if methodSummaries is null try to recover
117-
if (spanSummaries == null){
135+
if (spanSummaries == null) {
118136
loadSummaries();
119137
}
120138
//if methodSummaries is still null it means there is still an error loading, return an empty map to keep everything
@@ -124,7 +142,7 @@ public Map<String, SpanCodeObjectSummary> getSpanSummaries() {
124142

125143
public Map<String, EndpointCodeObjectSummary> getEndpointSummaries() {
126144
//if methodSummaries is null try to recover
127-
if (endpointSummaries == null){
145+
if (endpointSummaries == null) {
128146
loadSummaries();
129147
}
130148
//if methodSummaries is still null it means there is still an error loading, return an empty map to keep everything
@@ -133,18 +151,22 @@ public Map<String, EndpointCodeObjectSummary> getEndpointSummaries() {
133151
}
134152

135153

136-
137-
138-
public List<CodeObjectSummary> getAllSummaries(){
154+
public List<CodeObjectSummary> getAllSummaries() {
139155
//this method should not try to reload summaries because it happens too often
140156
List<CodeObjectSummary> summaries = new ArrayList<>();
141-
summaries.addAll(methodSummaries == null? new ArrayList<>(): methodSummaries.values());
142-
summaries.addAll(spanSummaries == null? new ArrayList<>(): spanSummaries.values());
143-
summaries.addAll(endpointSummaries == null? new ArrayList<>(): endpointSummaries.values());
157+
summaries.addAll(methodSummaries == null ? new ArrayList<>() : methodSummaries.values());
158+
summaries.addAll(spanSummaries == null ? new ArrayList<>() : spanSummaries.values());
159+
summaries.addAll(endpointSummaries == null ? new ArrayList<>() : endpointSummaries.values());
144160
return summaries;
145161
}
146162

163+
public UsageStatusResult getUsageStatus() {
164+
return usageStatus;
165+
}
147166

167+
public UsageStatusResult getUsageStatusOfErrors() {
168+
return usageStatusOfErrors;
169+
}
148170

149171
@Nullable
150172
public MethodInfo getMethodInfo(String id) {

ide-common/src/main/java/org/digma/intellij/plugin/errors/ErrorsListContainer.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
package org.digma.intellij.plugin.errors;
22

33
import org.digma.intellij.plugin.model.rest.errors.CodeObjectError;
4+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
45
import org.digma.intellij.plugin.ui.model.listview.ListViewItem;
56

7+
import java.util.Collections;
68
import java.util.List;
79

10+
import static org.digma.intellij.plugin.model.Models.Empties.EmptyUsageStatusResult;
11+
812
public class ErrorsListContainer {
913

1014
private final List<ListViewItem<CodeObjectError>> listViewItems;
15+
private final UsageStatusResult usageStatus;
1116

12-
public ErrorsListContainer(List<ListViewItem<CodeObjectError>> listViewItems) {
17+
public ErrorsListContainer(List<ListViewItem<CodeObjectError>> listViewItems, UsageStatusResult usageStatus) {
1318
this.listViewItems = listViewItems;
19+
this.usageStatus = usageStatus;
20+
}
21+
22+
public ErrorsListContainer() {
23+
this(Collections.emptyList(), EmptyUsageStatusResult);
1424
}
1525

1626
public int getCount() {
@@ -20,4 +30,8 @@ public int getCount() {
2030
public List<ListViewItem<CodeObjectError>> getListViewItems() {
2131
return listViewItems;
2232
}
33+
34+
public UsageStatusResult getUsageStatus() {
35+
return usageStatus;
36+
}
2337
}

ide-common/src/main/java/org/digma/intellij/plugin/errors/ErrorsProvider.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,14 @@
1212
import org.digma.intellij.plugin.model.rest.errordetails.Frame;
1313
import org.digma.intellij.plugin.model.rest.errordetails.FrameStack;
1414
import org.digma.intellij.plugin.model.rest.errors.CodeObjectError;
15+
import org.digma.intellij.plugin.model.rest.usage.UsageStatusResult;
1516
import org.digma.intellij.plugin.project.ProjectService;
16-
import org.digma.intellij.plugin.ui.model.errors.*;
17+
import org.digma.intellij.plugin.ui.model.errors.ErrorDetailsModel;
18+
import org.digma.intellij.plugin.ui.model.errors.FlowStacks;
19+
import org.digma.intellij.plugin.ui.model.errors.FrameItem;
20+
import org.digma.intellij.plugin.ui.model.errors.FrameListViewItem;
21+
import org.digma.intellij.plugin.ui.model.errors.FrameStackTitle;
22+
import org.digma.intellij.plugin.ui.model.errors.SpanTitle;
1723
import org.digma.intellij.plugin.ui.model.listview.ListViewItem;
1824
import org.jetbrains.annotations.NotNull;
1925

@@ -51,14 +57,17 @@ public ErrorsListContainer getErrors(@NotNull MethodInfo methodInfo) {
5157

5258
Log.log(LOGGER::debug, "ListViewItems for {}: {}", methodInfo.getId(), errorsListViewItems);
5359

54-
return new ErrorsListContainer(errorsListViewItems);
60+
final UsageStatusResult usageStatus = analyticsService.getUsageStatusOfErrors(List.of(methodInfo.idWithType()));
61+
Log.log(LOGGER::debug, "UsageStatus for {}: {}", methodInfo.getId(), usageStatus);
62+
63+
return new ErrorsListContainer(errorsListViewItems, usageStatus);
5564
}catch (AnalyticsServiceException e){
5665
//if analyticsService.getErrorsOfCodeObject throws exception it means errors could not be loaded, usually when
5766
//the backend is not available. return an empty ErrorsListContainer to keep everything running and don't
5867
//crash the plugin. don't log the exception, it was logged in AnalyticsService, keep the log quite because
5968
//it may happen many times.
6069
Log.log(LOGGER::debug, "AnalyticsServiceException for getErrors for {}: {}", methodInfo.getId(), e.getMessage());
61-
return new ErrorsListContainer(new ArrayList<>());
70+
return new ErrorsListContainer();
6271
}
6372
}
6473

0 commit comments

Comments
 (0)