Skip to content

Commit 83646a5

Browse files
author
Amit Joshi
committed
Add telemetry support for Server API autocomplete functionality
- Introduced telemetry context management for Server API autocomplete events. - Implemented logging for activation, registration, and triggering of autocomplete features. - Created telemetry event names for better tracking of autocomplete interactions.
1 parent 24c19d5 commit 83646a5

File tree

6 files changed

+236
-13
lines changed

6 files changed

+236
-13
lines changed

src/client/extension.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import { authenticateUserInVSCode } from "../common/services/AuthenticationProvi
5353
import { PROVIDER_ID } from "../common/services/Constants";
5454
import { activateServerApiAutocomplete } from "../common/intellisense";
5555
import { EnableBLChanges } from "../common/ecs-features/ecsFeatureGates";
56+
import { setServerApiTelemetryContext } from "../common/intellisense/ServerApiTelemetryContext";
5657

5758
let client: LanguageClient;
5859
let _context: vscode.ExtensionContext;
@@ -234,6 +235,15 @@ export async function activate(
234235

235236
const { enableBLChanges } = EnableBLChanges.getConfig() as { enableBLChanges?: boolean };
236237
if (!serverApiAutocompleteInitialized && enableBLChanges) {
238+
// Set telemetry context for Server API autocomplete events
239+
setServerApiTelemetryContext({
240+
tenantId: TenantID,
241+
envId: EnvID,
242+
userId: AadObjectId,
243+
orgId: orgID,
244+
geo: geoName,
245+
extType: 'desktop'
246+
});
237247
activateServerApiAutocomplete(_context, [
238248
{ languageId: 'javascript', triggerCharacters: ['.'] }
239249
]);

src/common/intellisense/ServerApiAutocompleteRegistrar.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
import * as vscode from "vscode";
77
import { ServerApiCompletionProvider } from "./ServerApiCompletionProvider";
8+
import { oneDSLoggerWrapper } from "../OneDSLoggerTelemetry/oneDSLoggerWrapper";
9+
import { ServerApiTelemetryEventNames } from "./serverApiTelemetryEventNames";
10+
import { getServerApiTelemetryContext } from "./ServerApiTelemetryContext";
811

912
/**
1013
* Configuration for autocomplete language support
@@ -60,6 +63,21 @@ export class ServerApiAutocompleteRegistrar {
6063
context.subscriptions.push(disposable);
6164
});
6265

66+
try {
67+
const ctx = getServerApiTelemetryContext();
68+
oneDSLoggerWrapper.getLogger().traceInfo(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_REGISTERED, {
69+
languages: languageConfigs.map(l => l.languageId).join(','),
70+
triggerChars: languageConfigs.map(l => (l.triggerCharacters || ['.']).join('')).join(','),
71+
provider: "ServerApiCompletionProvider",
72+
tenantId: ctx?.tenantId,
73+
envId: ctx?.envId,
74+
userId: ctx?.userId,
75+
orgId: ctx?.orgId,
76+
geo: ctx?.geo,
77+
extType: ctx?.extType
78+
});
79+
} catch { /* no-op */ }
80+
6381
return disposables;
6482
}
6583

@@ -120,5 +138,21 @@ export function activateServerApiAutocomplete(
120138
customLanguages?: ILanguageConfig[]
121139
): void {
122140
const languageConfigs = customLanguages || defaultLanguageConfigs;
141+
142+
try {
143+
const ctx = getServerApiTelemetryContext();
144+
oneDSLoggerWrapper.getLogger().traceInfo(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_ACTIVATE, {
145+
languages: languageConfigs.map(l => l.languageId).join(','),
146+
provider: "ServerApiCompletionProvider",
147+
// context
148+
tenantId: ctx?.tenantId,
149+
envId: ctx?.envId,
150+
userId: ctx?.userId,
151+
orgId: ctx?.orgId,
152+
geo: ctx?.geo,
153+
extType: ctx?.extType
154+
});
155+
} catch { /* no-op */ }
156+
123157
ServerApiAutocompleteRegistrar.registerLanguages(context, languageConfigs);
124158
}

src/common/intellisense/ServerApiCompletionProvider.ts

Lines changed: 78 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
*/
55

66
import * as vscode from "vscode";
7+
import { oneDSLoggerWrapper } from "../OneDSLoggerTelemetry/oneDSLoggerWrapper";
8+
import { ServerApiTelemetryEventNames } from "./serverApiTelemetryEventNames";
9+
import { getServerApiTelemetryContext } from "./ServerApiTelemetryContext";
710

