Skip to content

Commit fa82082

Browse files
Track the LSP request data from syntax server (#3278)
- Track the LSP request data from syntax server - Move registerCodeCompletionTelemetryListener just before language client is initialized Co-authored-by: Jinbo Wang <jinbwan@microsoft.com> Co-authored-by: Roland Grunberg <rgrunber@redhat.com>
1 parent 2e38c4e commit fa82082

5 files changed

Lines changed: 34 additions & 24 deletions

File tree

src/TracingLanguageClient.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ export const onDidRequestEnd: Event<TraceEvent> = requestEndEventEmitter.event;
1010

1111
export class TracingLanguageClient extends LanguageClient {
1212
private isStarted: boolean = false;
13+
private isSyntaxServer: boolean = false;
1314

1415
constructor(id: string, name: string, serverOptions: ServerOptions, clientOptions: LanguageClientOptions, forceDebug?: boolean) {
1516
super(id, name, serverOptions, clientOptions, forceDebug);
17+
this.isSyntaxServer = name?.includes("Syntax Server");
1618
}
1719

1820
start(): Promise<void> {
@@ -118,6 +120,7 @@ export class TracingLanguageClient extends LanguageClient {
118120
duration,
119121
resultLength,
120122
data,
123+
fromSyntaxServer: !!this.isSyntaxServer,
121124
});
122125
}
123126

@@ -128,6 +131,7 @@ export class TracingLanguageClient extends LanguageClient {
128131
duration,
129132
error,
130133
data,
134+
fromSyntaxServer: !!this.isSyntaxServer,
131135
});
132136
}
133137

src/extension.api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ export interface TraceEvent {
9494
* Additional data properties, such as the completion trigger context.
9595
*/
9696
data?: any;
97+
/**
98+
* Whether the response is from the syntax server.
99+
*/
100+
fromSyntaxServer?: boolean;
97101
}
98102

