Skip to content

Commit 61379ce

Browse files
committed
fix: Don't crash language servers if telemetry cannot be initialized
Fixes #1384 Signed-off-by: azerr <[email protected]>
1 parent 66f8c8e commit 61379ce

File tree

14 files changed

+357
-76
lines changed

14 files changed

+357
-76
lines changed

src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusDeploymentSupport.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import com.redhat.devtools.intellij.lsp4mp4ij.classpath.ClasspathResourceChangedManager;
3636
import com.redhat.devtools.intellij.quarkus.buildtool.BuildToolDelegate;
3737
import com.redhat.devtools.intellij.quarkus.search.QuarkusModuleComponent;
38+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryEventName;
39+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryManager;
3840
import org.jetbrains.annotations.NotNull;
3941
import org.jetbrains.annotations.Nullable;
4042
import org.slf4j.Logger;
@@ -92,6 +94,7 @@ public CompletableFuture<Void> updateClasspathWithQuarkusDeploymentAsync(Module
9294
public static void updateClasspathWithQuarkusDeployment(Module module, ProgressIndicator progressIndicator) {
9395
if (module.isDisposed())
9496
return;
97+
Project project = module.getProject();
9598
LOGGER.info("Ensuring library to " + module.getName());
9699
long start = System.currentTimeMillis();
97100
BuildToolDelegate toolDelegate = BuildToolDelegate.getDelegate(module);
@@ -110,22 +113,24 @@ public static void updateClasspathWithQuarkusDeployment(Module module, ProgressI
110113
Library library = table.getLibraryByName(QuarkusConstants.QUARKUS_DEPLOYMENT_LIBRARY_NAME);
111114
while (library != null) {
112115
table.removeLibrary(library);
113-
try {
114-
TelemetryService.instance().action(TelemetryService.MODEL_PREFIX + "removeLibrary");
115-
} catch (Exception e) {
116116

117-
}
117+
// Send "model-removeLibrary" telemetry event
118+
TelemetryManager.getInstance(project)
119+
.getTelemetryService()
120+
.send(TelemetryEventName.MODEL_REMOVE_LIBRARY);
121+
118122
library = table.getLibraryByName(QuarkusConstants.QUARKUS_DEPLOYMENT_LIBRARY_NAME);
119123
}
120124
progressIndicator.checkCanceled();
121125
progressIndicator.setText("Adding in ''" + module.getName() + "'' Quarkus deployment dependencies to classpath...");
122126
List<VirtualFile>[] files = toolDelegate.getDeploymentFiles(module, progressIndicator);
123127
LOGGER.info("Adding library to " + module.getName() + " previousHash=" + previousHash + " newHash=" + actualHash);
124-
try {
125-
TelemetryService.instance().action(TelemetryService.MODEL_PREFIX + "addLibrary").send();
126-
} catch (Exception e) {
127128

128-
}
129+
// Send "model-addLibrary" telemetry event
130+
TelemetryManager.getInstance(project)
131+
.getTelemetryService()
132+
.send(TelemetryEventName.MODEL_ADD_LIBRARY);
133+
129134
addLibrary(model, files);
130135
});
131136
component.setHash(actualHash);

src/main/java/com/redhat/devtools/intellij/quarkus/TelemetryService.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/main/java/com/redhat/devtools/intellij/quarkus/buildtool/maven/MavenToolDelegate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ private Set<MavenArtifact> resolveDeploymentArtifacts(Module module, MavenProjec
203203
}
204204
}
205205
}
206-
} catch (MavenProcessCanceledException | RuntimeException e) {
206+
} catch (Exception e) {
207207
LOGGER.warn(e.getLocalizedMessage(), e);
208208
}
209209
return deploymentArtifacts;

src/main/java/com/redhat/devtools/intellij/quarkus/lsp/QuarkusServer.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
import com.intellij.openapi.extensions.PluginId;
1616
import com.intellij.openapi.project.Project;
1717
import com.intellij.openapi.vfs.VirtualFile;
18+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryEventName;
19+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryManager;
1820
import com.redhat.devtools.lsp4ij.server.JavaProcessCommandBuilder;
1921
import com.redhat.devtools.lsp4ij.server.ProcessStreamConnectionProvider;
2022
import com.redhat.devtools.intellij.lsp4mp4ij.settings.UserDefinedMicroProfileSettings;
21-
import com.redhat.devtools.intellij.quarkus.TelemetryService;
2223
import org.slf4j.Logger;
2324
import org.slf4j.LoggerFactory;
2425

