From cfc45d3f0fe499fb237d4326bf0c1697af35c377 Mon Sep 17 00:00:00 2001 From: BidishaMS <97606074+BidishaMS@users.noreply.github.com> Date: Wed, 17 Jan 2024 23:32:26 +0530 Subject: [PATCH] Populate Vscode extension data in common attribute and modifying few APIs of ITelemetry interface (#811) * First cut of telemetry * First cut of telemetry * changes in 1DSCollector * renamed from collector to logger * merged to remote * Added wrapper * consumed in client * added types * changes * Created common interfaces and wrapper * reverted back changes * removed blank line * removed blank line * removed blank line * populate data * Removed platformType * Removed platformType * changes * changes * changes * revert this changes * revert this changes --- package-lock.json | 124 ++++++++++++++---- package.json | 6 +- .../OneDSLoggerTelemetry/EventContants.ts | 4 + .../OneDSLoggerTelemetry/ITelemetryLogger.ts | 7 +- .../OneDSLoggerTelemetry/oneDSLogger.ts | 70 ++++++++-- .../oneDSLoggerWrapper.ts | 13 +- 6 files changed, 188 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57dd72501..0cd59948f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "license": "SEE LICENSE IN LICENSE", "dependencies": { "@fluidframework/azure-client": "^1.1.1", + "@microsoft/1ds-core-js": "4.0.5", + "@microsoft/1ds-post-js": "4.0.5", "@microsoft/generator-powerpages": "1.21.19", "@types/jwt-decode": "2.2.0", "@types/node-fetch": "^2.6.2", @@ -37,6 +39,8 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", + "@microsoft/1ds-core-js": "4.0.5", + "@microsoft/1ds-post-js": "4.0.5", "@types/chai": "^4.2.14", "@types/command-exists": "^1.2.0", "@types/debug": "^4.1.9", @@ -2568,46 +2572,63 @@ } }, "node_modules/@microsoft/1ds-core-js": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.9.tgz", - "integrity": "sha512-3pCfM2TzHn3gU9pxHztduKcVRdb/nzruvPFfHPZD0IM0mb0h6TGo2isELF3CTMahTx50RAC51ojNIw2/7VRkOg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.0.5.tgz", + "integrity": "sha512-uTOSUoXt/KgnLlGWED+vLLnYCFq1kDFbej+pGAbR+6tMGajCgw3Xz3Xcal0nYhk9RM2hvWWAt5gs6Bu2Si/46g==", + "dev": true, "dependencies": { - "@microsoft/applicationinsights-core-js": "2.8.10", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/applicationinsights-core-js": "3.0.7", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.1 < 2.x" } }, "node_modules/@microsoft/1ds-post-js": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.9.tgz", - "integrity": "sha512-D/RtqkQ2Nr4cuoGqmhi5QTmi3cBlxehIThJ1u3BaH9H/YkLNTKEcHZRWTXy14bXheCefNHciLuadg37G2Kekcg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.0.5.tgz", + "integrity": "sha512-jziJe/nXxgDhnW0sWkXbj9ZfwHXRH6UCn6eGgyWlog3iWP8FgXzna8Rugvct2r43XEqGs6c/NKxuFXAVtyGXjg==", + "dev": true, "dependencies": { - "@microsoft/1ds-core-js": "3.2.9", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/1ds-core-js": "4.0.5", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.1 < 2.x" } }, "node_modules/@microsoft/applicationinsights-core-js": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.10.tgz", - "integrity": "sha512-jQrufDW0+sV8fBhRvzIPNGiCC6dELH+Ug0DM5CfN9757TBqZJz8CSWyDjex39as8+jD0F/8HRU9QdmrVgq5vFg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.7.tgz", + "integrity": "sha512-sVnnVW4fWXzZdtUTVjuwH3xGa1cj+tW7r72voMZzyuNOZ41fBOCK9AqoV0nKP5VCgNjySwn6Rpbw82I4TKKosQ==", + "dev": true, "dependencies": { - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.2", + "@nevware21/ts-async": ">= 0.3.0 < 2.x", + "@nevware21/ts-utils": ">= 0.10.1 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-shims": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", - "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "dev": true, + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } }, "node_modules/@microsoft/dynamicproto-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.7.tgz", - "integrity": "sha512-SK3D3aVt+5vOOccKPnGaJWB5gQ8FuKfjboUJHedMP7gu54HqSCXX5iFXhktGD8nfJb0Go30eDvs/UDoTnR2kOA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "dev": true, + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } }, "node_modules/@microsoft/generator-powerpages": { "version": "1.21.19", @@ -2646,6 +2667,21 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@nevware21/ts-async": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.4.0.tgz", + "integrity": "sha512-dbV826TTehQIBIJjh8GDSbwn1Z6+cnkyNbRlpcpdBPH8mROD2zabIUKqWcw9WRdTjjUIm21K+OR4DXWlAyOVTQ==", + "dev": true, + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.0 < 2.x" + } + }, + "node_modules/@nevware21/ts-utils": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.4.tgz", + "integrity": "sha512-+QSEh9TZ7SFwZEEyIvP8NabL5I5WFE/gvk4LXtW4LjWyTEc/6t2Hog6r1MmY3hIQG9tLe6fARIAXjAQ/M8Kb6A==", + "dev": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3608,6 +3644,48 @@ "vscode": "^1.60.0" } }, + "node_modules/@vscode/extension-telemetry/node_modules/@microsoft/1ds-core-js": { + "version": "3.2.15", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.15.tgz", + "integrity": "sha512-w/35jS80jVl+YBbL69BHg6iTHuIkmmnwSuy8LhfBHm8QDTQny2C73GdwUN8c00BqSClM1ldl2w2bQWW1aMJLTg==", + "dependencies": { + "@microsoft/applicationinsights-core-js": "2.8.16", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" + } + }, + "node_modules/@vscode/extension-telemetry/node_modules/@microsoft/1ds-post-js": { + "version": "3.2.15", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.15.tgz", + "integrity": "sha512-SZQdaiLpoPelTFC0G1EVZXnuQxzqPdY3F6tcBHfnmQv+h8aJR3HAIiy65xI+p7u9m9LdV+8Mx5buE0s6NfXnQA==", + "dependencies": { + "@microsoft/1ds-core-js": "3.2.15", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" + } + }, + "node_modules/@vscode/extension-telemetry/node_modules/@microsoft/applicationinsights-core-js": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.16.tgz", + "integrity": "sha512-pO5rR6UuiPymiHFj8XxNXhQgBSTvyHWygf+gdEVDh0xpUXYFO99bZe0Ux0D0HqYqVkJrRfXzL1Ocru6+S0x53Q==", + "dependencies": { + "@microsoft/applicationinsights-shims": "2.0.2", + "@microsoft/dynamicproto-js": "^1.1.9" + }, + "peerDependencies": { + "tslib": "*" + } + }, + "node_modules/@vscode/extension-telemetry/node_modules/@microsoft/applicationinsights-shims": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", + "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + }, + "node_modules/@vscode/extension-telemetry/node_modules/@microsoft/dynamicproto-js": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.10.tgz", + "integrity": "sha512-yI1MXcdZGsQh/iGBm9FhxSSQ3bnu0C4r9touQuz/TJbu+K2csghPumgh/BQV7rUu04qSLul75Ve32ur3jhy8aA==" + }, "node_modules/@vscode/l10n-dev": { "version": "0.0.24", "resolved": "https://registry.npmjs.org/@vscode/l10n-dev/-/l10n-dev-0.0.24.tgz", diff --git a/package.json b/package.json index 257e4d846..0e49062d0 100644 --- a/package.json +++ b/package.json @@ -1066,12 +1066,16 @@ "webpack": "^5.76.0", "webpack-cli": "^4.7.0", "webpack-stream": "^7.0.0", - "yargs": "^16.2.0" + "yargs": "^16.2.0", + "@microsoft/1ds-core-js": "4.0.5", + "@microsoft/1ds-post-js": "4.0.5" }, "dependencies": { "@fluidframework/azure-client": "^1.1.1", "@microsoft/generator-powerpages": "1.21.19", "@types/jwt-decode": "2.2.0", + "@microsoft/1ds-core-js": "4.0.5", + "@microsoft/1ds-post-js": "4.0.5", "@types/node-fetch": "^2.6.2", "@vscode/extension-telemetry": "^0.6.2", "cockatiel": "^3.1.1", diff --git a/src/common/OneDSLoggerTelemetry/EventContants.ts b/src/common/OneDSLoggerTelemetry/EventContants.ts index 7f57c4377..128a09c88 100644 --- a/src/common/OneDSLoggerTelemetry/EventContants.ts +++ b/src/common/OneDSLoggerTelemetry/EventContants.ts @@ -46,4 +46,8 @@ export enum CustomType { */ Scenario = 'Scenario', +} + +export enum EventTableName { + CUSTOM_EVENT = 'CustomEvent', } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts index 8cfee7318..4b27a4c42 100644 --- a/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts +++ b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts @@ -19,5 +19,10 @@ traceWarning(eventName:string, customDimension?:Record, customMe * Send error telemetry event * @param eventName - Event to send */ -traceError(eventName: string, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) : void +traceError(eventName: string, error?:Error, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) : void +/** + * Send featureName and eventName telemetry event + * @param eventName - Event to send + */ +featureUsage(featureName: string, eventName: string, customDimensions?: Record) : void } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 390bae369..ffc08edbf 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -7,6 +7,10 @@ import { AppInsightsCore, type IExtendedConfiguration } from "@microsoft/1ds-cor import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@microsoft/1ds-post-js"; import { ITelemetryLogger } from "./ITelemetryLogger"; import { EventType } from "./telemetryConstants"; +import * as vscode from "vscode"; +import {getExtensionType, getExtensionVersion} from "../../common/Utils"; +import { EXTENSION_ID } from "../../client/constants"; +import {EventTableName} from "./EventContants"; interface IInstrumentationSettings { endpointURL: string; @@ -15,8 +19,9 @@ interface IInstrumentationSettings { export class OneDSLogger implements ITelemetryLogger{ - private readonly appInsightsCore = new AppInsightsCore(); - private readonly postChannel: PostChannel = new PostChannel(); + private readonly appInsightsCore :AppInsightsCore; + private readonly postChannel: PostChannel; + private readonly fetchHttpXHROverride: IXHROverride = { @@ -65,6 +70,9 @@ export class OneDSLogger implements ITelemetryLogger{ public constructor(geo?:string ) { + this.appInsightsCore = new AppInsightsCore(); + this.postChannel = new PostChannel(); + const channelConfig: IChannelConfiguration = { alwaysUseXhrOverride: true, httpXHROverride: this.fetchHttpXHROverride, @@ -86,11 +94,16 @@ export class OneDSLogger implements ITelemetryLogger{ extensionConfig: { [this.postChannel.identifier]: channelConfig, }, + }; if ((coreConfig.instrumentationKey ?? "") !== "") { this.appInsightsCore.initialize(coreConfig, []); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.appInsightsCore.addTelemetryInitializer((envelope: any) => { + OneDSLogger.populateCommonAttributes(envelope); + }); } private static getInstrumentationSettings(geo?:string): IInstrumentationSettings { @@ -135,10 +148,10 @@ export class OneDSLogger implements ITelemetryLogger{ /// Trace info log public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { const event = { - name: "CustomEvent", + name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, - eventType: EventType.INFO, + eventType: EventType.INFO, message: message, customDimension: customDimension, customMeasurement: customMeasurement @@ -151,7 +164,7 @@ export class OneDSLogger implements ITelemetryLogger{ /// Trace warning log public traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { const event = { - name: "CustomEvent", + name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, eventType: EventType.WARNING, @@ -165,20 +178,59 @@ export class OneDSLogger implements ITelemetryLogger{ } // Trace error log - public traceError(eventName: string, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) { + public traceError(eventName: string, error?:Error, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) { const event = { - name: "CustomEvent", + name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, eventType: EventType.ERROR, - exceptionMessage: exceptionMessage, + exceptionMessage: error?.message, exceptionDetails: exceptionDetails, exceptionSource: exceptionSource, customDimension: customDimension, customMeasurement: customMeasurement } }; + this.appInsightsCore.track(event); + } - this.appInsightsCore.track(event); + public featureUsage( + featureName: string, + eventName: string, + customDimensions?: object + ) { + + const event = { + name: EventTableName.CUSTOM_EVENT, + data: { + eventName: 'Portal_Metrics_Event', + eventType: EventType.INFO, + eventInfo: JSON.stringify({ + featureName: featureName, + customDimensions: customDimensions, + eventName: eventName + }) + } + }; + this.appInsightsCore.track(event); + } + + /// Populate attributes that are common to all events + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private static populateCommonAttributes(envelope: any) { + envelope.data = envelope.data || {}; // create data nested object if doesn't exist already' + + envelope.data.SessionId = vscode.env.sessionId; + envelope.data.surface = getExtensionType(); + envelope.data.extensionVersion = getExtensionVersion(); + envelope.data.extensionName = EXTENSION_ID; + envelope.data.dataDomain = vscode.env.appHost; + envelope.data.cloudRoleName = vscode.env.appName; + envelope.data.vscodeVersion = vscode.version; + envelope.data.vscodeMachineId = vscode.env.machineId } + + public flushAndTeardown(): void { + this.appInsightsCore.flush(); + } } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index 51364bc62..f78dcc991 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -48,9 +48,18 @@ export class oneDSLoggerWrapper { } /// Trace exception log - public traceError(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + public traceError(eventName:string, error?:Error, customDimension?:Record, customMeasurement?: Record, message?:string) { try{ - oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, customDimension, customMeasurement, message); + oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, error, customDimension, customMeasurement, message); + }catch (exception) { + console.warn(exception); + } + } + + /// Trace featureName + public featureUsage( featureName: string,eventName: string,customDimensions?: object) { + try{ + oneDSLoggerWrapper.oneDSLoggerIntance.featureUsage(featureName, eventName, customDimensions); }catch (exception) { console.warn(exception); }