811
/**
912
* Interface for Server API method definitions
@@ -437,20 +440,82 @@ export class ServerApiCompletionProvider implements vscode.CompletionItemProvide
437440

438441
const completions: vscode.CompletionItem[] = [];
439442

440-
// Check what level of completion we need
441-
if (textBeforeCursor.endsWith('Server.')) {
442-
// Provide top-level namespace completions
443-
completions.push(...this.getNamespaceCompletions());
444-
} else if (textBeforeCursor.endsWith('Server.Connector.')) {
445-
// Provide Connector sub-namespace completions
446-
completions.push(...this.getConnectorSubNamespaces());
447-
} else {
448-
// Check for nested completions
449-
const match = textBeforeCursor.match(/Server\.([^.]+(?:\.[^.]+)?)\.?$/);
450-
if (match) {
451-
const namespaceName = match[1];
452-
completions.push(...this.getMethodCompletions(namespaceName));
443+
try {
444+
const ctx = getServerApiTelemetryContext();
445+
oneDSLoggerWrapper.getLogger().traceInfo(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_TRIGGERED, {
446+
languageId: document.languageId,
447+
prefix: textBeforeCursor.trim().slice(-50),
448+
tenantId: ctx?.tenantId,
449+
envId: ctx?.envId,
450+
userId: ctx?.userId,
451+
orgId: ctx?.orgId,
452+
geo: ctx?.geo,
453+
extType: ctx?.extType
454+
});
455+
456+
// Check what level of completion we need
457+
if (textBeforeCursor.endsWith('Server.')) {
458+
// Provide top-level namespace completions
459+
const items = this.getNamespaceCompletions();
460+
completions.push(...items);
461+
462+
oneDSLoggerWrapper.getLogger().traceInfo(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_NAMESPACES_SHOWN, {
463+
count: String(items.length),
464+
tenantId: ctx?.tenantId,
465+
envId: ctx?.envId,
466+
userId: ctx?.userId,
467+
orgId: ctx?.orgId,
468+
geo: ctx?.geo,
469+
extType: ctx?.extType
470+
});
471+
} else if (textBeforeCursor.endsWith('Server.Connector.')) {
472+
// Provide Connector sub-namespace completions
473+
const items = this.getConnectorSubNamespaces();
474+
completions.push(...items);
475+
476+
oneDSLoggerWrapper.getLogger().traceInfo(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_SUB_NAMESPACES_SHOWN, {
477+
parent: 'Connector',
478+
count: String(items.length),
479+
tenantId: ctx?.tenantId,
480+
envId: ctx?.envId,
481+
userId: ctx?.userId,
482+
orgId: ctx?.orgId,
483+
geo: ctx?.geo,
484+
extType: ctx?.extType
485+
});
486+
} else {
487+
// Check for nested completions
488+
const match = textBeforeCursor.match(/Server\.([^.]+(?:\.[^.]+)?)\.?$/);
489+
if (match) {
490+
const namespaceName = match[1];
491+
const items = this.getMethodCompletions(namespaceName);
492+
completions.push(...items);
493+
494+
oneDSLoggerWrapper.getLogger().traceInfo(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_ITEMS_SHOWN, {
495+
namespace: namespaceName,
496+
count: String(items.length),
497+
tenantId: ctx?.tenantId,
498+
envId: ctx?.envId,
499+
userId: ctx?.userId,
500+
orgId: ctx?.orgId,
501+
geo: ctx?.geo,
502+
extType: ctx?.extType
503+
});
504+
}
453505
}
506+
} catch (err) {
507+
try {
508+
const e = err as Error;
509+
const ctx = getServerApiTelemetryContext();
510+
oneDSLoggerWrapper.getLogger().traceError(ServerApiTelemetryEventNames.SERVER_API_AUTOCOMPLETE_ERROR, e.message, e, {
511+
tenantId: ctx?.tenantId,
512+
envId: ctx?.envId,
513+
userId: ctx?.userId,
514+
orgId: ctx?.orgId,
515+
geo: ctx?.geo,
516+
extType: ctx?.extType
517+
});
518+
} catch { /* no-op */ }
454519
}
455520

