From cb8fee0b5bf1ede340f919eeff0d21ffbb6c6e50 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 4 Jan 2024 13:25:47 +0530 Subject: [PATCH 01/29] First cut of telemetry --- .../ITelemetryLogger.ts | 23 +++ .../oneDSCollectorTelemetry.ts | 138 ++++++++++++++++++ .../telemetryConstants.ts | 10 ++ 3 files changed, 171 insertions(+) create mode 100644 src/common/OneDSCollectorTelemetry/ITelemetryLogger.ts create mode 100644 src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts create mode 100644 src/common/OneDSCollectorTelemetry/telemetryConstants.ts diff --git a/src/common/OneDSCollectorTelemetry/ITelemetryLogger.ts b/src/common/OneDSCollectorTelemetry/ITelemetryLogger.ts new file mode 100644 index 000000000..8cfee7318 --- /dev/null +++ b/src/common/OneDSCollectorTelemetry/ITelemetryLogger.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +export interface ITelemetryLogger { +/** + * Actual implementation that send telemetry event + * @param eventName - Telemetry event to send over + */ +traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) : void + +/** + * Send warning telemetry event + * @param eventName - Event to send + */ +traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) : void +/** + * Send error telemetry event + * @param eventName - Event to send + */ +traceError(eventName: string, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) : void +} \ No newline at end of file diff --git a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts b/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts new file mode 100644 index 000000000..6b1c23488 --- /dev/null +++ b/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts @@ -0,0 +1,138 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { AppInsightsCore, type IExtendedConfiguration } from "@microsoft/1ds-core-js"; +import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@microsoft/1ds-post-js"; +import { ITelemetryLogger } from "./ITelemetryLogger"; +import { EventType } from "./telemetryConstants"; + +export class OneDSCollectorTelemetry implements ITelemetryLogger{ + + private readonly appInsightsCore = new AppInsightsCore(); + private readonly postChannel: PostChannel = new PostChannel(); + + private readonly fetchHttpXHROverride: IXHROverride = { + sendPOST: (payload, oncomplete, sync) => { + const telemetryRequestData = + typeof payload.data === "string" + ? payload.data + : new TextDecoder().decode(payload.data); + + const requestInit: RequestInit = { + body: telemetryRequestData, + method: "POST", + headers: payload.headers, + credentials: "include", + }; + fetch(payload.urlString, requestInit) + .then((response) => { + const headerMap: Record = {}; + response.headers.forEach((value: string, name: string) => { + headerMap[name] = value; + }); + + if (response.body) { + response + .text() + .then((text) => { + oncomplete(response.status, headerMap, text); + }) + .catch((error) => { + // Something wrong with the response body? Play it safe by passing the response status; don't try to + // explicitly re-send the telemetry events by specifying status 0. + oncomplete(response.status, headerMap, ""); + }); + } else { + oncomplete(response.status, headerMap, ""); + } + }) + .catch((error) => { + console.error("Error issuing telemetry request:", error); + // Error sending the request. Set the status to 0 so that the events can be retried. + oncomplete(0, {}); + }); + }, + }; + + public constructor() { + + const channelConfig: IChannelConfiguration = { + alwaysUseXhrOverride: true, + httpXHROverride: this.fetchHttpXHROverride, + }; + + const instrumentationKey = ''; + + // Configure App insights core to send to collector + const coreConfig: IExtendedConfiguration = { + instrumentationKey, + loggingLevelConsole: 0, // Do not log to console + disableDbgExt: true, // Small perf optimization + extensions: [ + // Passing no channels here when the user opts out of telemetry would be ideal, completely ensuring telemetry + // could not be sent out at all. Could be a later improvement. + this.postChannel, + ], + extensionConfig: { + [this.postChannel.identifier]: channelConfig, + }, + }; + + if ((coreConfig.instrumentationKey ?? "") !== "") { + this.appInsightsCore.initialize(coreConfig, []); + } + } + + + /// Trace info log + public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + var event = { + name: "CustomEvent", + data: { + eventName: eventName, + eventType: EventType.INFO, + message: message, + customDimension: customDimension, + customMeasurement: customMeasurement + } + }; + + this.appInsightsCore.track(event); + } + + /// Trace warning log + public traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + var event = { + name: "CustomEvent", + data: { + eventName: eventName, + eventType: EventType.WARNING, + message: message, + customDimension: customDimension, + customMeasurement: customMeasurement + } + }; + + this.appInsightsCore.track(event); + } + + // Trace error log + public traceError(eventName: string, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) { + var event = { + name: "CustomEvent", + data: { + eventName: eventName, + eventType: EventType.ERROR, + exceptionMessage: exceptionMessage, + exceptionDetails: exceptionDetails, + exceptionSource: exceptionSource, + customDimension: customDimension, + customMeasurement: customMeasurement + } + }; + + this.appInsightsCore.track(event); + } +} \ No newline at end of file diff --git a/src/common/OneDSCollectorTelemetry/telemetryConstants.ts b/src/common/OneDSCollectorTelemetry/telemetryConstants.ts new file mode 100644 index 000000000..5e38f39b4 --- /dev/null +++ b/src/common/OneDSCollectorTelemetry/telemetryConstants.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +export enum EventType { + INFO = 'Info', + WARNING = 'Warning', + ERROR = 'Error' +} \ No newline at end of file From 1d65e5de8bcaf9b09d0f21678bef6d297608ae50 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 4 Jan 2024 13:37:42 +0530 Subject: [PATCH 02/29] First cut of telemetry --- .../OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts b/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts index 6b1c23488..d853d6d91 100644 --- a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts +++ b/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts @@ -14,7 +14,7 @@ export class OneDSCollectorTelemetry implements ITelemetryLogger{ private readonly postChannel: PostChannel = new PostChannel(); private readonly fetchHttpXHROverride: IXHROverride = { - sendPOST: (payload, oncomplete, sync) => { + sendPOST: (payload, oncomplete) => { const telemetryRequestData = typeof payload.data === "string" ? payload.data @@ -42,6 +42,7 @@ export class OneDSCollectorTelemetry implements ITelemetryLogger{ .catch((error) => { // Something wrong with the response body? Play it safe by passing the response status; don't try to // explicitly re-send the telemetry events by specifying status 0. + console.error("Error inside telemetry request body:", error); oncomplete(response.status, headerMap, ""); }); } else { @@ -88,7 +89,7 @@ export class OneDSCollectorTelemetry implements ITelemetryLogger{ /// Trace info log public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { - var event = { + const event = { name: "CustomEvent", data: { eventName: eventName, @@ -104,7 +105,7 @@ export class OneDSCollectorTelemetry implements ITelemetryLogger{ /// Trace warning log public traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { - var event = { + const event = { name: "CustomEvent", data: { eventName: eventName, @@ -120,7 +121,7 @@ export class OneDSCollectorTelemetry implements ITelemetryLogger{ // Trace error log public traceError(eventName: string, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) { - var event = { + const event = { name: "CustomEvent", data: { eventName: eventName, From 39c424b88879fbcfb6816b761353b379f677666d Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 4 Jan 2024 13:40:08 +0530 Subject: [PATCH 03/29] changes in 1DSCollector --- src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts b/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts index d853d6d91..9970682a2 100644 --- a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts +++ b/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts @@ -73,7 +73,7 @@ export class OneDSCollectorTelemetry implements ITelemetryLogger{ disableDbgExt: true, // Small perf optimization extensions: [ // Passing no channels here when the user opts out of telemetry would be ideal, completely ensuring telemetry - // could not be sent out at all. Could be a later improvement. + // could not be sent out at all. this.postChannel, ], extensionConfig: { From faecb482391b6aa356fd97942b1710897b653e0b Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 4 Jan 2024 16:31:20 +0530 Subject: [PATCH 04/29] renamed from collector to logger --- .../ITelemetryLogger.ts | 0 .../oneDSLogger.ts} | 2 +- .../telemetryConstants.ts | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename src/common/{OneDSCollectorTelemetry => OneDSLoggerTelemetry}/ITelemetryLogger.ts (100%) rename src/common/{OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts => OneDSLoggerTelemetry/oneDSLogger.ts} (98%) rename src/common/{OneDSCollectorTelemetry => OneDSLoggerTelemetry}/telemetryConstants.ts (100%) diff --git a/src/common/OneDSCollectorTelemetry/ITelemetryLogger.ts b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts similarity index 100% rename from src/common/OneDSCollectorTelemetry/ITelemetryLogger.ts rename to src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts diff --git a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts similarity index 98% rename from src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts rename to src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 9970682a2..cfc1dd74d 100644 --- a/src/common/OneDSCollectorTelemetry/oneDSCollectorTelemetry.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -8,7 +8,7 @@ import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@mic import { ITelemetryLogger } from "./ITelemetryLogger"; import { EventType } from "./telemetryConstants"; -export class OneDSCollectorTelemetry implements ITelemetryLogger{ +export class OneDSLogger implements ITelemetryLogger{ private readonly appInsightsCore = new AppInsightsCore(); private readonly postChannel: PostChannel = new PostChannel(); diff --git a/src/common/OneDSCollectorTelemetry/telemetryConstants.ts b/src/common/OneDSLoggerTelemetry/telemetryConstants.ts similarity index 100% rename from src/common/OneDSCollectorTelemetry/telemetryConstants.ts rename to src/common/OneDSLoggerTelemetry/telemetryConstants.ts From e9058b45cd61848611ff6919e43fb5255a424ddb Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 4 Jan 2024 16:33:34 +0530 Subject: [PATCH 05/29] merged to remote --- src/common/OneDSLoggerTelemetry/oneDSLogger.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index cfc1dd74d..2b02d9e2e 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -8,6 +8,7 @@ import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@mic import { ITelemetryLogger } from "./ITelemetryLogger"; import { EventType } from "./telemetryConstants"; + export class OneDSLogger implements ITelemetryLogger{ private readonly appInsightsCore = new AppInsightsCore(); From 10975c585258f15181462caa5e3427f895a7a5f8 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Mon, 8 Jan 2024 14:56:01 +0530 Subject: [PATCH 06/29] Added wrapper --- .../OneDSLoggerTelemetry/oneDSLogger.ts | 58 ++++++++++++++++-- .../oneDSLoggerWrapper.ts | 61 +++++++++++++++++++ 2 files changed, 113 insertions(+), 6 deletions(-) create mode 100644 src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 2b02d9e2e..60a9899d4 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -8,12 +8,17 @@ import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@mic import { ITelemetryLogger } from "./ITelemetryLogger"; import { EventType } from "./telemetryConstants"; +interface IInstrumentationSettings { + endpointURL: string; + instrumentationKey: string; +} export class OneDSLogger implements ITelemetryLogger{ private readonly appInsightsCore = new AppInsightsCore(); private readonly postChannel: PostChannel = new PostChannel(); - + + private readonly fetchHttpXHROverride: IXHROverride = { sendPOST: (payload, oncomplete) => { const telemetryRequestData = @@ -58,18 +63,18 @@ export class OneDSLogger implements ITelemetryLogger{ }, }; - public constructor() { + public constructor(region:string, geo?:string ) { const channelConfig: IChannelConfiguration = { alwaysUseXhrOverride: true, httpXHROverride: this.fetchHttpXHROverride, }; - const instrumentationKey = ''; - + const instrumentationSetting : IInstrumentationSettings= OneDSLogger.getInstrumentationSettings(region, geo); // Need to replace with actual data + // Configure App insights core to send to collector const coreConfig: IExtendedConfiguration = { - instrumentationKey, + instrumentationKey: instrumentationSetting.instrumentationKey, loggingLevelConsole: 0, // Do not log to console disableDbgExt: true, // Small perf optimization extensions: [ @@ -77,6 +82,7 @@ export class OneDSLogger implements ITelemetryLogger{ // could not be sent out at all. this.postChannel, ], + endpointUrl: instrumentationSetting.endpointURL, extensionConfig: { [this.postChannel.identifier]: channelConfig, }, @@ -87,6 +93,42 @@ export class OneDSLogger implements ITelemetryLogger{ } } + private static getInstrumentationSettings(region: string, geo?:string): IInstrumentationSettings { + const instrumentationSettings:IInstrumentationSettings = { + endpointURL: 'https://self.pipe.aria.int.microsoft.com/OneCollector/1.0/', + instrumentationKey: 'bd47fc8d971f4283a6686ec46fd48782-bdef6c1c-75ab-417c-a1f7-8bbe21e12da6-7708' + }; + switch (region) { + case 'tie': + case 'test': + case 'preprod': + break; + case 'prod': + case 'preview': + switch (geo) { + case 'eu': + instrumentationSettings.endpointURL = '' //prod endpoint; + instrumentationSettings.instrumentationKey = '' //prod key; + break; + default: + instrumentationSettings.endpointURL = '' //prod endpoint; + instrumentationSettings.instrumentationKey = '' //prod key; + } + break; + case 'gov': + case 'high': + case 'dod': + case 'mooncake': + instrumentationSettings.endpointURL = '' //prod endpoint; + instrumentationSettings.instrumentationKey = '' //prod key; + break; + case 'ex': + case 'rx': + default: + break; + } + return instrumentationSettings; + } /// Trace info log public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { @@ -137,4 +179,8 @@ export class OneDSLogger implements ITelemetryLogger{ this.appInsightsCore.track(event); } -} \ No newline at end of file +} + +// let oneDSLoggerInstance = Object.freeze(new OneDSLogger()); + +// export default oneDSLoggerInstance; \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts new file mode 100644 index 000000000..6c9b3449a --- /dev/null +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -0,0 +1,61 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +import { OneDSLogger } from "./oneDSLogger"; + +//// Wrapper class of oneDSLogger for below purposes +//// 1. Abstracting code from manual trace log APIs. +//// 2. Constrolling instantiation of 1ds SDK framework code in oneDSLogger.ts + +let instance: oneDSLoggerWrapper; + +export class oneDSLoggerWrapper { + private static oneDSLoggerIntance : OneDSLogger; + + constructor(region: string, geo?: string) { + if(instance) { + return this; + } + oneDSLoggerWrapper.oneDSLoggerIntance = new OneDSLogger(region, geo); + // eslint-disable-next-line @typescript-eslint/no-this-alias + instance = this; + } + + + static getLogger(){ + if(!instance) { + throw new Error("oneDSLoggerWrapper is not initialized"); + } + return instance; + } + + /// Trace info log + public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + try{ + oneDSLoggerWrapper.oneDSLoggerIntance.traceInfo(eventName, customDimension, customMeasurement, message); + }catch (exception) { + console.warn(exception); + } + } + + /// Trace warning log + public traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + try{ + oneDSLoggerWrapper.oneDSLoggerIntance.traceWarning(eventName, customDimension, customMeasurement, message); + }catch (exception) { + console.warn(exception); + } + } + + /// Trace exception log + public traceError(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + try{ + oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, customDimension, customMeasurement, message); + }catch (exception) { + console.warn(exception); + } + } + +} \ No newline at end of file From 6a3f4dc6003673580fe5b0586b3cbe3309fefdb1 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Tue, 9 Jan 2024 17:51:05 +0530 Subject: [PATCH 07/29] consumed in client --- .../oneDSLoggerWrapper.ts | 20 +++++++++---------- src/web/client/extension.ts | 2 ++ .../client/telemetry/webExtensionTelemetry.ts | 2 ++ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index 6c9b3449a..81bb117b3 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -9,26 +9,24 @@ import { OneDSLogger } from "./oneDSLogger"; //// 1. Abstracting code from manual trace log APIs. //// 2. Constrolling instantiation of 1ds SDK framework code in oneDSLogger.ts -let instance: oneDSLoggerWrapper; - export class oneDSLoggerWrapper { + private static instance: oneDSLoggerWrapper; private static oneDSLoggerIntance : OneDSLogger; - constructor(region: string, geo?: string) { - if(instance) { - return this; - } + private constructor(region: string, geo?: string) { oneDSLoggerWrapper.oneDSLoggerIntance = new OneDSLogger(region, geo); - // eslint-disable-next-line @typescript-eslint/no-this-alias - instance = this; } static getLogger(){ - if(!instance) { - throw new Error("oneDSLoggerWrapper is not initialized"); + return this.instance; + } + + static instantiate(region:string, geo?:string){ + if(!oneDSLoggerWrapper.instance) { + oneDSLoggerWrapper.instance = new oneDSLoggerWrapper(region, geo); } - return instance; + return this.instance; } /// Trace info log diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index 3bd26eeac..c00de980d 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,6 +36,7 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; +import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -55,6 +56,7 @@ export function activate(context: vscode.ExtensionContext): void { WebExtensionContext.telemetry.getTelemetryReporter() ); + oneDSLoggerWrapper.instantiate('test'); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); const portalsFS = new PortalsFS(); context.subscriptions.push( diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 954b615f6..fe1edca85 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -10,6 +10,7 @@ import { sanitizeURL } from "../utilities/urlBuilderUtil"; import { telemetryEventNames } from "./constants"; import { IPortalWebExtensionInitQueryParametersTelemetryData, IWebExtensionAPITelemetryData, IWebExtensionExceptionTelemetryData, IWebExtensionInitPathTelemetryData, IWebExtensionPerfTelemetryData } from "./webExtensionTelemetryInterface"; import { isNullOrUndefined } from '../utilities/commonUtil'; +import { oneDSLoggerWrapper } from "../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export class WebExtensionTelemetry { private _telemetry: TelemetryReporter | undefined; @@ -78,6 +79,7 @@ export class WebExtensionTelemetry { public sendInfoTelemetry(eventName: string, properties?: Record) { this._telemetry?.sendTelemetryEvent(eventName, properties); + oneDSLoggerWrapper.getLogger().traceInfo(eventName, properties); } public sendAPITelemetry( From 93925436a0837f4eaeac3fbe92530c73bc6d6173 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 10 Jan 2024 17:53:04 +0530 Subject: [PATCH 08/29] added types --- .../OneDSLoggerTelemetry/EventContants.ts | 49 +++++++++++++++++++ src/common/OneDSLoggerTelemetry/EventTypes.ts | 41 ++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/common/OneDSLoggerTelemetry/EventContants.ts create mode 100644 src/common/OneDSLoggerTelemetry/EventTypes.ts diff --git a/src/common/OneDSLoggerTelemetry/EventContants.ts b/src/common/OneDSLoggerTelemetry/EventContants.ts new file mode 100644 index 000000000..7f57c4377 --- /dev/null +++ b/src/common/OneDSLoggerTelemetry/EventContants.ts @@ -0,0 +1,49 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +export enum SeverityLevel { + Low = 'Low', + Medium = 'Medium', + High = 'High', + Critical = 'Critical', +} + +export enum CustomEventModifier { + Complete = 'Complete', + Failure = 'Failure', + Progress = 'Progress', + Start = 'Start', +} + +export enum EventType { + Info = 'Information', + Warning = 'Warning', + Error = 'Error', +} + +export enum CustomEventSubType { + Load = 'Load', + Create = 'Create', + Update = 'Update', + Delete = 'Delete', +} + +export enum CustomType { + /** + * Defines a user action to track. + */ + Action = 'Action', + + /** + * Defines a custom event to track. + */ + Custom = 'Custom', + + /** + * Defines a scenario to track, that has a start, an end and duration. + */ + Scenario = 'Scenario', + +} \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/EventTypes.ts b/src/common/OneDSLoggerTelemetry/EventTypes.ts new file mode 100644 index 000000000..cc303c149 --- /dev/null +++ b/src/common/OneDSLoggerTelemetry/EventTypes.ts @@ -0,0 +1,41 @@ +/*! + * Copyright (C) Microsoft Corporation. All rights reserved. + */ + +import {CustomEventModifier, CustomEventSubType, CustomType, EventType, SeverityLevel} from './EventContants'; + +export interface IUserInfo { + oid: string; + tid: string; +} + +export interface IEvent { + eventName: string; + eventType: EventType | string; + eventMessage?: object; + customDimension?: object; + customMeasurements?: object; + eventSeverity?: SeverityLevel; + correlationId?: string; +} + +export interface ICustomEvent { + customEventType: CustomType; + customEventId?: string; + customEventSubType? : CustomEventSubType; + customEventModifier? : CustomEventModifier; +} + export interface IException { + exceptionName?: string; + exceptionStack?: string; + exceptionSource?: string; + exceptionCauseCode?: string | number; + exceptionDetails?: string; + } + + export interface IPlatformInfo { + surface? :string; + dataDomain?: string; + cloudRoleInstance?: string; + cloudRoleName? :string; + } \ No newline at end of file From 1717d5d604c311b5d9c7272427a55a253e543fde Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 09:22:27 +0530 Subject: [PATCH 09/29] changes --- src/web/client/extension.ts | 2 -- src/web/client/telemetry/webExtensionTelemetry.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index c00de980d..3bd26eeac 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,7 +36,6 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; -import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -56,7 +55,6 @@ export function activate(context: vscode.ExtensionContext): void { WebExtensionContext.telemetry.getTelemetryReporter() ); - oneDSLoggerWrapper.instantiate('test'); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); const portalsFS = new PortalsFS(); context.subscriptions.push( diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index fe1edca85..954b615f6 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -10,7 +10,6 @@ import { sanitizeURL } from "../utilities/urlBuilderUtil"; import { telemetryEventNames } from "./constants"; import { IPortalWebExtensionInitQueryParametersTelemetryData, IWebExtensionAPITelemetryData, IWebExtensionExceptionTelemetryData, IWebExtensionInitPathTelemetryData, IWebExtensionPerfTelemetryData } from "./webExtensionTelemetryInterface"; import { isNullOrUndefined } from '../utilities/commonUtil'; -import { oneDSLoggerWrapper } from "../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export class WebExtensionTelemetry { private _telemetry: TelemetryReporter | undefined; @@ -79,7 +78,6 @@ export class WebExtensionTelemetry { public sendInfoTelemetry(eventName: string, properties?: Record) { this._telemetry?.sendTelemetryEvent(eventName, properties); - oneDSLoggerWrapper.getLogger().traceInfo(eventName, properties); } public sendAPITelemetry( From 32ace9791123906f5f5eef5a0ab0403229e1a7a7 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 09:58:27 +0530 Subject: [PATCH 10/29] Created common interfaces and wrapper --- src/client/power-pages/fileSystemCallbacks.ts | 8 +++---- src/client/power-pages/telemetry.ts | 24 ++++++++++++------- src/common/OneDSLoggerTelemetry/EventTypes.ts | 7 ++++-- .../OneDSLoggerTelemetry/oneDSLogger.ts | 7 +++--- .../oneDSLoggerWrapper.ts | 8 +++---- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/client/power-pages/fileSystemCallbacks.ts b/src/client/power-pages/fileSystemCallbacks.ts index 79b40d8b5..eadaa858a 100644 --- a/src/client/power-pages/fileSystemCallbacks.ts +++ b/src/client/power-pages/fileSystemCallbacks.ts @@ -64,11 +64,11 @@ async function processOnDidDeleteFiles( showDiagnosticMessage(); } } catch (error) { - sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name,eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime), exception: error as Error }); + sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name,eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString()}, {durationInMills: (performance.now() - startTime)}, {exception: error as Error }); } // Performance of UserFileDeleteEvent - sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name, eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime) }); + sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name, eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString()}, {durationInMills: (performance.now() - startTime) }); } }) ); @@ -120,11 +120,11 @@ async function processOnDidRenameFiles( showDiagnosticMessage(); } } catch (error) { - sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime), exception: error as Error }); + sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString()}, {durationInMills: (performance.now() - startTime)}, {exception: error as Error }); } // Performance of UserFileRenameEvent - sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime) }); + sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString()},{durationInMills: (performance.now() - startTime) }); } }) ); diff --git a/src/client/power-pages/telemetry.ts b/src/client/power-pages/telemetry.ts index 248f3fe2f..4f9d84a42 100644 --- a/src/client/power-pages/telemetry.ts +++ b/src/client/power-pages/telemetry.ts @@ -18,22 +18,28 @@ export const UpdateEntityNameInYmlEvent = 'UpdateEntityNameInYmlEvent'; export const UserFileCreateEvent = 'UserFileCreateEvent'; export const FileCreateEvent = 'FileCreateEvent'; -interface IPowerPagesTelemetryData { +export interface IPowerPagesTelemetryData { eventName: string, numberOfFiles?: string, fileEntityType?: string, - durationInMills?: number, - exception?: Error, triggerPoint?: string methodName:string } +export interface IPowerPagesMeasurementData { + durationInMills?: number, +} + +export interface IPowerPagesExceptions { + exception?: Error, +} + export enum TriggerPoint { CONTEXT_MENU = "context-menu", COMMAND_PALETTE = "command-palette", } -export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerPagesTelemetryData): void { +export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerPagesTelemetryData, telemetryMeasurement? :IPowerPagesMeasurementData, telelmetryException?: IPowerPagesExceptions): void { const telemetryDataProperties: Record = {} const telemetryDataMeasurements: Record = {} @@ -45,8 +51,8 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerP telemetryDataProperties.fileEntityType = telemetryData.fileEntityType; } - if (telemetryData.durationInMills) { - telemetryDataMeasurements.durationInMills = telemetryData.durationInMills; + if (telemetryMeasurement && telemetryMeasurement.durationInMills) { + telemetryDataMeasurements.durationInMills = telemetryMeasurement.durationInMills; } if(telemetryData.triggerPoint) { @@ -57,10 +63,10 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerP telemetryDataProperties.methodName = telemetryData.methodName; } - if (telemetryData.exception) { + if (telelmetryException && telelmetryException.exception) { telemetryDataProperties.eventName = telemetryData.eventName; - telemetryDataProperties.errorMessage = telemetryData.exception?.message; - telemetry.sendTelemetryException(telemetryData.exception, telemetryDataProperties, telemetryDataMeasurements); + telemetryDataProperties.errorMessage = telelmetryException.exception?.message; + telemetry.sendTelemetryException(telelmetryException.exception, telemetryDataProperties, telemetryDataMeasurements); } else { telemetry.sendTelemetryEvent(telemetryData.eventName, telemetryDataProperties, telemetryDataMeasurements); } diff --git a/src/common/OneDSLoggerTelemetry/EventTypes.ts b/src/common/OneDSLoggerTelemetry/EventTypes.ts index cc303c149..d30e4e4b4 100644 --- a/src/common/OneDSLoggerTelemetry/EventTypes.ts +++ b/src/common/OneDSLoggerTelemetry/EventTypes.ts @@ -3,6 +3,9 @@ */ import {CustomEventModifier, CustomEventSubType, CustomType, EventType, SeverityLevel} from './EventContants'; +import {IWebExtensionTelemetryData} from '../../web/client/telemetry/webExtensionTelemetryInterface'; +import {IProDevCopilotTelemetryData} from '../copilot/telemetry/ITelemetry'; +import {IPowerPagesTelemetryData, IPowerPagesMeasurementData} from '../../client/power-pages/telemetry'; export interface IUserInfo { oid: string; @@ -13,8 +16,8 @@ export interface IEvent { eventName: string; eventType: EventType | string; eventMessage?: object; - customDimension?: object; - customMeasurements?: object; + customDimension?: IWebExtensionTelemetryData| IProDevCopilotTelemetryData| IPowerPagesTelemetryData | object; + customMeasurements?: IWebExtensionTelemetryData| IPowerPagesMeasurementData | object; eventSeverity?: SeverityLevel; correlationId?: string; } diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 41bdc4080..54a78250a 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -63,14 +63,14 @@ export class OneDSLogger implements ITelemetryLogger{ }, }; - public constructor(region:string, geo?:string ) { + public constructor(geo?:string ) { const channelConfig: IChannelConfiguration = { alwaysUseXhrOverride: true, httpXHROverride: this.fetchHttpXHROverride, }; - const instrumentationSetting : IInstrumentationSettings= OneDSLogger.getInstrumentationSettings(region, geo); // Need to replace with actual data + const instrumentationSetting : IInstrumentationSettings= OneDSLogger.getInstrumentationSettings(geo); // Need to replace with actual data // Configure App insights core to send to collector const coreConfig: IExtendedConfiguration = { @@ -93,7 +93,8 @@ export class OneDSLogger implements ITelemetryLogger{ } } - private static getInstrumentationSettings(region: string, geo?:string): IInstrumentationSettings { + private static getInstrumentationSettings(geo?:string): IInstrumentationSettings { + const region :string = 'test'; // TODO: Remove it from here and replace it with value getting from build. Check gulp.mjs (setTelemetryTarget) const instrumentationSettings:IInstrumentationSettings = { endpointURL: 'https://self.pipe.aria.int.microsoft.com/OneCollector/1.0/', instrumentationKey: 'bd47fc8d971f4283a6686ec46fd48782-bdef6c1c-75ab-417c-a1f7-8bbe21e12da6-7708' diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index 81bb117b3..51364bc62 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -13,8 +13,8 @@ export class oneDSLoggerWrapper { private static instance: oneDSLoggerWrapper; private static oneDSLoggerIntance : OneDSLogger; - private constructor(region: string, geo?: string) { - oneDSLoggerWrapper.oneDSLoggerIntance = new OneDSLogger(region, geo); + private constructor(geo?: string) { + oneDSLoggerWrapper.oneDSLoggerIntance = new OneDSLogger(geo); } @@ -22,9 +22,9 @@ export class oneDSLoggerWrapper { return this.instance; } - static instantiate(region:string, geo?:string){ + static instantiate(geo?:string){ if(!oneDSLoggerWrapper.instance) { - oneDSLoggerWrapper.instance = new oneDSLoggerWrapper(region, geo); + oneDSLoggerWrapper.instance = new oneDSLoggerWrapper(geo); } return this.instance; } From 59da8c36e3a654ea796a74fb5430a9e9ba3db900 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 10:25:27 +0530 Subject: [PATCH 11/29] reverted back changes --- src/client/power-pages/fileSystemCallbacks.ts | 12 ++++----- src/client/power-pages/telemetry.ts | 27 +++++++------------ .../{EventTypes.ts => IEventTypes.ts} | 10 +++---- .../OneDSLoggerTelemetry/oneDSLogger.ts | 3 ++- 4 files changed, 22 insertions(+), 30 deletions(-) rename src/common/OneDSLoggerTelemetry/{EventTypes.ts => IEventTypes.ts} (78%) diff --git a/src/client/power-pages/fileSystemCallbacks.ts b/src/client/power-pages/fileSystemCallbacks.ts index eadaa858a..7cc2c6360 100644 --- a/src/client/power-pages/fileSystemCallbacks.ts +++ b/src/client/power-pages/fileSystemCallbacks.ts @@ -64,11 +64,11 @@ async function processOnDidDeleteFiles( showDiagnosticMessage(); } } catch (error) { - sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name,eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString()}, {durationInMills: (performance.now() - startTime)}, {exception: error as Error }); + sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name,eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime), exception: error as Error }); } // Performance of UserFileDeleteEvent - sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name, eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString()}, {durationInMills: (performance.now() - startTime) }); + sendTelemetryEvent(telemetry, { methodName:processOnDidDeleteFiles.name, eventName: UserFileDeleteEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime) }); } }) ); @@ -120,14 +120,12 @@ async function processOnDidRenameFiles( showDiagnosticMessage(); } } catch (error) { - sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString()}, {durationInMills: (performance.now() - startTime)}, {exception: error as Error }); + sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime), exception: error as Error }); } // Performance of UserFileRenameEvent - sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString()},{durationInMills: (performance.now() - startTime) }); + sendTelemetryEvent(telemetry, { methodName:processOnDidRenameFiles.name,eventName: UserFileRenameEvent, numberOfFiles: e.files.length.toString(), durationInMills: (performance.now() - startTime) }); } }) ); -} - - +} \ No newline at end of file diff --git a/src/client/power-pages/telemetry.ts b/src/client/power-pages/telemetry.ts index 4f9d84a42..e4b14e4aa 100644 --- a/src/client/power-pages/telemetry.ts +++ b/src/client/power-pages/telemetry.ts @@ -18,20 +18,14 @@ export const UpdateEntityNameInYmlEvent = 'UpdateEntityNameInYmlEvent'; export const UserFileCreateEvent = 'UserFileCreateEvent'; export const FileCreateEvent = 'FileCreateEvent'; -export interface IPowerPagesTelemetryData { +interface IPowerPagesTelemetryData { eventName: string, numberOfFiles?: string, fileEntityType?: string, - triggerPoint?: string - methodName:string -} - -export interface IPowerPagesMeasurementData { durationInMills?: number, -} - -export interface IPowerPagesExceptions { exception?: Error, + triggerPoint?: string + methodName:string } export enum TriggerPoint { @@ -39,7 +33,7 @@ export enum TriggerPoint { COMMAND_PALETTE = "command-palette", } -export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerPagesTelemetryData, telemetryMeasurement? :IPowerPagesMeasurementData, telelmetryException?: IPowerPagesExceptions): void { +export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerPagesTelemetryData): void { const telemetryDataProperties: Record = {} const telemetryDataMeasurements: Record = {} @@ -51,8 +45,8 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerP telemetryDataProperties.fileEntityType = telemetryData.fileEntityType; } - if (telemetryMeasurement && telemetryMeasurement.durationInMills) { - telemetryDataMeasurements.durationInMills = telemetryMeasurement.durationInMills; + if (telemetryData.durationInMills) { + telemetryDataMeasurements.durationInMills = telemetryData.durationInMills; } if(telemetryData.triggerPoint) { @@ -63,12 +57,11 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerP telemetryDataProperties.methodName = telemetryData.methodName; } - if (telelmetryException && telelmetryException.exception) { + if (telemetryData.exception) { telemetryDataProperties.eventName = telemetryData.eventName; - telemetryDataProperties.errorMessage = telelmetryException.exception?.message; - telemetry.sendTelemetryException(telelmetryException.exception, telemetryDataProperties, telemetryDataMeasurements); + telemetryDataProperties.errorMessage = telemetryData.exception?.message; + telemetry.sendTelemetryException(telemetryData.exception, telemetryDataProperties, telemetryDataMeasurements); } else { telemetry.sendTelemetryEvent(telemetryData.eventName, telemetryDataProperties, telemetryDataMeasurements); } -} - +} \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/EventTypes.ts b/src/common/OneDSLoggerTelemetry/IEventTypes.ts similarity index 78% rename from src/common/OneDSLoggerTelemetry/EventTypes.ts rename to src/common/OneDSLoggerTelemetry/IEventTypes.ts index d30e4e4b4..52d6ed144 100644 --- a/src/common/OneDSLoggerTelemetry/EventTypes.ts +++ b/src/common/OneDSLoggerTelemetry/IEventTypes.ts @@ -1,11 +1,11 @@ -/*! - * Copyright (C) Microsoft Corporation. All rights reserved. +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. */ import {CustomEventModifier, CustomEventSubType, CustomType, EventType, SeverityLevel} from './EventContants'; import {IWebExtensionTelemetryData} from '../../web/client/telemetry/webExtensionTelemetryInterface'; import {IProDevCopilotTelemetryData} from '../copilot/telemetry/ITelemetry'; -import {IPowerPagesTelemetryData, IPowerPagesMeasurementData} from '../../client/power-pages/telemetry'; export interface IUserInfo { oid: string; @@ -16,8 +16,8 @@ export interface IEvent { eventName: string; eventType: EventType | string; eventMessage?: object; - customDimension?: IWebExtensionTelemetryData| IProDevCopilotTelemetryData| IPowerPagesTelemetryData | object; - customMeasurements?: IWebExtensionTelemetryData| IPowerPagesMeasurementData | object; + customDimension?: IWebExtensionTelemetryData| IProDevCopilotTelemetryData| object; // TODO: Use IPortalTelemetryData + customMeasurements?: IWebExtensionTelemetryData| object; // TODO: Use IPortalTelemetryData eventSeverity?: SeverityLevel; correlationId?: string; } diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 54a78250a..390bae369 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -94,7 +94,8 @@ export class OneDSLogger implements ITelemetryLogger{ } private static getInstrumentationSettings(geo?:string): IInstrumentationSettings { - const region :string = 'test'; // TODO: Remove it from here and replace it with value getting from build. Check gulp.mjs (setTelemetryTarget) + // eslint-disable-next-line @typescript-eslint/no-inferrable-types + const region:string = "test"; // TODO: Remove it from here and replace it with value getting from build. Check gulp.mjs (setTelemetryTarget) const instrumentationSettings:IInstrumentationSettings = { endpointURL: 'https://self.pipe.aria.int.microsoft.com/OneCollector/1.0/', instrumentationKey: 'bd47fc8d971f4283a6686ec46fd48782-bdef6c1c-75ab-417c-a1f7-8bbe21e12da6-7708' From 46285339bcca42d5cfad7de19dd1444685c17112 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 10:32:03 +0530 Subject: [PATCH 12/29] removed blank line --- src/client/power-pages/fileSystemCallbacks.ts | 3 ++- src/client/power-pages/telemetry.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/power-pages/fileSystemCallbacks.ts b/src/client/power-pages/fileSystemCallbacks.ts index 7cc2c6360..ea27a3452 100644 --- a/src/client/power-pages/fileSystemCallbacks.ts +++ b/src/client/power-pages/fileSystemCallbacks.ts @@ -128,4 +128,5 @@ async function processOnDidRenameFiles( } }) ); -} \ No newline at end of file +} + diff --git a/src/client/power-pages/telemetry.ts b/src/client/power-pages/telemetry.ts index e4b14e4aa..02ee2dcee 100644 --- a/src/client/power-pages/telemetry.ts +++ b/src/client/power-pages/telemetry.ts @@ -64,4 +64,4 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerP } else { telemetry.sendTelemetryEvent(telemetryData.eventName, telemetryDataProperties, telemetryDataMeasurements); } -} \ No newline at end of file +} From 3f745bfdfb39d16e1f428e3aba13203cf536c7fc Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 10:33:35 +0530 Subject: [PATCH 13/29] removed blank line --- src/client/power-pages/fileSystemCallbacks.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/power-pages/fileSystemCallbacks.ts b/src/client/power-pages/fileSystemCallbacks.ts index ea27a3452..79b40d8b5 100644 --- a/src/client/power-pages/fileSystemCallbacks.ts +++ b/src/client/power-pages/fileSystemCallbacks.ts @@ -130,3 +130,4 @@ async function processOnDidRenameFiles( ); } + From 2fec1e4906cbdcbf3d0d62ab4bd10ba8384ab60d Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 10:34:02 +0530 Subject: [PATCH 14/29] removed blank line --- src/client/power-pages/telemetry.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/power-pages/telemetry.ts b/src/client/power-pages/telemetry.ts index 02ee2dcee..248f3fe2f 100644 --- a/src/client/power-pages/telemetry.ts +++ b/src/client/power-pages/telemetry.ts @@ -65,3 +65,4 @@ export function sendTelemetryEvent(telemetry: ITelemetry, telemetryData: IPowerP telemetry.sendTelemetryEvent(telemetryData.eventName, telemetryDataProperties, telemetryDataMeasurements); } } + From 6775fd622fdfb7c2d35de3695c0dd10d5a42ea86 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 16:10:27 +0530 Subject: [PATCH 15/29] populate data --- .../OneDSLoggerTelemetry/oneDSLogger.ts | 34 +++++++++++++++++-- src/web/client/extension.ts | 2 ++ .../client/telemetry/webExtensionTelemetry.ts | 2 ++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 390bae369..6583a90d4 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -7,6 +7,9 @@ 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"; interface IInstrumentationSettings { endpointURL: string; @@ -15,8 +18,8 @@ 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,13 +68,16 @@ 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, }; const instrumentationSetting : IInstrumentationSettings= OneDSLogger.getInstrumentationSettings(geo); // Need to replace with actual data - + // Configure App insights core to send to collector const coreConfig: IExtendedConfiguration = { instrumentationKey: instrumentationSetting.instrumentationKey, @@ -91,6 +97,9 @@ export class OneDSLogger implements ITelemetryLogger{ if ((coreConfig.instrumentationKey ?? "") !== "") { this.appInsightsCore.initialize(coreConfig, []); } + this.appInsightsCore.addTelemetryInitializer((envelope) => { + OneDSLogger.populateCommonAttributes(envelope); + }); } private static getInstrumentationSettings(geo?:string): IInstrumentationSettings { @@ -181,4 +190,23 @@ export class OneDSLogger implements ITelemetryLogger{ 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/web/client/extension.ts b/src/web/client/extension.ts index 3bd26eeac..abd638932 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,6 +36,7 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; +import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -55,6 +56,7 @@ export function activate(context: vscode.ExtensionContext): void { WebExtensionContext.telemetry.getTelemetryReporter() ); + oneDSLoggerWrapper.instantiate(); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); const portalsFS = new PortalsFS(); context.subscriptions.push( diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 954b615f6..fe1edca85 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -10,6 +10,7 @@ import { sanitizeURL } from "../utilities/urlBuilderUtil"; import { telemetryEventNames } from "./constants"; import { IPortalWebExtensionInitQueryParametersTelemetryData, IWebExtensionAPITelemetryData, IWebExtensionExceptionTelemetryData, IWebExtensionInitPathTelemetryData, IWebExtensionPerfTelemetryData } from "./webExtensionTelemetryInterface"; import { isNullOrUndefined } from '../utilities/commonUtil'; +import { oneDSLoggerWrapper } from "../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export class WebExtensionTelemetry { private _telemetry: TelemetryReporter | undefined; @@ -78,6 +79,7 @@ export class WebExtensionTelemetry { public sendInfoTelemetry(eventName: string, properties?: Record) { this._telemetry?.sendTelemetryEvent(eventName, properties); + oneDSLoggerWrapper.getLogger().traceInfo(eventName, properties); } public sendAPITelemetry( From 438eb9d46ff7ff63ebe402ba6e14a1c4487a35bd Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 16:11:41 +0530 Subject: [PATCH 16/29] Removed platformType --- src/common/OneDSLoggerTelemetry/IEventTypes.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/common/OneDSLoggerTelemetry/IEventTypes.ts b/src/common/OneDSLoggerTelemetry/IEventTypes.ts index 52d6ed144..9eb4c926a 100644 --- a/src/common/OneDSLoggerTelemetry/IEventTypes.ts +++ b/src/common/OneDSLoggerTelemetry/IEventTypes.ts @@ -34,11 +34,4 @@ export interface ICustomEvent { exceptionSource?: string; exceptionCauseCode?: string | number; exceptionDetails?: string; - } - - export interface IPlatformInfo { - surface? :string; - dataDomain?: string; - cloudRoleInstance?: string; - cloudRoleName? :string; } \ No newline at end of file From f470dc2099c0d9ce3aa18aea59b9811ee7313483 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 11 Jan 2024 17:39:26 +0530 Subject: [PATCH 17/29] Removed platformType --- src/common/OneDSLoggerTelemetry/EventContants.ts | 4 ++++ src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts | 2 +- src/common/OneDSLoggerTelemetry/oneDSLogger.ts | 10 ++++++---- src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts | 4 ++-- src/web/client/telemetry/webExtensionTelemetry.ts | 1 + 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/common/OneDSLoggerTelemetry/EventContants.ts b/src/common/OneDSLoggerTelemetry/EventContants.ts index 7f57c4377..485a53ce0 100644 --- a/src/common/OneDSLoggerTelemetry/EventContants.ts +++ b/src/common/OneDSLoggerTelemetry/EventContants.ts @@ -46,4 +46,8 @@ export enum CustomType { */ Scenario = 'Scenario', +} + +export const 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..e609c0476 100644 --- a/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts +++ b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts @@ -19,5 +19,5 @@ 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 } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 6583a90d4..cd4eb4338 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -10,6 +10,7 @@ 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; @@ -92,6 +93,7 @@ export class OneDSLogger implements ITelemetryLogger{ extensionConfig: { [this.postChannel.identifier]: channelConfig, }, + }; if ((coreConfig.instrumentationKey ?? "") !== "") { @@ -144,7 +146,7 @@ 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, @@ -160,7 +162,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, @@ -174,9 +176,9 @@ 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, diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index 51364bc62..d1b1bcef3 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -48,9 +48,9 @@ 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); } diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index fe1edca85..3ba7b4c26 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -55,6 +55,7 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties); + oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties); } public sendErrorTelemetry(eventName: string, methodName: string, errorMessage?: string, error?: Error) { From fab0f388cac98df07136c09383b13135c8e1e72b Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Mon, 15 Jan 2024 11:20:12 +0530 Subject: [PATCH 18/29] changes --- package-lock.json | 88 +++++++++---------- package.json | 2 +- .../OneDSLoggerTelemetry/EventContants.ts | 2 +- .../OneDSLoggerTelemetry/oneDSLogger.ts | 5 +- 4 files changed, 49 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57dd72501..90bc8c0d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "powerplatform-vscode", - "version": "1.0.1-dev", + "version": "2.2.222", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "powerplatform-vscode", - "version": "1.0.1-dev", + "version": "2.2.222", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@fluidframework/azure-client": "^1.1.1", @@ -2567,48 +2567,6 @@ "node": ">= 0.4" } }, - "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==", - "dependencies": { - "@microsoft/applicationinsights-core-js": "2.8.10", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" - } - }, - "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==", - "dependencies": { - "@microsoft/1ds-core-js": "3.2.9", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" - } - }, - "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==", - "dependencies": { - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" - }, - "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==" - }, - "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==" - }, "node_modules/@microsoft/generator-powerpages": { "version": "1.21.19", "resolved": "https://registry.npmjs.org/@microsoft/generator-powerpages/-/generator-powerpages-1.21.19.tgz", @@ -3608,6 +3566,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..2dd8ad5d2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "powerplatform-vscode", "displayName": "Power Platform Tools", "description": "Tooling to create Power Platform solutions & packages, manage Power Platform environments and edit Power Apps Portals", - "version": "1.0.1-dev", + "version": "2.2.222", "scripts": { "clean": "scorch", "build": "node node_modules/gulp/bin/gulp.js", diff --git a/src/common/OneDSLoggerTelemetry/EventContants.ts b/src/common/OneDSLoggerTelemetry/EventContants.ts index 485a53ce0..128a09c88 100644 --- a/src/common/OneDSLoggerTelemetry/EventContants.ts +++ b/src/common/OneDSLoggerTelemetry/EventContants.ts @@ -48,6 +48,6 @@ export enum CustomType { } -export const EventTableName { +export enum EventTableName { CUSTOM_EVENT = 'CustomEvent', } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index cd4eb4338..718a87616 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -99,7 +99,8 @@ export class OneDSLogger implements ITelemetryLogger{ if ((coreConfig.instrumentationKey ?? "") !== "") { this.appInsightsCore.initialize(coreConfig, []); } - this.appInsightsCore.addTelemetryInitializer((envelope) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.appInsightsCore.addTelemetryInitializer((envelope: any) => { OneDSLogger.populateCommonAttributes(envelope); }); } @@ -182,7 +183,7 @@ export class OneDSLogger implements ITelemetryLogger{ data: { eventName: eventName, eventType: EventType.ERROR, - exceptionMessage: exceptionMessage, + exceptionMessage: error?.message, exceptionDetails: exceptionDetails, exceptionSource: exceptionSource, customDimension: customDimension, From 3e46ef9ae701680bc0997720cec3cf562afe8561 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 17 Jan 2024 13:05:45 +0530 Subject: [PATCH 19/29] changes --- package.json | 2 ++ .../OneDSLoggerTelemetry/ITelemetryLogger.ts | 5 ++++ .../OneDSLoggerTelemetry/oneDSLogger.ts | 26 ++++++++++++++++--- .../oneDSLoggerWrapper.ts | 9 +++++++ src/web/client/extension.ts | 1 + 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2dd8ad5d2..59a2dd55d 100644 --- a/package.json +++ b/package.json @@ -1072,6 +1072,8 @@ "@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/ITelemetryLogger.ts b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts index e609c0476..4b27a4c42 100644 --- a/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts +++ b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts @@ -20,4 +20,9 @@ traceWarning(eventName:string, customDimension?:Record, customMe * @param eventName - Event to send */ 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 718a87616..6f2e0577e 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -150,7 +150,7 @@ export class OneDSLogger implements ITelemetryLogger{ name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, - eventType: EventType.INFO, + eventType: EventType.INFO, message: message, customDimension: customDimension, customMeasurement: customMeasurement @@ -190,9 +190,29 @@ export class OneDSLogger implements ITelemetryLogger{ 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 diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index d1b1bcef3..f78dcc991 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -55,5 +55,14 @@ export class oneDSLoggerWrapper { 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); + } + } } \ No newline at end of file diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index 944bbd164..ea0acf6f4 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -58,6 +58,7 @@ export function activate(context: vscode.ExtensionContext): void { oneDSLoggerWrapper.instantiate(); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); + oneDSLoggerWrapper.getLogger().featureUsage("ExtensionActivated","trace",{extensionName: vscode.env.appName, extensionVersion: vscode.version}); const portalsFS = new PortalsFS(); context.subscriptions.push( vscode.workspace.registerFileSystemProvider( From bfc06ef45059a437a19ddaeee48f69775a1b47aa Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 17 Jan 2024 13:10:53 +0530 Subject: [PATCH 20/29] changes --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 59a2dd55d..0e49062d0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "powerplatform-vscode", "displayName": "Power Platform Tools", "description": "Tooling to create Power Platform solutions & packages, manage Power Platform environments and edit Power Apps Portals", - "version": "2.2.222", + "version": "1.0.1-dev", "scripts": { "clean": "scorch", "build": "node node_modules/gulp/bin/gulp.js", @@ -1066,7 +1066,9 @@ "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", From 544f04feb8089d07fd72a10409f1ea090e52d750 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 17 Jan 2024 13:20:39 +0530 Subject: [PATCH 21/29] revert this changes --- src/web/client/extension.ts | 3 --- src/web/client/telemetry/webExtensionTelemetry.ts | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index ea0acf6f4..33bece72b 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,7 +36,6 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; -import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -56,9 +55,7 @@ export function activate(context: vscode.ExtensionContext): void { WebExtensionContext.telemetry.getTelemetryReporter() ); - oneDSLoggerWrapper.instantiate(); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); - oneDSLoggerWrapper.getLogger().featureUsage("ExtensionActivated","trace",{extensionName: vscode.env.appName, extensionVersion: vscode.version}); const portalsFS = new PortalsFS(); context.subscriptions.push( vscode.workspace.registerFileSystemProvider( diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 3ba7b4c26..954b615f6 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -10,7 +10,6 @@ import { sanitizeURL } from "../utilities/urlBuilderUtil"; import { telemetryEventNames } from "./constants"; import { IPortalWebExtensionInitQueryParametersTelemetryData, IWebExtensionAPITelemetryData, IWebExtensionExceptionTelemetryData, IWebExtensionInitPathTelemetryData, IWebExtensionPerfTelemetryData } from "./webExtensionTelemetryInterface"; import { isNullOrUndefined } from '../utilities/commonUtil'; -import { oneDSLoggerWrapper } from "../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export class WebExtensionTelemetry { private _telemetry: TelemetryReporter | undefined; @@ -55,7 +54,6 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties); - oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties); } public sendErrorTelemetry(eventName: string, methodName: string, errorMessage?: string, error?: Error) { @@ -80,7 +78,6 @@ export class WebExtensionTelemetry { public sendInfoTelemetry(eventName: string, properties?: Record) { this._telemetry?.sendTelemetryEvent(eventName, properties); - oneDSLoggerWrapper.getLogger().traceInfo(eventName, properties); } public sendAPITelemetry( From 751f1a3915555219c8f79ac118cbed9afe60a03a Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 17 Jan 2024 13:28:30 +0530 Subject: [PATCH 22/29] revert this changes --- package-lock.json | 82 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90bc8c0d0..0cd59948f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,17 @@ { "name": "powerplatform-vscode", - "version": "2.2.222", + "version": "1.0.1-dev", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "powerplatform-vscode", - "version": "2.2.222", + "version": "1.0.1-dev", "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", @@ -2567,6 +2571,65 @@ "node": ">= 0.4" } }, + "node_modules/@microsoft/1ds-core-js": { + "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": "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": "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": "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": "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": "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": "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": "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", "resolved": "https://registry.npmjs.org/@microsoft/generator-powerpages/-/generator-powerpages-1.21.19.tgz", @@ -2604,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", From f854efe95a9b15b679a0e7d83816dffb4b037586 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 17 Jan 2024 17:29:50 +0530 Subject: [PATCH 23/29] Modifying OneDSLogger API --- .../OneDSLoggerTelemetry/ITelemetryLogger.ts | 8 +-- .../OneDSLoggerTelemetry/oneDSLogger.ts | 64 +++++++++++++------ .../oneDSLoggerWrapper.ts | 12 ++-- src/web/client/extension.ts | 3 + .../client/telemetry/webExtensionTelemetry.ts | 9 +++ 5 files changed, 65 insertions(+), 31 deletions(-) diff --git a/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts index 4b27a4c42..96ea54834 100644 --- a/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts +++ b/src/common/OneDSLoggerTelemetry/ITelemetryLogger.ts @@ -8,21 +8,21 @@ export interface ITelemetryLogger { * Actual implementation that send telemetry event * @param eventName - Telemetry event to send over */ -traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) : void +traceInfo(eventName:string, eventInfo?:object, measurement?: object) : void /** * Send warning telemetry event * @param eventName - Event to send */ -traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) : void +traceWarning(eventName:string, eventInfo?:object, measurement?: object) : void /** * Send error telemetry event * @param eventName - Event to send */ -traceError(eventName: string, error?:Error, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) : void +traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object , measurement?: object) : void /** * Send featureName and eventName telemetry event * @param eventName - Event to send */ -featureUsage(featureName: string, eventName: string, customDimensions?: Record) : void +featureUsage(featureName: string, eventName: string, eventInfo?:object) : void } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index ffc08edbf..13d57bf82 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -146,15 +146,22 @@ export class OneDSLogger implements ITelemetryLogger{ } /// Trace info log - public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + public traceInfo(eventName:string, eventInfo?:object, measurement?: object) { const event = { name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, eventType: EventType.INFO, - message: message, - customDimension: customDimension, - customMeasurement: customMeasurement + eventInfo: JSON.stringify( + { + eventInfo: eventInfo + } + ), + measurement: JSON.stringify( + { + measurement: measurement + } + ), } }; @@ -162,15 +169,22 @@ export class OneDSLogger implements ITelemetryLogger{ } /// Trace warning log - public traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + public traceWarning(eventName:string, eventInfo?: object, measurement?: object) { const event = { name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, eventType: EventType.WARNING, - message: message, - customDimension: customDimension, - customMeasurement: customMeasurement + eventInfo: JSON.stringify( + { + eventInfo: eventInfo + } + ), + measurement: JSON.stringify( + { + measurement: measurement + } + ) } }; @@ -178,17 +192,25 @@ export class OneDSLogger implements ITelemetryLogger{ } // Trace error log - public traceError(eventName: string, error?:Error, customDimension?:Record, customMeasurement?: Record, exceptionMessage?:string, exceptionSource?:string, exceptionDetails?:string) { + public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { const event = { name: EventTableName.CUSTOM_EVENT, data: { eventName: eventName, eventType: EventType.ERROR, - exceptionMessage: error?.message, - exceptionDetails: exceptionDetails, - exceptionSource: exceptionSource, - customDimension: customDimension, - customMeasurement: customMeasurement + message: errorMessage, + errorName: exception.name, + errorStack: JSON.stringify(exception), + eventInfo: JSON.stringify( + { + eventInfo: eventInfo + } + ), + measurement: JSON.stringify( + { + measurement: measurement + } + ) } }; this.appInsightsCore.track(event); @@ -220,14 +242,14 @@ export class OneDSLogger implements ITelemetryLogger{ 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.clientSessionId = vscode.env.sessionId; + envelope.data.vscodeSurface = getExtensionType(); + envelope.data.vscodeMachineId = vscode.env.machineId; + envelope.data.vscodeExtensionName = EXTENSION_ID; + envelope.data.vscodeExtensionVersion = getExtensionVersion(); envelope.data.vscodeVersion = vscode.version; - envelope.data.vscodeMachineId = vscode.env.machineId + envelope.data.domain = vscode.env.appHost; + envelope.data.cloudRoleName = vscode.env.appName; } public flushAndTeardown(): void { diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index f78dcc991..bad12bf72 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -30,27 +30,27 @@ export class oneDSLoggerWrapper { } /// Trace info log - public traceInfo(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + public traceInfo(eventName:string, eventInfo?: object, measurement?: object) { try{ - oneDSLoggerWrapper.oneDSLoggerIntance.traceInfo(eventName, customDimension, customMeasurement, message); + oneDSLoggerWrapper.oneDSLoggerIntance.traceInfo(eventName, eventInfo, measurement); }catch (exception) { console.warn(exception); } } /// Trace warning log - public traceWarning(eventName:string, customDimension?:Record, customMeasurement?: Record, message?:string) { + public traceWarning(eventName:string, eventInfo?: object, measurement?: object) { try{ - oneDSLoggerWrapper.oneDSLoggerIntance.traceWarning(eventName, customDimension, customMeasurement, message); + oneDSLoggerWrapper.oneDSLoggerIntance.traceWarning(eventName, eventInfo, measurement); }catch (exception) { console.warn(exception); } } /// Trace exception log - public traceError(eventName:string, error?:Error, customDimension?:Record, customMeasurement?: Record, message?:string) { + public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { try{ - oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, error, customDimension, customMeasurement, message); + oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, errorMessage, exception, eventInfo, measurement); }catch (exception) { console.warn(exception); } diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index 33bece72b..ebe2099fd 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,6 +36,8 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; +import { OneDSLogger } from "../../common/OneDSLoggerTelemetry/oneDSLogger"; +import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -55,6 +57,7 @@ export function activate(context: vscode.ExtensionContext): void { WebExtensionContext.telemetry.getTelemetryReporter() ); + oneDSLoggerWrapper.instantiate(); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); const portalsFS = new PortalsFS(); context.subscriptions.push( diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 954b615f6..6093f381f 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -10,6 +10,7 @@ import { sanitizeURL } from "../utilities/urlBuilderUtil"; import { telemetryEventNames } from "./constants"; import { IPortalWebExtensionInitQueryParametersTelemetryData, IWebExtensionAPITelemetryData, IWebExtensionExceptionTelemetryData, IWebExtensionInitPathTelemetryData, IWebExtensionPerfTelemetryData } from "./webExtensionTelemetryInterface"; import { isNullOrUndefined } from '../utilities/commonUtil'; +import { oneDSLoggerWrapper } from "../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export class WebExtensionTelemetry { private _telemetry: TelemetryReporter | undefined; @@ -33,6 +34,7 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties); + oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties) } public sendExtensionInitQueryParametersTelemetry(queryParamsMap: Map) { @@ -54,6 +56,7 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties); + oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties) } public sendErrorTelemetry(eventName: string, methodName: string, errorMessage?: string, error?: Error) { @@ -71,13 +74,16 @@ export class WebExtensionTelemetry { if (errorMessage || error) { const error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, telemetryData.properties); + oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, error, telemetryData.properties) } else { this._telemetry?.sendTelemetryException(new Error(), telemetryData.properties); + oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, new Error(), telemetryData.properties) } } public sendInfoTelemetry(eventName: string, properties?: Record) { this._telemetry?.sendTelemetryEvent(eventName, properties); + oneDSLoggerWrapper.getLogger().traceInfo(eventName, properties) } public sendAPITelemetry( @@ -112,8 +118,10 @@ export class WebExtensionTelemetry { if (errorMessage) { const error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, { ...telemetryData.properties, eventName: eventName }, telemetryData.measurements); + oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, error, { ...telemetryData.properties, eventName: eventName }, telemetryData.measurements) } else { this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties, telemetryData.measurements); + oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties, telemetryData.measurements) } } @@ -172,6 +180,7 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, undefined, telemetryData.measurements); + oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, undefined, telemetryData.measurements) } private getPathParameterValue(parameter: string | undefined | null): string { From 1e8195bb42439df278874dc36d9fef00c4474fe6 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Wed, 17 Jan 2024 17:39:23 +0530 Subject: [PATCH 24/29] Modifying OneDSLogger API --- src/web/client/extension.ts | 1 - src/web/client/telemetry/webExtensionTelemetry.ts | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index ebe2099fd..7804787c7 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,7 +36,6 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; -import { OneDSLogger } from "../../common/OneDSLoggerTelemetry/oneDSLogger"; import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 6093f381f..974cbd28f 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -74,9 +74,11 @@ export class WebExtensionTelemetry { if (errorMessage || error) { const error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, telemetryData.properties); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, error, telemetryData.properties) } else { this._telemetry?.sendTelemetryException(new Error(), telemetryData.properties); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, new Error(), telemetryData.properties) } } @@ -118,6 +120,7 @@ export class WebExtensionTelemetry { if (errorMessage) { const error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, { ...telemetryData.properties, eventName: eventName }, telemetryData.measurements); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, error, { ...telemetryData.properties, eventName: eventName }, telemetryData.measurements) } else { this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties, telemetryData.measurements); From 3836c629c8a384e542ea5bd8e40bab84bb837be4 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Thu, 18 Jan 2024 13:59:42 +0530 Subject: [PATCH 25/29] fixed table name --- package.json | 2 +- .../OneDSLoggerTelemetry/EventContants.ts | 4 +-- .../OneDSLoggerTelemetry/oneDSLogger.ts | 27 ++++++++++++------- .../telemetryConstants.ts | 11 +++++++- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 0e49062d0..44edbe62b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "powerplatform-vscode", "displayName": "Power Platform Tools", "description": "Tooling to create Power Platform solutions & packages, manage Power Platform environments and edit Power Apps Portals", - "version": "1.0.1-dev", + "version": "2.2.2222", "scripts": { "clean": "scorch", "build": "node node_modules/gulp/bin/gulp.js", diff --git a/src/common/OneDSLoggerTelemetry/EventContants.ts b/src/common/OneDSLoggerTelemetry/EventContants.ts index 128a09c88..067ed3fe0 100644 --- a/src/common/OneDSLoggerTelemetry/EventContants.ts +++ b/src/common/OneDSLoggerTelemetry/EventContants.ts @@ -48,6 +48,6 @@ export enum CustomType { } -export enum EventTableName { - CUSTOM_EVENT = 'CustomEvent', +export enum OneDSCollectorEventName { + VSCODE_EVENT = 'vscodeEvent', } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index e7e8085ce..b30dc863a 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -6,11 +6,11 @@ import { AppInsightsCore, type IExtendedConfiguration } from "@microsoft/1ds-core-js"; import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@microsoft/1ds-post-js"; import { ITelemetryLogger } from "./ITelemetryLogger"; -import { EventType } from "./telemetryConstants"; +import { EventType, Severity } from "./telemetryConstants"; import * as vscode from "vscode"; import {getExtensionType, getExtensionVersion} from "../../common/Utils"; import { EXTENSION_ID } from "../../client/constants"; -import {EventTableName} from "./EventContants"; +import {OneDSCollectorEventName} from "./EventContants"; interface IInstrumentationSettings { endpointURL: string; @@ -148,10 +148,11 @@ export class OneDSLogger implements ITelemetryLogger{ /// Trace info log public traceInfo(eventName:string, eventInfo?:object, measurement?: object) { const event = { - name: EventTableName.CUSTOM_EVENT, + name: OneDSCollectorEventName.VSCODE_EVENT, data: { eventName: eventName, - eventType: EventType.INFO, + eventType: EventType.TRACE, + severity: Severity.INFO, eventInfo: JSON.stringify( { eventInfo: eventInfo @@ -171,10 +172,11 @@ export class OneDSLogger implements ITelemetryLogger{ /// Trace warning log public traceWarning(eventName:string, eventInfo?: object, measurement?: object) { const event = { - name: EventTableName.CUSTOM_EVENT, + name: OneDSCollectorEventName.VSCODE_EVENT, data: { eventName: eventName, - eventType: EventType.WARNING, + eventType: EventType.TRACE, + severity: Severity.WARN, eventInfo: JSON.stringify( { eventInfo: eventInfo @@ -194,10 +196,11 @@ export class OneDSLogger implements ITelemetryLogger{ // Trace error log public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { const event = { - name: EventTableName.CUSTOM_EVENT, + name: OneDSCollectorEventName.VSCODE_EVENT, data: { eventName: eventName, - eventType: EventType.ERROR, + eventType: EventType.TRACE, + severity: Severity.ERROR, message: errorMessage, errorName: exception.name, errorStack: JSON.stringify(exception), @@ -223,10 +226,11 @@ export class OneDSLogger implements ITelemetryLogger{ ) { const event = { - name: EventTableName.CUSTOM_EVENT, + name: OneDSCollectorEventName.VSCODE_EVENT, data: { eventName: 'Portal_Metrics_Event', - eventType: EventType.INFO, + eventType: EventType.TRACE, + severity: Severity.INFO, eventInfo: JSON.stringify({ featureName: featureName, customDimensions: customDimensions, @@ -249,6 +253,9 @@ export class OneDSLogger implements ITelemetryLogger{ envelope.data.vscodeExtensionVersion = getExtensionVersion(); envelope.data.vscodeVersion = vscode.version; envelope.data.domain = vscode.env.appHost; + envelope.data.userLocale = envelope.ext.user.locale; + envelope.data.userTimeZone = envelope.ext.loc.tz; + envelope.data.appLanguage = envelope.ext.app.locale; } public flushAndTeardown(): void { diff --git a/src/common/OneDSLoggerTelemetry/telemetryConstants.ts b/src/common/OneDSLoggerTelemetry/telemetryConstants.ts index 5e38f39b4..69addd596 100644 --- a/src/common/OneDSLoggerTelemetry/telemetryConstants.ts +++ b/src/common/OneDSLoggerTelemetry/telemetryConstants.ts @@ -4,7 +4,16 @@ */ export enum EventType { + CLICK = 'Click', + CUSTOM = 'Custom', + GENERAL = 'General', + SCENARIO = 'Scenario', + TRACE = 'Trace' +} + +export enum Severity { + DEBUG = 'Debug', INFO = 'Info', - WARNING = 'Warning', + WARN = 'Warning', ERROR = 'Error' } \ No newline at end of file From 2e2d714e5d7d012b9ac86cc295a20271863f599b Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Fri, 19 Jan 2024 17:10:50 +0530 Subject: [PATCH 26/29] changes --- .../OneDSLoggerTelemetry/EventContants.ts | 3 +- .../OneDSLoggerTelemetry/oneDSLogger.ts | 165 ++++++++++++------ .../oneDSLoggerWrapper.ts | 10 +- .../client/telemetry/webExtensionTelemetry.ts | 9 +- 4 files changed, 132 insertions(+), 55 deletions(-) diff --git a/src/common/OneDSLoggerTelemetry/EventContants.ts b/src/common/OneDSLoggerTelemetry/EventContants.ts index 067ed3fe0..10a150d2b 100644 --- a/src/common/OneDSLoggerTelemetry/EventContants.ts +++ b/src/common/OneDSLoggerTelemetry/EventContants.ts @@ -49,5 +49,6 @@ export enum CustomType { } export enum OneDSCollectorEventName { - VSCODE_EVENT = 'vscodeEvent', + VSCODE_EVENT = 'VscodeEvent', + REDACTED = "-REDACTED-" } \ No newline at end of file diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index b30dc863a..6c6816ed9 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. */ +/* eslint-disable @typescript-eslint/no-non-null-assertion*/ + import { AppInsightsCore, type IExtendedConfiguration } from "@microsoft/1ds-core-js"; import { PostChannel, type IChannelConfiguration, type IXHROverride } from "@microsoft/1ds-post-js"; import { ITelemetryLogger } from "./ITelemetryLogger"; @@ -22,7 +24,17 @@ export class OneDSLogger implements ITelemetryLogger{ private readonly appInsightsCore :AppInsightsCore; private readonly postChannel: PostChannel; - + private readonly regexPatternsToRedact = [ + /secret["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /code["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /key["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /token["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /session["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /password["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /passwd["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /connection["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, + /sig["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm + ] private readonly fetchHttpXHROverride: IXHROverride = { sendPOST: (payload, oncomplete) => { @@ -101,17 +113,15 @@ export class OneDSLogger implements ITelemetryLogger{ this.appInsightsCore.initialize(coreConfig, []); } // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.appInsightsCore.addTelemetryInitializer((envelope: any) => { - OneDSLogger.populateCommonAttributes(envelope); - }); + this.appInsightsCore.addTelemetryInitializer(this.populateCommonAttributes()); } private static getInstrumentationSettings(geo?:string): IInstrumentationSettings { // eslint-disable-next-line @typescript-eslint/no-inferrable-types const region:string = "test"; // TODO: Remove it from here and replace it with value getting from build. Check gulp.mjs (setTelemetryTarget) const instrumentationSettings:IInstrumentationSettings = { - endpointURL: 'https://self.pipe.aria.int.microsoft.com/OneCollector/1.0/', - instrumentationKey: 'bd47fc8d971f4283a6686ec46fd48782-bdef6c1c-75ab-417c-a1f7-8bbe21e12da6-7708' + endpointURL: 'https://us-mobile.events.data.microsoft.com/OneCollector/1.0/', + instrumentationKey: '197418c5cb8c4426b201f9db2e87b914-87887378-2790-49b0-9295-51f43b6204b1-7172' }; switch (region) { case 'tie': @@ -153,16 +163,8 @@ export class OneDSLogger implements ITelemetryLogger{ eventName: eventName, eventType: EventType.TRACE, severity: Severity.INFO, - eventInfo: JSON.stringify( - { - eventInfo: eventInfo - } - ), - measurement: JSON.stringify( - { - measurement: measurement - } - ), + eventInfo: JSON.stringify(eventInfo!), + measurement: JSON.stringify(measurement!) } }; @@ -177,16 +179,8 @@ export class OneDSLogger implements ITelemetryLogger{ eventName: eventName, eventType: EventType.TRACE, severity: Severity.WARN, - eventInfo: JSON.stringify( - { - eventInfo: eventInfo - } - ), - measurement: JSON.stringify( - { - measurement: measurement - } - ) + eventInfo: JSON.stringify(eventInfo!), + measurement: JSON.stringify(measurement!) } }; @@ -195,25 +189,24 @@ export class OneDSLogger implements ITelemetryLogger{ // Trace error log public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { + // if (eventName === 'WebExtensionSetVscodeWorkspaceStateFailed') { + console.log("here in onedslogger eventName--"+eventName); + console.log("here in onedslogger errorMessage--"+errorMessage); + console.log("here in onedslogger exception--"+exception); + console.log("here in onedslogger eventInfo--"+eventInfo); + console.log("here in onedslogger measurement--"+measurement); + //} const event = { name: OneDSCollectorEventName.VSCODE_EVENT, data: { eventName: eventName, eventType: EventType.TRACE, severity: Severity.ERROR, - message: errorMessage, - errorName: exception.name, - errorStack: JSON.stringify(exception), - eventInfo: JSON.stringify( - { - eventInfo: eventInfo - } - ), - measurement: JSON.stringify( - { - measurement: measurement - } - ) + message: errorMessage!, + errorName: exception ? exception.name!: 'Exception', + errorStack: JSON.stringify(exception!), + eventInfo: JSON.stringify(eventInfo!), + measurement: JSON.stringify(measurement!) } }; this.appInsightsCore.track(event); @@ -242,20 +235,90 @@ export class OneDSLogger implements ITelemetryLogger{ } /// Populate attributes that are common to all events + private populateCommonAttributes() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (envelope:any) => { + try { + envelope.data = envelope.data || {}; // create data nested object if doesn't exist already' + + envelope.data.clientSessionId = vscode.env.sessionId; + envelope.data.vscodeSurface = getExtensionType(); + envelope.data.vscodeMachineId = vscode.env.machineId; + envelope.data.vscodeExtensionName = EXTENSION_ID; + envelope.data.vscodeExtensionVersion = getExtensionVersion(); + envelope.data.vscodeVersion = vscode.version; + envelope.data.domain = vscode.env.appHost; + // envelope.data.timestamp = envelope.ext.user.locale; + // envelope.data.userLocale = envelope.ext.user.locale; + // envelope.data.userTimeZone = envelope.ext.loc.tz; + // envelope.data.appLanguage = envelope.ext.app.locale; + + // At the end of event enrichment, redact the sensitive data for all the applicable fields + // envelope = this.redactSensitiveDataFromEvent(envelope); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + catch (exception:any) + { + // Such exceptions are likely if we are trying to process event attributes which don't exist + // In such cases, only add common attributes and current exception details, and avoid processing the event attributes further + // However, do log the baseData of the event along with its name in the exception event that gets sent out in this scenario + console.warn("Caught exception processing the telemetry event: " + envelope.name); + console.warn(exception.message); + + this.traceExceptionInEventProcessing(); + return false; + } + } + } + + //// Redact Sensitive data for the fields susceptible to contain codes/tokens/keys/secrets etc. + //// This is done post event enrichment is complete to not impact the dependencies (if any) on actual values like Uri etc. // 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' + private redactSensitiveDataFromEvent(envelope:any) { + //Redact sensitive information from suseptible fields + envelope.data.errorStack = this.getAllSensitiveRedactedFromField(envelope.data.errorStack); + return envelope; + } + + //// Get redacted value after all sensitive information is redacted + getAllSensitiveRedactedFromField(value:string) { + try { + // Ensure the value is of type string + if (value && typeof value === 'string') { + this.regexPatternsToRedact.forEach((pattern: RegExp) => { + value = this.getRedactedValueViaRegexMatch(value, pattern); + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (exception:any) { + console.warn("Caught exception while processing telemetry data for redaction (if any): " + value); + console.warn(exception.message); + } + return value; + } + + //// Get redacted value + getRedactedValueViaRegexMatch(value:string, regexPattern:RegExp) { + let matches; + + while ((matches = regexPattern.exec(value)) !== null) { + // This is necessary to avoid infinite loops with zero-width matches + if (matches.index === regexPattern.lastIndex) { + regexPattern.lastIndex++; + } + + matches.forEach((match, groupIndex) => { + if (groupIndex == 0) { // Redact the entire matched string + value = value.replace(match, OneDSCollectorEventName.REDACTED); //Replace with string REDACTED + } + }); + } + return value; + } - envelope.data.clientSessionId = vscode.env.sessionId; - envelope.data.vscodeSurface = getExtensionType(); - envelope.data.vscodeMachineId = vscode.env.machineId; - envelope.data.vscodeExtensionName = EXTENSION_ID; - envelope.data.vscodeExtensionVersion = getExtensionVersion(); - envelope.data.vscodeVersion = vscode.version; - envelope.data.domain = vscode.env.appHost; - envelope.data.userLocale = envelope.ext.user.locale; - envelope.data.userTimeZone = envelope.ext.loc.tz; - envelope.data.appLanguage = envelope.ext.app.locale; + /// Trace exceptions in processing event attributes + private traceExceptionInEventProcessing() { + // TODO : Add exception handling } public flushAndTeardown(): void { diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index bad12bf72..b0580f6d1 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -50,9 +50,17 @@ export class oneDSLoggerWrapper { /// Trace exception log public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { try{ + // if (eventName === 'WebExtensionSetVscodeWorkspaceStateFailed') { + console.log("here in onedsloggerWrapper eventName--"+eventName); + console.log("here in onedsloggerWrapper errorMessage--"+errorMessage); + console.log("here in onedsloggerWrapper exception--"+exception); + console.log("here in onedsloggerWrapper eventInfo--"+eventInfo); + console.log("here in onedsloggerWrapper measurement--"+measurement); + //} oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, errorMessage, exception, eventInfo, measurement); }catch (exception) { - console.warn(exception); + console.warn("Caught exception processing the telemetry event: " + exception); + console.warn(exception); } } diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 974cbd28f..0fcb93723 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -72,10 +72,15 @@ export class WebExtensionTelemetry { telemetryData.properties.stack = error.stack; } if (errorMessage || error) { - const error: Error = new Error(errorMessage); + let error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, telemetryData.properties); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, error, telemetryData.properties) + console.log("here eventName--"+eventName); + errorMessage = 'Exception'; + console.log("here errorMessage--"+errorMessage); + error = new Error(); + console.log("here error--"+error); + // oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage, error, telemetryData.properties) } else { this._telemetry?.sendTelemetryException(new Error(), telemetryData.properties); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion From a73b3467d345123a1b6c1591803bd47da9978449 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Fri, 19 Jan 2024 17:16:56 +0530 Subject: [PATCH 27/29] changes --- src/web/client/extension.ts | 4 +--- .../client/telemetry/webExtensionTelemetry.ts | 21 ++----------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index 7804787c7..db86b40a5 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -36,7 +36,6 @@ import { copilotNotificationPanel, disposeNotificationPanel } from "../../common import { COPILOT_NOTIFICATION_DISABLED } from "../../common/copilot/constants"; import * as Constants from "./common/constants" import { fetchArtemisResponse } from "../../common/ArtemisService"; -import { oneDSLoggerWrapper } from "../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export function activate(context: vscode.ExtensionContext): void { // setup telemetry @@ -56,7 +55,6 @@ export function activate(context: vscode.ExtensionContext): void { WebExtensionContext.telemetry.getTelemetryReporter() ); - oneDSLoggerWrapper.instantiate(); WebExtensionContext.telemetry.sendInfoTelemetry("activated"); const portalsFS = new PortalsFS(); context.subscriptions.push( @@ -593,4 +591,4 @@ async function logArtemisTelemetry() { logArtemisTelemetry.name, ARTEMIS_RESPONSE_FAILED); } -} +} \ No newline at end of file diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 0fcb93723..2af8906ad 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -10,7 +10,6 @@ import { sanitizeURL } from "../utilities/urlBuilderUtil"; import { telemetryEventNames } from "./constants"; import { IPortalWebExtensionInitQueryParametersTelemetryData, IWebExtensionAPITelemetryData, IWebExtensionExceptionTelemetryData, IWebExtensionInitPathTelemetryData, IWebExtensionPerfTelemetryData } from "./webExtensionTelemetryInterface"; import { isNullOrUndefined } from '../utilities/commonUtil'; -import { oneDSLoggerWrapper } from "../../../common/OneDSLoggerTelemetry/oneDSLoggerWrapper"; export class WebExtensionTelemetry { private _telemetry: TelemetryReporter | undefined; @@ -34,7 +33,6 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties); - oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties) } public sendExtensionInitQueryParametersTelemetry(queryParamsMap: Map) { @@ -56,7 +54,6 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties); - oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties) } public sendErrorTelemetry(eventName: string, methodName: string, errorMessage?: string, error?: Error) { @@ -72,25 +69,15 @@ export class WebExtensionTelemetry { telemetryData.properties.stack = error.stack; } if (errorMessage || error) { - let error: Error = new Error(errorMessage); + const error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, telemetryData.properties); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - console.log("here eventName--"+eventName); - errorMessage = 'Exception'; - console.log("here errorMessage--"+errorMessage); - error = new Error(); - console.log("here error--"+error); - // oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage, error, telemetryData.properties) } else { this._telemetry?.sendTelemetryException(new Error(), telemetryData.properties); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, new Error(), telemetryData.properties) } } public sendInfoTelemetry(eventName: string, properties?: Record) { this._telemetry?.sendTelemetryEvent(eventName, properties); - oneDSLoggerWrapper.getLogger().traceInfo(eventName, properties) } public sendAPITelemetry( @@ -125,11 +112,8 @@ export class WebExtensionTelemetry { if (errorMessage) { const error: Error = new Error(errorMessage); this._telemetry?.sendTelemetryException(error, { ...telemetryData.properties, eventName: eventName }, telemetryData.measurements); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - oneDSLoggerWrapper.getLogger().traceError(eventName, errorMessage!, error, { ...telemetryData.properties, eventName: eventName }, telemetryData.measurements) } else { this._telemetry?.sendTelemetryEvent(telemetryData.eventName, telemetryData.properties, telemetryData.measurements); - oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, telemetryData.properties, telemetryData.measurements) } } @@ -188,10 +172,9 @@ export class WebExtensionTelemetry { } } this._telemetry?.sendTelemetryEvent(telemetryData.eventName, undefined, telemetryData.measurements); - oneDSLoggerWrapper.getLogger().traceInfo(telemetryData.eventName, undefined, telemetryData.measurements) } private getPathParameterValue(parameter: string | undefined | null): string { return (parameter) ? parameter : ''; } -} +} \ No newline at end of file From 01e50248ee1b81e1cfc764bc108a4a845d07843d Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Fri, 19 Jan 2024 17:18:05 +0530 Subject: [PATCH 28/29] changes --- src/web/client/extension.ts | 2 +- src/web/client/telemetry/webExtensionTelemetry.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web/client/extension.ts b/src/web/client/extension.ts index db86b40a5..33bece72b 100644 --- a/src/web/client/extension.ts +++ b/src/web/client/extension.ts @@ -591,4 +591,4 @@ async function logArtemisTelemetry() { logArtemisTelemetry.name, ARTEMIS_RESPONSE_FAILED); } -} \ No newline at end of file +} diff --git a/src/web/client/telemetry/webExtensionTelemetry.ts b/src/web/client/telemetry/webExtensionTelemetry.ts index 2af8906ad..954b615f6 100644 --- a/src/web/client/telemetry/webExtensionTelemetry.ts +++ b/src/web/client/telemetry/webExtensionTelemetry.ts @@ -177,4 +177,4 @@ export class WebExtensionTelemetry { private getPathParameterValue(parameter: string | undefined | null): string { return (parameter) ? parameter : ''; } -} \ No newline at end of file +} From 81762d07a527a4b921e5de0c2a6d1fee98b9d8a8 Mon Sep 17 00:00:00 2001 From: Bidisha Das Date: Fri, 19 Jan 2024 17:23:28 +0530 Subject: [PATCH 29/29] changes --- package.json | 2 +- .../OneDSLoggerTelemetry/oneDSLogger.ts | 21 ++++--------------- .../oneDSLoggerWrapper.ts | 7 ------- 3 files changed, 5 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 44edbe62b..0e49062d0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "powerplatform-vscode", "displayName": "Power Platform Tools", "description": "Tooling to create Power Platform solutions & packages, manage Power Platform environments and edit Power Apps Portals", - "version": "2.2.2222", + "version": "1.0.1-dev", "scripts": { "clean": "scorch", "build": "node node_modules/gulp/bin/gulp.js", diff --git a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts index 6c6816ed9..84798b466 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLogger.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLogger.ts @@ -25,15 +25,9 @@ export class OneDSLogger implements ITelemetryLogger{ private readonly postChannel: PostChannel; private readonly regexPatternsToRedact = [ - /secret["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, - /code["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, /key["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, /token["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, - /session["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, - /password["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, - /passwd["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, - /connection["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm, - /sig["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm + /session["\\ ']*[:=]+["\\ ']*([a-zA-Z0-9]*)/igm ] private readonly fetchHttpXHROverride: IXHROverride = { @@ -120,8 +114,8 @@ export class OneDSLogger implements ITelemetryLogger{ // eslint-disable-next-line @typescript-eslint/no-inferrable-types const region:string = "test"; // TODO: Remove it from here and replace it with value getting from build. Check gulp.mjs (setTelemetryTarget) const instrumentationSettings:IInstrumentationSettings = { - endpointURL: 'https://us-mobile.events.data.microsoft.com/OneCollector/1.0/', - instrumentationKey: '197418c5cb8c4426b201f9db2e87b914-87887378-2790-49b0-9295-51f43b6204b1-7172' + endpointURL: 'https://self.pipe.aria.int.microsoft.com/OneCollector/1.0/', + instrumentationKey: 'bd47fc8d971f4283a6686ec46fd48782-bdef6c1c-75ab-417c-a1f7-8bbe21e12da6-7708' }; switch (region) { case 'tie': @@ -189,13 +183,6 @@ export class OneDSLogger implements ITelemetryLogger{ // Trace error log public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { - // if (eventName === 'WebExtensionSetVscodeWorkspaceStateFailed') { - console.log("here in onedslogger eventName--"+eventName); - console.log("here in onedslogger errorMessage--"+errorMessage); - console.log("here in onedslogger exception--"+exception); - console.log("here in onedslogger eventInfo--"+eventInfo); - console.log("here in onedslogger measurement--"+measurement); - //} const event = { name: OneDSCollectorEventName.VSCODE_EVENT, data: { @@ -203,7 +190,7 @@ export class OneDSLogger implements ITelemetryLogger{ eventType: EventType.TRACE, severity: Severity.ERROR, message: errorMessage!, - errorName: exception ? exception.name!: 'Exception', + errorName: exception!, errorStack: JSON.stringify(exception!), eventInfo: JSON.stringify(eventInfo!), measurement: JSON.stringify(measurement!) diff --git a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts index b0580f6d1..cfcc54ff3 100644 --- a/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts +++ b/src/common/OneDSLoggerTelemetry/oneDSLoggerWrapper.ts @@ -50,13 +50,6 @@ export class oneDSLoggerWrapper { /// Trace exception log public traceError(eventName: string, errorMessage: string, exception: Error, eventInfo?:object, measurement?: object) { try{ - // if (eventName === 'WebExtensionSetVscodeWorkspaceStateFailed') { - console.log("here in onedsloggerWrapper eventName--"+eventName); - console.log("here in onedsloggerWrapper errorMessage--"+errorMessage); - console.log("here in onedsloggerWrapper exception--"+exception); - console.log("here in onedsloggerWrapper eventInfo--"+eventInfo); - console.log("here in onedsloggerWrapper measurement--"+measurement); - //} oneDSLoggerWrapper.oneDSLoggerIntance.traceError(eventName, errorMessage, exception, eventInfo, measurement); }catch (exception) { console.warn("Caught exception processing the telemetry event: " + exception);