Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add language server status notifications #334

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugin/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.31.0",
org.apache.commons.logging;bundle-version="1.2.0",
slf4j.api;bundle-version="2.0.13",
org.apache.commons.lang3;bundle-version="3.14.0"
Bundle-Classpath: target/classes/,
Bundle-Classpath: .,
target/dependency/annotations-2.28.26.jar,
target/dependency/apache-client-2.28.26.jar,
target/dependency/auth-2.28.26.jar,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.eclipse.amazonq.events;

public record LspStatusUpdate(Status status) {
public enum Status {
INITIALIZING("Language Server Initializing"), READY("Language Server Ready"), ERROR("Language Server Error"),
STOPPED("Language Server Stopped");

private final String value;

Status(final String value) {
this.value = value;
}

public String getValue() {
return value;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,23 @@
import java.util.Map;

import software.amazon.awssdk.utils.StringUtils;
import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate;
import software.aws.toolkits.eclipse.amazonq.lsp.encryption.DefaultLspEncryptionManager;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspManager;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RecordLspSetupArgs;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.preferences.AmazonQPreferencePage;
import software.aws.toolkits.eclipse.amazonq.providers.LspManagerProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata;
import software.aws.toolkits.eclipse.amazonq.util.ProxyUtil;
import software.aws.toolkits.telemetry.TelemetryDefinitions.Result;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.preferences.AmazonQPreferencePage;

public class QLspConnectionProvider extends AbstractLspConnectionProvider {

public QLspConnectionProvider() throws IOException {
super();
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.INITIALIZING));
LanguageServerTelemetryProvider.setAllStartPoint(Instant.now());
LspManager lspManager = LspManagerProvider.getInstance();
var lspInstallResult = lspManager.getLspInstallation();
Expand Down Expand Up @@ -67,13 +69,14 @@ public final void start() throws IOException {
try {
DefaultLspEncryptionManager lspEncryption = DefaultLspEncryptionManager.getInstance();
OutputStream serverStdIn = getOutputStream();

lspEncryption.initializeEncryptedCommunication(serverStdIn);
} catch (Exception e) {
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
emitInitFailure(ExceptionMetadata.scrubException(e));
Activator.getLogger().error("Error occured while initializing communication with Amazon Q Lsp Server", e);
}
} catch (Exception e) {
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
emitInitFailure(ExceptionMetadata.scrubException(e));
throw e;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,18 @@
import java.util.HashSet;
import java.util.Optional;

import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate;
import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.ArtifactUtils;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.LspFetcher;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RecordLspSetupArgs;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RemoteLspFetcher;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.VersionManifestFetcher;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Manifest;
import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata;
import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture;
import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform;
import software.aws.toolkits.eclipse.amazonq.util.PluginUtils;
import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils;
Expand Down Expand Up @@ -123,6 +124,7 @@ private boolean hasValidResult(final LspInstallResult overrideResult) {
validateLsp(overrideResult);
} catch (Exception e) {
Activator.getLogger().error(e.getMessage(), e);
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
errorMessage = ExceptionMetadata.scrubException(e);
} finally {
emitValidate(overrideResult, errorMessage, start);
Expand Down Expand Up @@ -192,6 +194,7 @@ private void validateAndConfigureLsp(final LspInstallResult result) throws IOExc
makeExecutable(nodeExecutable);
} catch (Exception e) {
errorMessage = ExceptionMetadata.scrubException(e);
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
throw e;
} finally {
emitValidate(result, errorMessage, start);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,20 @@
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.VersionRange;

import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate;
import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException;
import software.aws.toolkits.eclipse.amazonq.exception.LspError;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspConstants;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspFetchResult;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.ManifestArtifactVersion;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Content;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Manifest;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.ManifestArtifactVersion;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.model.Target;
import software.aws.toolkits.eclipse.amazonq.util.HttpClientFactory;
import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata;
import software.aws.toolkits.eclipse.amazonq.util.HttpClientFactory;
import software.aws.toolkits.eclipse.amazonq.util.PluginArchitecture;
import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform;
import software.aws.toolkits.telemetry.TelemetryDefinitions.LanguageServerLocation;
import software.aws.toolkits.telemetry.TelemetryDefinitions.Result;
Expand Down Expand Up @@ -91,6 +92,7 @@ public LspFetchResult fetch(final PluginPlatform platform, final PluginArchitect
versionRange.toString(), architecture, platform);
setErrorReason(LspError.NO_COMPATIBLE_LSP.toString());
emitGetServer(Result.FAILED, null, LanguageServerLocation.UNKNOWN, start);
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
throw new AmazonQPluginException(failureReason);
}

Expand Down Expand Up @@ -143,10 +145,12 @@ public LspFetchResult fetch(final PluginPlatform platform, final PluginArchitect

String failureReason = "Unable to find a compatible version of Amazon Q Language Server.";
setErrorReason(LspError.NO_VALID_SERVER_FALLBACK.toString());
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
emitGetServer(Result.FAILED, null, LanguageServerLocation.UNKNOWN, start);
throw new AmazonQPluginException(failureReason);
}

@Override
public void cleanup(final Path destinationFolder) {
if (manifest == null || manifest.versions().isEmpty()) {
return;
Expand Down Expand Up @@ -194,6 +198,7 @@ private Optional<ManifestArtifactVersion> resolveVersion(final Manifest manifest
String failureReason = "No valid manifest version data was received. An error could have caused this. Please check logs.";
setErrorReason(LspError.INVALID_VERSION_MANIFEST.toString());
emitGetServer(Result.FAILED, null, LanguageServerLocation.UNKNOWN, start);
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
throw new AmazonQPluginException(failureReason);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;

import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate;
import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException;
import software.aws.toolkits.eclipse.amazonq.exception.LspError;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspConstants;
Expand Down Expand Up @@ -94,6 +95,7 @@ public Optional<Manifest> fetch() {
}
Activator.getLogger().error("Error fetching manifest from remote location", e);
emitGetManifest(null, ManifestLocation.UNKNOWN, ExceptionMetadata.scrubException(LspError.MANIFEST_FETCH_ERROR.toString(), e));
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.ERROR));
return cachedManifest;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@

import org.eclipse.lsp4j.services.LanguageServer;

import software.aws.toolkits.eclipse.amazonq.events.LspStatusUpdate;
import software.aws.toolkits.eclipse.amazonq.lsp.AmazonQLspServer;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RecordLspSetupArgs;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider;
import software.aws.toolkits.telemetry.TelemetryDefinitions.Result;

Expand Down Expand Up @@ -51,6 +53,7 @@ public void setAmazonQServer(final LanguageServer server) {
if (future != null) {
future.complete(server);
}
Activator.getEventBroker().post(new LspStatusUpdate(LspStatusUpdate.Status.READY));
emitInitializeMetric();
}
}
Expand Down
Loading