25-
import java.net.URI;
2626
import java.nio.file.Path;
2727
import java.util.Arrays;
2828
import java.util.HashMap;
@@ -55,11 +55,9 @@ public QuarkusServer(Project project) {
5555
commands.add("-DrunAsync=true");
5656
super.setCommands(commands);
5757

58-
try {
59-
TelemetryService.instance().action(TelemetryService.LSP_PREFIX + "start").send();
60-
} catch (Exception e) {
61-
LOGGER.error("Error while consuming telemetry service", e);
62-
}
58+
TelemetryManager.getInstance(project)
59+
.getTelemetryService()
60+
.send(TelemetryEventName.LSP_START_MICROPROFILE_SERVER);
6361
}
6462

6563
@Override

src/main/java/com/redhat/devtools/intellij/quarkus/projectWizard/QuarkusModuleBuilder.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import com.intellij.openapi.vfs.VirtualFile;
2424
import com.intellij.openapi.vfs.newvfs.RefreshQueue;
2525
import com.redhat.devtools.intellij.quarkus.QuarkusConstants;
26-
import com.redhat.devtools.intellij.quarkus.TelemetryService;
26+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryEventName;
27+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryManager;
28+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryService;
2729
import com.redhat.devtools.intellij.telemetry.core.service.TelemetryMessageBuilder;
2830
import org.jdom.JDOMException;
2931
import org.jetbrains.annotations.NotNull;
@@ -86,15 +88,21 @@ public ModuleWizardStep modifySettingsStep(@NotNull SettingsStep settingsStep) {
8688
@NotNull
8789
@Override
8890
public Module createModule(@NotNull ModifiableModuleModel moduleModel) throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException {
89-
TelemetryMessageBuilder.ActionMessage telemetry = TelemetryService.instance().action(TelemetryService.UI_PREFIX + "wizard");
91+
TelemetryService telemetryService = TelemetryManager.getInstance(moduleModel.getProject())
92+
.getTelemetryService();
93+
TelemetryMessageBuilder.ActionMessage telemetryMessage =
94+
telemetryService
95+
.action(TelemetryEventName.UI_WIZARD);
9096
try {
9197
processDownload();
9298
Module module = super.createModule(moduleModel);
9399
wizardContext.getUserData(QuarkusConstants.WIZARD_TOOL_KEY).processImport(module);
94-
telemetry.send();
100+
// Send "ui-wizard" telemetry event with no error
101+
telemetryService.asyncSend(telemetryMessage);
95102
return module;
96103
} catch (IOException | InvalidDataException | ModuleWithNameAlreadyExists | JDOMException | ConfigurationException e) {
97-
telemetry.error(e).send();
104+
// Send "ui-wizard" telemetry event with error
105+
telemetryService.asyncSend(telemetryMessage.error(e));
98106
throw e;
99107
}
100108
}

src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConfiguration.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
import com.intellij.openapi.project.Project;
3434
import com.intellij.openapi.ui.Messages;
3535
import com.redhat.devtools.intellij.quarkus.QuarkusModuleUtil;
36-
import com.redhat.devtools.intellij.quarkus.TelemetryService;
3736
import com.redhat.devtools.intellij.quarkus.buildtool.BuildToolDelegate;
37+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryEventName;
38+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryManager;
39+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryService;
3840
import com.redhat.devtools.intellij.telemetry.core.service.TelemetryMessageBuilder;
3941
import org.jetbrains.annotations.NotNull;
4042
import org.jetbrains.annotations.Nullable;
@@ -121,23 +123,32 @@ private void allocateLocalPort() {
121123
@Nullable
122124
@Override
123125
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment environment) throws ExecutionException {
124-
TelemetryMessageBuilder.ActionMessage telemetry = TelemetryService.instance().action(TelemetryService.RUN_PREFIX + "run");
125-
telemetry.property("kind", executor.getId());
126-
BuildToolDelegate toolDelegate = BuildToolDelegate.getDelegate(getModule());
126+
Module module = getModule();
127+
128+
TelemetryService telemetryService = TelemetryManager.getInstance(module.getProject())
129+
.getTelemetryService();
130+
TelemetryMessageBuilder.ActionMessage telemetryMessage =
131+
telemetryService
132+
.action(TelemetryEventName.RUN_RUN);
133+
134+
telemetryMessage.property("kind", executor.getId());
135+
BuildToolDelegate toolDelegate = BuildToolDelegate.getDelegate(module);
127136
allocateLocalPort();
128137
RunProfileState state = null;
129138
if (toolDelegate != null) {
130-
telemetry.property("tool", toolDelegate.getDisplay());
139+
telemetryMessage.property("tool", toolDelegate.getDisplay());
131140
// Create a Gradle or Maven run configuration in memory
132-
RunnerAndConfigurationSettings settings = toolDelegate.getConfigurationDelegate(getModule(), this);
141+
RunnerAndConfigurationSettings settings = toolDelegate.getConfigurationDelegate(module, this);
133142
if (settings != null) {
134143
long groupId = ExecutionEnvironment.getNextUnusedExecutionId();
135144
state = doRunConfiguration(settings, executor, DefaultExecutionTarget.INSTANCE, groupId, null);
136145
}
137146
} else {
138-
telemetry.property("tool", "not found");
147+
telemetryMessage.property("tool", "not found");
139148
}
140-
telemetry.send();
149+
// Send "run-run" telemetry event
150+
telemetryService.asyncSend(telemetryMessage);
151+
141152
if (executor.getId() == DefaultDebugExecutor.EXECUTOR_ID) {
142153
ProgressManager.getInstance().run(new Task.Backgroundable(getProject(), QUARKUS_CONFIGURATION, false) {
143154
@Override

src/main/java/com/redhat/devtools/intellij/quarkus/run/dashboard/QuarkusRunDashboardCustomizer.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
import com.intellij.execution.ui.RunContentDescriptor;
1818
import com.intellij.ide.projectView.PresentationData;
1919
import com.intellij.openapi.module.Module;
20+
import com.intellij.openapi.project.Project;
2021
import com.intellij.ui.SimpleColoredComponent;
2122
import com.intellij.ui.SimpleTextAttributes;
2223
import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProject;
2324
import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.project.PsiMicroProfileProjectManager;
2425
import com.redhat.devtools.intellij.quarkus.QuarkusModuleUtil;
25-
import com.redhat.devtools.intellij.quarkus.TelemetryService;
2626
import com.redhat.devtools.intellij.quarkus.run.QuarkusRunConfiguration;
27+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryEventName;
28+
import com.redhat.devtools.intellij.quarkus.telemetry.TelemetryManager;
2729
import org.jetbrains.annotations.NotNull;
2830
import org.jetbrains.annotations.Nullable;
2931

@@ -59,7 +61,8 @@ public boolean updatePresentation(@NotNull PresentationData presentation, @NotNu
5961
QuarkusRunConfiguration quarkusRunConfiguration = (QuarkusRunConfiguration) node.getConfigurationSettings().getConfiguration();
6062
Module module = quarkusRunConfiguration.getModule();
6163
if (QuarkusModuleUtil.isQuarkusWebAppModule(module)) {
62-
PsiMicroProfileProject mpProject = PsiMicroProfileProjectManager.getInstance(module.getProject()).getMicroProfileProject(module);
64+
Project project = module.getProject();
65+
PsiMicroProfileProject mpProject = PsiMicroProfileProjectManager.getInstance(project).getMicroProfileProject(module);
6366

6467
// It is a Web application, add links for:
6568
// - Opening quarkus application in a browser
@@ -81,17 +84,21 @@ public boolean updatePresentation(@NotNull PresentationData presentation, @NotNu
8184
public void run() {
8285
// Open Quarkus application in a Web Browser
8386
super.run();
84-
// Send event with telemetry
85-
TelemetryService.instance().action(TelemetryService.UI_PREFIX + "openApplication").send();
87+
// Send "ui-openApplication" telemetry event
88+
TelemetryManager.getInstance(project)
89+
.getTelemetryService()
90+
.send(TelemetryEventName.UI_OPEN_APPLICATION);
8691
}
8792
});
8893
links.put(devUILabel, new SimpleColoredComponent.BrowserLauncherTag(devUIUrl) {
8994
@Override
9095
public void run() {
9196
// Open DevUI in a Web Browser
9297
super.run();
93-
// Send event with telemetry
94-
TelemetryService.instance().action(TelemetryService.UI_PREFIX + "openDevUI").send();
98+
// Send "ui-openDevUI" telemetry event
99+
TelemetryManager.getInstance(project)
100+
.getTelemetryService()
101+
.send(TelemetryEventName.UI_OPEN_DEV_UI);
95102
}
96103
});
97104
node.putUserData(RunDashboardCustomizer.NODE_LINKS, links);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Red Hat Inc. and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
7+
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
8+
*
9+
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
10+
*
11+
* Contributors:
12+
* Red Hat Inc. - initial API and implementation
13+
*******************************************************************************/
14+
package com.redhat.devtools.intellij.quarkus.telemetry;
15+
16+
/**
17+
* No-Op implementation of telemetry service
18+
*/
19+
public class NoOpTelemetryService implements TelemetryService {
20+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Red Hat Inc. and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
7+
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
8+
*
9+
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
10+
*
11+
* Contributors:
12+
* Red Hat Inc. - initial API and implementation
13+
*******************************************************************************/
14+
package com.redhat.devtools.intellij.quarkus.telemetry;
15+
16+
import com.intellij.ide.plugins.PluginManager;
17+
import com.intellij.openapi.application.ApplicationManager;
18+
import com.redhat.devtools.intellij.telemetry.core.service.TelemetryMessageBuilder;
19+
import com.redhat.devtools.intellij.telemetry.core.util.Lazy;
20+
import org.jetbrains.annotations.NotNull;
21+
import org.jetbrains.annotations.Nullable;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
25+
import java.util.Map;
26+
27+
/**
28+
* Red Hat Telemetry Service, used when <a href="https://github.com/redhat-developer/intellij-redhat-telemetry">intellij-redhat-telemetry</a> is available
29+
*/
30+
public class RedHatTelemetryService implements TelemetryService {
31+
32+
private static final Logger LOGGER = LoggerFactory.getLogger(RedHatTelemetryService.class);
33+
34+
private final Lazy<TelemetryMessageBuilder> builder = new Lazy<>(() -> new TelemetryMessageBuilder(PluginManager.getPluginByClass(this.getClass())));
35+
36+
private boolean hasError;
37+
@Override
38+
public void send(TelemetryEventName eventName, Map<String, String> properties) {
39+
TelemetryMessageBuilder.ActionMessage action = action(eventName, properties);
40+
if (action == null) {
41+
return;
42+
}
43+
asyncSend(action);
44+
}
45+
46+
@Override
47+
public @Nullable TelemetryMessageBuilder.ActionMessage action(TelemetryEventName eventName, Map<String, String> properties) {
48+
TelemetryMessageBuilder builder = getMessageBuilder();
49+
if (builder == null) {
50+
return null;
51+
}
52+
TelemetryMessageBuilder.ActionMessage action = builder.action(eventName.getEventName());
53+
if (properties != null) {
54+
properties.forEach((k, v) -> {
55+
action.property(k, v);
56+
});
57+
}
58+
return action;
59+
}
60+
61+
@Nullable
62+
private TelemetryMessageBuilder getMessageBuilder() {
63+
if (hasError) {
64+
return null;
65+
}
66+
try {
67+
return builder.get();
68+
}
69+
catch(Exception e) {
70+
hasError = true;
71+
return null;
72+
}
73+
}
74+
75+
@Override
76+
public void asyncSend(@Nullable TelemetryMessageBuilder.ActionMessage message) {
77+
if (message == null) {
78+
return;
79+
}
80+
ApplicationManager.getApplication().executeOnPooledThread(() -> {
81+
try{
82+
message.send();
83+
} catch (Exception e) {
84+
LOGGER.warn("Failed to send Telemetry data : {}", e.getMessage());
85+
}
86+
});
87+
}
88+
89+
}

0 commit comments

Comments
 (0)