456521
return completions;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*/
5+
6+
export interface IServerApiTelemetryContext {
7+
tenantId?: string;
8+
envId?: string;
9+
userId?: string;
10+
orgId?: string;
11+
geo?: string;
12+
extType?: 'desktop' | 'web';
13+
}
14+
15+
let _serverApiTelemetryContext: IServerApiTelemetryContext | undefined;
16+
17+
export function setServerApiTelemetryContext(ctx?: IServerApiTelemetryContext) {
18+
_serverApiTelemetryContext = ctx;
19+
}
20+
21+
export function getServerApiTelemetryContext(): IServerApiTelemetryContext | undefined {
22+
return _serverApiTelemetryContext;
23+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*/
5+
6+
/**
7+
* Telemetry event names for Server API autocomplete functionality
8+
* These events track the usage and performance of Server API IntelliSense features
9+
* in Power Pages JavaScript development within VS Code
10+
*/
11+
export enum ServerApiTelemetryEventNames {
12+
/**
13+
* Fired when Server API autocomplete is activated/initialized in an extension
14+
*/
15+
SERVER_API_AUTOCOMPLETE_ACTIVATE = "ServerApiAutocompleteActivate",
16+
17+
/**
18+
* Fired when Server API completion providers are successfully registered
19+
*/
20+
SERVER_API_AUTOCOMPLETE_REGISTERED = "ServerApiAutocompleteRegistered",
21+
22+
/**
23+
* Fired when Server API autocomplete is triggered by user input
24+
*/
25+
SERVER_API_AUTOCOMPLETE_TRIGGERED = "ServerApiAutocompleteTriggered",
26+
27+
/**
28+
* Fired when Server API namespaces are shown to the user (e.g., Server.Logger, Server.Context)
29+
*/
30+
SERVER_API_AUTOCOMPLETE_NAMESPACES_SHOWN = "ServerApiAutocompleteNamespacesShown",
31+
32+
/**
33+
* Fired when Server API sub-namespaces are shown (e.g., Server.Connector.HttpClient)
34+
*/
35+
SERVER_API_AUTOCOMPLETE_SUB_NAMESPACES_SHOWN = "ServerApiAutocompleteSubNamespacesShown",
36+
37+
/**
38+
* Fired when specific Server API items/methods are shown to the user
39+
*/
40+
SERVER_API_AUTOCOMPLETE_ITEMS_SHOWN = "ServerApiAutocompleteItemsShown",
41+
42+
/**
43+
* Fired when an error occurs during Server API autocomplete processing
44+
*/
45+
SERVER_API_AUTOCOMPLETE_ERROR = "ServerApiAutocompleteError",
46+
47+
/**
48+
* Fired when Server API telemetry context is set with environment/org details
49+
*/
50+
SERVER_API_TELEMETRY_CONTEXT_SET = "ServerApiTelemetryContextSet",
51+
52+
/**
53+
* Fired when Server API feature flag (EnableBLChanges) is checked
54+
*/
55+
SERVER_API_FEATURE_FLAG_CHECK = "ServerApiFeatureFlagCheck",
56+
57+
/**
58+
* Fired when Server API autocomplete is enabled via feature flag
59+
*/
60+
SERVER_API_FEATURE_FLAG_ENABLED = "ServerApiFeatureFlagEnabled",
61+
62+
/**
63+
* Fired when Server API autocomplete is disabled via feature flag
64+
*/
65+
SERVER_API_FEATURE_FLAG_DISABLED = "ServerApiFeatureFlagDisabled",
66+
67+
/**
68+
* Fired when a Server API completion item is selected/accepted by the user
69+
*/
70+
SERVER_API_COMPLETION_ITEM_SELECTED = "ServerApiCompletionItemSelected",
71+
72+
/**
73+
* Fired when Server API definitions are loaded or refreshed
74+
*/
75+
SERVER_API_DEFINITIONS_LOADED = "ServerApiDefinitionsLoaded",
76+
77+
/**
78+
* Fired when there's an issue with Server API telemetry context retrieval
79+
*/
80+
SERVER_API_TELEMETRY_CONTEXT_ERROR = "ServerApiTelemetryContextError"
81+
}

src/web/client/extension.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import { getECSOrgLocationValue } from "../../common/utilities/Utils";
4646
import { authenticateUserInVSCode } from "../../common/services/AuthenticationProvider";
4747
import { activateServerApiAutocomplete } from "../../common/intellisense";
4848
import { EnableBLChanges } from "../../common/ecs-features/ecsFeatureGates";
49+
import { setServerApiTelemetryContext } from "../../common/intellisense/ServerApiTelemetryContext";
4950

5051
let serverApiAutocompleteInitialized = false;
5152

@@ -154,6 +155,15 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
154155

155156
const { enableBLChanges } = EnableBLChanges.getConfig() as { enableBLChanges?: boolean };
156157
if (!serverApiAutocompleteInitialized && enableBLChanges) {
158+
// Set telemetry context for Server API autocomplete events
159+
setServerApiTelemetryContext({
160+
tenantId: queryParamsMap.get(queryParameters.TENANT_ID) as string,
161+
envId: WebExtensionContext.environmentId,
162+
userId: WebExtensionContext.userId,
163+
orgId: orgId,
164+
geo: WebExtensionContext.geoName,
165+
extType: 'web'
166+
});
157167
activateServerApiAutocomplete(context, [
158168
{ languageId: 'javascript', triggerCharacters: ['.'] }
159169
]);

0 commit comments

Comments
 (0)