Skip to content

Commit 34c5219

Browse files
Allow 3rd party extensions to track errors in language client & server (#3162)
* Allow 3rd party extensions to track errors in language client & server Signed-off-by: Jinbo Wang <[email protected]>
1 parent 75dc796 commit 34c5219

File tree

4 files changed

+33
-2
lines changed

4 files changed

+33
-2
lines changed

src/apiManager.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class ApiManager {
1717
private onDidClasspathUpdateEmitter: Emitter<Uri> = new Emitter<Uri>();
1818
private onDidServerModeChangeEmitter: Emitter<ServerMode> = new Emitter<ServerMode>();
1919
private onDidProjectsImportEmitter: Emitter<Uri[]> = new Emitter<Uri[]>();
20+
private traceEventEmitter: Emitter<any> = new Emitter<any>();
2021
private serverReadyPromiseResolve: (result: boolean) => void;
2122

2223
public initialize(requirements: RequirementsData, serverMode: ServerMode): void {
@@ -38,6 +39,7 @@ class ApiManager {
3839
const onDidClasspathUpdate = this.onDidClasspathUpdateEmitter.event;
3940
const onDidServerModeChange = this.onDidServerModeChangeEmitter.event;
4041
const onDidProjectsImport = this.onDidProjectsImportEmitter.event;
42+
const traceEvent = this.traceEventEmitter.event;
4143

4244
const serverReadyPromise: Promise<boolean> = new Promise<boolean>((resolve) => {
4345
this.serverReadyPromiseResolve = resolve;
@@ -62,6 +64,7 @@ class ApiManager {
6264
onDidProjectsImport,
6365
serverReady,
6466
onDidRequestEnd,
67+
trackEvent: traceEvent,
6568
};
6669
}
6770

@@ -85,6 +88,10 @@ class ApiManager {
8588
this.onDidProjectsImportEmitter.fire(event);
8689
}
8790

91+
public fireTraceEvent(event: any): void {
92+
this.traceEventEmitter.fire(event);
93+
}
94+
8895
public updateServerMode(mode: ServerMode): void {
8996
this.api.serverMode = mode;
9097
}

src/clientErrorHandler.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import { serverStatusBarProvider } from './serverStatusBarProvider';
33
import { ErrorHandler, Message, ErrorAction, CloseAction, ErrorHandlerResult, CloseHandlerResult } from "vscode-languageclient";
44
import { Commands } from "./commands";
55
import { logger } from "./log";
6+
import { apiManager } from "./apiManager";
67

8+
const CLIENT_ERROR = "java.client.error";
79
export class ClientErrorHandler implements ErrorHandler {
810
private restarts: number[];
911

@@ -20,7 +22,14 @@ export class ClientErrorHandler implements ErrorHandler {
2022
};
2123
}
2224

23-
logger.error(`${this.name} server encountered error and will shut down: ${_message}, ${_error && _error.toString()}`);
25+
const errorMessage = `${this.name} server encountered error and will shut down: ${_message}, ${_error && _error.toString()}`;
26+
apiManager.fireTraceEvent({
27+
name: CLIENT_ERROR,
28+
properties: {
29+
message: errorMessage,
30+
},
31+
});
32+
logger.error(errorMessage);
2433
return {
2534
action: ErrorAction.Shutdown,
2635
handled: true
@@ -39,6 +48,12 @@ export class ClientErrorHandler implements ErrorHandler {
3948
const diff = this.restarts[this.restarts.length - 1] - this.restarts[0];
4049
if (diff <= 3 * 60 * 1000) {
4150
const message = `The ${this.name} server crashed 5 times in the last 3 minutes. The server will not be restarted.`;
51+
apiManager.fireTraceEvent({
52+
name: CLIENT_ERROR,
53+
properties: {
54+
message,
55+
},
56+
});
4257
logger.error(message);
4358
serverStatusBarProvider.setError();
4459
const action = "Show logs";

src/extension.api.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export interface TraceEvent {
9292
resultLength?: number | undefined;
9393
}
9494

95-
export const extensionApiVersion = '0.8';
95+
export const extensionApiVersion = '0.9';
9696

9797
export interface ExtensionAPI {
9898
readonly apiVersion: string;
@@ -144,4 +144,12 @@ export interface ExtensionAPI {
144144
* @since extension version 1.16.0
145145
*/
146146
readonly onDidRequestEnd: Event<TraceEvent>;
147+
148+
/**
149+
* Allow 3rd party trace handler to track the language client & server error events.
150+
*
151+
* @since API version 0.9
152+
* @since extension version 1.20.0
153+
*/
154+
readonly trackEvent: Event<any>;
147155
}

src/standardLanguageClient.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ export class StandardLanguageClient {
296296
});
297297

298298
this.languageClient.onTelemetry(async (e: TelemetryEvent) => {
299+
apiManager.fireTraceEvent(e);
299300
if (e.name === Telemetry.SERVER_INITIALIZED_EVT) {
300301
return Telemetry.sendTelemetry(Telemetry.STARTUP_EVT, e.properties);
301302
}

0 commit comments

Comments
 (0)