99103
export interface SourceInvalidatedEvent {

src/extension.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import * as fse from 'fs-extra';
66
import * as os from 'os';
77
import * as path from 'path';
88
import { CodeActionContext, commands, ConfigurationTarget, Diagnostic, env, EventEmitter, ExtensionContext, extensions, IndentAction, InputBoxOptions, languages, RelativePattern, TextDocument, UIKind, Uri, ViewColumn, window, workspace, WorkspaceConfiguration, ProgressLocation, Position, Selection, Range } from 'vscode';
9-
import { CancellationToken, CodeActionParams, CodeActionRequest, Command, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient';
9+
import { CancellationToken, CodeActionParams, CodeActionRequest, Command, CompletionRequest, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient';
1010
import { LanguageClient } from 'vscode-languageclient/node';
1111
import { apiManager } from './apiManager';
1212
import { ClientErrorHandler } from './clientErrorHandler';
1313
import { Commands } from './commands';
14-
import { ClientStatus, ExtensionAPI } from './extension.api';
14+
import { ClientStatus, ExtensionAPI, TraceEvent } from './extension.api';
1515
import * as fileEventHandler from './fileEventHandler';
1616
import { getSharedIndexCache, HEAP_DUMP_LOCATION, prepareExecutable } from './javaServerStarter';
1717
import { initializeLogFile, logger } from './log';
@@ -273,6 +273,7 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
273273
};
274274

275275
apiManager.initialize(requirements, serverMode);
276+
registerCodeCompletionTelemetryListener();
276277
resolve(apiManager.getApiInstance());
277278
// the promise is resolved
278279
// no need to pass `resolve` into any code past this point,
@@ -983,6 +984,24 @@ async function cleanJavaWorkspaceStorage() {
983984
}
984985
}
985986

987+
export function registerCodeCompletionTelemetryListener() {
988+
apiManager.getApiInstance().onDidRequestEnd((traceEvent: TraceEvent) => {
989+
if (traceEvent.type === CompletionRequest.method) {
990+
// Exclude the invalid completion requests.
991+
if (!traceEvent.resultLength) {
992+
return;
993+
}
994+
const props = {
995+
duration: Math.round(traceEvent.duration * 100) / 100,
996+
resultLength: traceEvent.resultLength || 0,
997+
error: !!traceEvent.error,
998+
fromSyntaxServer: !!traceEvent.fromSyntaxServer,
999+
};
1000+
return Telemetry.sendTelemetry(Telemetry.COMPLETION_EVENT, props);
1001+
}
1002+
});
1003+
}
1004+
9861005
function registerOutOfMemoryDetection(storagePath: string) {
9871006
const heapDumpFolder = getHeapDumpFolderFromSettings() || storagePath;
9881007
chokidar.watch(`${heapDumpFolder}/java_*.hprof`, { ignoreInitial: true }).on('add', path => {

src/standardLanguageClient.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import * as net from 'net';
44
import * as path from 'path';
55
import { CancellationToken, CodeActionKind, commands, ConfigurationTarget, DocumentSelector, EventEmitter, ExtensionContext, extensions, languages, Location, ProgressLocation, TextEditor, Uri, ViewColumn, window, workspace } from "vscode";
6-
import { ConfigurationParams, ConfigurationRequest, LanguageClientOptions, Location as LSLocation, MessageType, Position as LSPosition, TextDocumentPositionParams, WorkspaceEdit, CompletionRequest } from "vscode-languageclient";
6+
import { ConfigurationParams, ConfigurationRequest, LanguageClientOptions, Location as LSLocation, MessageType, Position as LSPosition, TextDocumentPositionParams, WorkspaceEdit } from "vscode-languageclient";
77
import { LanguageClient, StreamInfo } from "vscode-languageclient/node";
88
import { apiManager } from "./apiManager";
99
import * as buildPath from './buildpath';
1010
import { javaRefactorKinds, RefactorDocumentProvider } from "./codeActionProvider";
1111
import { Commands } from "./commands";
12-
import { ClientStatus, TraceEvent } from "./extension.api";
12+
import { ClientStatus } from "./extension.api";
1313
import * as fileEventHandler from './fileEventHandler';
1414
import { gradleCodeActionMetadata, GradleCodeActionProvider } from "./gradle/gradleCodeActionProvider";
1515
import { awaitServerConnection, prepareExecutable, DEBUG } from "./javaServerStarter";
@@ -34,7 +34,7 @@ import { askForProjects, projectConfigurationUpdate, upgradeGradle } from "./sta
3434
import { TracingLanguageClient } from './TracingLanguageClient';
3535
import { TypeHierarchyDirection, TypeHierarchyItem } from "./typeHierarchy/protocol";
3636
import { typeHierarchyTree } from "./typeHierarchy/typeHierarchyTree";
37-
import { getAllJavaProjects, getJavaConfig, getJavaConfiguration } from "./utils";
37+
import { getAllJavaProjects, getJavaConfiguration } from "./utils";
3838
import { Telemetry } from "./telemetry";
3939
import { TelemetryEvent } from "@redhat-developer/vscode-redhat-telemetry/lib";
4040
import { registerDocumentValidationListener } from './diagnostic';
@@ -147,7 +147,6 @@ export class StandardLanguageClient {
147147
// Disable the client-side snippet provider since LS is ready.
148148
snippetCompletionProvider.dispose();
149149
registerDocumentValidationListener(context, this.languageClient);
150-
registerCodeCompletionTelemetryListener();
151150
commands.executeCommand('setContext', 'javaLSReady', true);
152151
break;
153152
case 'Started':
@@ -814,21 +813,4 @@ export async function applyWorkspaceEdit(workspaceEdit: WorkspaceEdit, languageC
814813
} else {
815814
return Promise.resolve(true);
816815
}
817-
}
818-
819-
export function registerCodeCompletionTelemetryListener() {
820-
apiManager.getApiInstance().onDidRequestEnd((traceEvent: TraceEvent) => {
821-
if (traceEvent.type === CompletionRequest.method) {
822-
// Exclude the invalid completion requests.
823-
if (!traceEvent.resultLength) {
824-
return;
825-
}
826-
const props = {
827-
duration: Math.round(traceEvent.duration * 100) / 100,
828-
resultLength: traceEvent.resultLength || 0,
829-
error: !!traceEvent.error,
830-
};
831-
return Telemetry.sendTelemetry(Telemetry.COMPLETION_EVENT, props);
832-
}
833-
});
834816
}

src/syntaxLanguageClient.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { ServerMode } from "./settings";
1414
import { snippetCompletionProvider } from "./snippetCompletionProvider";
1515
import { getJavaConfig } from "./utils";
1616
import { DEBUG } from "./javaServerStarter";
17+
import { TracingLanguageClient } from "./TracingLanguageClient";
1718

1819
const extensionName = "Language Support for Java (Syntax Server)";
1920

@@ -60,7 +61,7 @@ export class SyntaxLanguageClient {
6061
}
6162

6263
if (serverOptions) {
63-
this.languageClient = new LanguageClient('java', extensionName, serverOptions, newClientOptions, DEBUG);
64+
this.languageClient = new TracingLanguageClient('java', extensionName, serverOptions, newClientOptions, DEBUG);
6465
}
6566

6667
this.status = ClientStatus.initialized;

0 commit comments

Comments
 (0)