@fluidframework/telemetry-utils 2.0.0-internal.5.1.0 → 2.0.0-internal.5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluidframework/telemetry-utils
2
2
 
3
+ ## 2.0.0-internal.5.2.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.0.0-internal.5.1.0
4
8
 
5
9
  ### Minor Changes
package/dist/logger.d.ts CHANGED
@@ -3,7 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { ITelemetryBaseEvent, ITelemetryBaseLogger, ITelemetryErrorEvent, ITelemetryGenericEvent, ITelemetryPerformanceEvent, ITelemetryProperties, TelemetryEventPropertyType, ITaggedTelemetryPropertyType, TelemetryEventCategory } from "@fluidframework/common-definitions";
6
+ import { IsomorphicPerformance } from "@fluidframework/common-utils";
6
7
  import { ITaggedTelemetryPropertyTypeExt, ITelemetryGenericEventExt, ITelemetryLoggerExt, ITelemetryPerformanceEventExt, TelemetryEventPropertyTypeExt } from "./telemetryTypes";
8
+ export interface Memory {
9
+ usedJSHeapSize: number;
10
+ }
11
+ export interface PerformanceWithMemory extends IsomorphicPerformance {
12
+ readonly memory: Memory;
13
+ }
7
14
  /**
8
15
  * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.
9
16
  * Please do not modify existing entries for backwards compatibility.
@@ -161,14 +168,16 @@ export interface IPerformanceEventMarkers {
161
168
  export declare class PerformanceEvent {
162
169
  private readonly logger;
163
170
  private readonly markers;
164
- static start(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers): PerformanceEvent;
171
+ private readonly recordHeapSize;
172
+ static start(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers, recordHeapSize?: boolean): PerformanceEvent;
165
173
  static timedExec<T>(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, callback: (event: PerformanceEvent) => T, markers?: IPerformanceEventMarkers): T;
166
- static timedExecAsync<T>(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, callback: (event: PerformanceEvent) => Promise<T>, markers?: IPerformanceEventMarkers): Promise<T>;
174
+ static timedExecAsync<T>(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, callback: (event: PerformanceEvent) => Promise<T>, markers?: IPerformanceEventMarkers, recordHeapSize?: boolean): Promise<T>;
167
175
  get duration(): number;
168
176
  private event?;
169
177
  private readonly startTime;
170
178
  private startMark?;
171
- protected constructor(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers);
179
+ private startMemoryCollection;
180
+ protected constructor(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers, recordHeapSize?: boolean);
172
181
  reportProgress(props?: ITelemetryProperties, eventNameSuffix?: string): void;
173
182
  private autoEnd;
174
183
  end(props?: ITelemetryProperties): void;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,EACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAe,MAAM,8BAA8B,CAAC;AAQlF,OAAO,EACN,+BAA+B,EAE/B,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,6BAA6B,EAC7B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,MAAM;IACtB,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AACD;;;GAGG;AACH,oBAAY,gBAAgB;IAC3B,4FAA4F;IAC5F,YAAY,iBAAiB;IAC7B,8EAA8E;IAC9E,QAAQ,aAAa;CACrB;AAED,oBAAY,2BAA2B,GAAG,0BAA0B,GAAG,4BAA4B,CAAC;AAEpG,MAAM,WAAW,2BAA2B;IAC3C,CAAC,KAAK,EAAE,MAAM,GAAG,2BAA2B,GAAG,CAAC,MAAM,2BAA2B,CAAC,CAAC;CACnF;AACD,MAAM,WAAW,4BAA4B;IAC5C,GAAG,CAAC,EAAE,2BAA2B,CAAC;IAClC,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACpC;AAED;;;;GAIG;AACH,8BAAsB,eAAgB,YAAW,mBAAmB;IA6DlE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;IA7D/B,gBAAuB,uBAAuB,OAAO;WAEvC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9C;;;;;OAKG;WACW,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;WAQ7E,eAAe,CAAC,IAAI,EAAE,MAAM;IAI1C;;;;;;OAMG;WACW,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO;gBA6BxE,SAAS,CAAC,oBAAQ,EAClB,UAAU,CAAC,0CAA8B;IAG7D;;;;OAIG;aACa,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAEtD;;;;;OAKG;IACI,kBAAkB,CAAC,KAAK,EAAE,yBAAyB,EAAE,KAAK,CAAC,EAAE,GAAG;IAIvE;;;;;OAKG;IACH,SAAS,CAAC,sBAAsB,CAC/B,KAAK,EAAE,yBAAyB,GAAG;QAAE,QAAQ,EAAE,sBAAsB,CAAA;KAAE,EACvE,KAAK,CAAC,EAAE,GAAG;IAeZ;;;;;OAKG;IACI,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,GAAG;IAa9D;;;;;OAKG;IACI,oBAAoB,CAAC,KAAK,EAAE,6BAA6B,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IASpF,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB;CAiCvE;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEzD,IAAI,CAAC,kBAAkB,EAAE,mBAAmB;CAoCnD;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAoD9C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,oBAAoB;IAnDpD;;;;;;OAMG;WACW,MAAM,CACnB,UAAU,CAAC,EAAE,oBAAoB,EACjC,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,4BAA4B,GACvC,eAAe;IAuClB,OAAO;IAaP;;;;OAIG;IACI,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;CAG7C;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,eAAe;IACnD,SAAS,CAAC,OAAO,EAAE,oBAAoB,EAAE,CAAM;IAE/C;;;;OAIG;gBACS,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,4BAA4B;IAIzE;;;OAGG;IACI,SAAS,CAAC,MAAM,CAAC,EAAE,oBAAoB;IAM9C;;;;OAIG;IACI,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;CAM7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACxC,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAuD3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;WAzDlB,KAAK,CAClB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,sBAAsB,EAC7B,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,GAAE,OAAe;WAKlB,SAAS,CAAC,CAAC,EACxB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,CAAC,EACxC,OAAO,CAAC,EAAE,wBAAwB;WAaf,cAAc,CAAC,CAAC,EACnC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,EACjD,OAAO,CAAC,EAAE,wBAAwB,EAClC,cAAc,CAAC,EAAE,OAAO;IAazB,IAAW,QAAQ,WAElB;IAED,OAAO,CAAC,KAAK,CAAC,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAyB;IAEtD,SAAS,aACS,MAAM,EAAE,mBAAmB,EAC5C,KAAK,EAAE,sBAAsB,EACZ,OAAO,GAAE,wBAA2D,EACpE,cAAc,GAAE,OAAe;IAa1C,cAAc,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,eAAe,GAAE,MAAiB,GAAG,IAAI;IAI7F,OAAO,CAAC,OAAO;IASR,GAAG,CAAC,KAAK,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAM9C,OAAO,CAAC,kBAAkB;IASnB,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAO9D;;OAEG;IACI,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,GAAG;CA8BrF;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;IACrD,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IACtC,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,EAAE,KAAK,CAAC,EAAE,GAAG;IAC7D,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,GAAG;IAGvD,oBAAoB,CAAC,KAAK,EAAE,0BAA0B,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAC1E,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAG7C,YAAY,CAAC,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI;IAG/D,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAGnE,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,oBAAoB,GAAG,IAAI;IAIzE,OAAO,CAAC,WAAW;CASnB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,oBAAoB;IACnE;;;;OAIG;IACI,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;CAG7C;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,mBAAmB;IACvD,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IACtC,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IACpE,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAC9D,oBAAoB,CAAC,KAAK,EAAE,0BAA0B,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;CACjF;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACxC,CAAC,EAAE,6BAA6B,GAAG,+BAA+B,GAChE,0BAA0B,GAAG,4BAA4B,CAO3D"}
package/dist/logger.js CHANGED
@@ -312,11 +312,13 @@ exports.MultiSinkLogger = MultiSinkLogger;
312
312
  * Helper class to log performance events
313
313
  */
314
314
  class PerformanceEvent {
315
- constructor(logger, event, markers = { end: true, cancel: "generic" }) {
315
+ constructor(logger, event, markers = { end: true, cancel: "generic" }, recordHeapSize = false) {
316
316
  var _a;
317
317
  this.logger = logger;
318
318
  this.markers = markers;
319
+ this.recordHeapSize = recordHeapSize;
319
320
  this.startTime = common_utils_1.performance.now();
321
+ this.startMemoryCollection = 0;
320
322
  this.event = Object.assign({}, event);
321
323
  if (this.markers.start) {
322
324
  this.reportEvent("start");
@@ -326,8 +328,8 @@ class PerformanceEvent {
326
328
  window.performance.mark(this.startMark);
327
329
  }
328
330
  }
329
- static start(logger, event, markers) {
330
- return new PerformanceEvent(logger, event, markers);
331
+ static start(logger, event, markers, recordHeapSize = false) {
332
+ return new PerformanceEvent(logger, event, markers, recordHeapSize);
331
333
  }
332
334
  static timedExec(logger, event, callback, markers) {
333
335
  const perfEvent = PerformanceEvent.start(logger, event, markers);
@@ -341,8 +343,8 @@ class PerformanceEvent {
341
343
  throw error;
342
344
  }
343
345
  }
344
- static async timedExecAsync(logger, event, callback, markers) {
345
- const perfEvent = PerformanceEvent.start(logger, event, markers);
346
+ static async timedExecAsync(logger, event, callback, markers, recordHeapSize) {
347
+ const perfEvent = PerformanceEvent.start(logger, event, markers, recordHeapSize);
346
348
  try {
347
349
  const ret = await callback(perfEvent);
348
350
  perfEvent.autoEnd();
@@ -390,6 +392,7 @@ class PerformanceEvent {
390
392
  * Report the event, if it hasn't already been reported.
391
393
  */
392
394
  reportEvent(eventNameSuffix, props, error) {
395
+ var _a, _b, _c, _d;
393
396
  // There are strange sequences involving multiple Promise chains
394
397
  // where the event can be cancelled and then later a callback is invoked
395
398
  // and the caller attempts to end directly, e.g. issue #3936. Just return.
@@ -400,6 +403,16 @@ class PerformanceEvent {
400
403
  event.eventName = `${event.eventName}_${eventNameSuffix}`;
401
404
  if (eventNameSuffix !== "start") {
402
405
  event.duration = this.duration;
406
+ if (this.startMemoryCollection) {
407
+ const currentMemory = (_b = (_a = common_utils_1.performance) === null || _a === void 0 ? void 0 : _a.memory) === null || _b === void 0 ? void 0 : _b.usedJSHeapSize;
408
+ const differenceInKBytes = Math.floor((currentMemory - this.startMemoryCollection) / 1024);
409
+ if (differenceInKBytes > 0) {
410
+ event.usedJSHeapSize = differenceInKBytes;
411
+ }
412
+ }
413
+ }
414
+ else if (this.recordHeapSize) {
415
+ this.startMemoryCollection = (_d = (_c = common_utils_1.performance) === null || _c === void 0 ? void 0 : _c.memory) === null || _d === void 0 ? void 0 : _d.usedJSHeapSize;
403
416
  }
404
417
  this.logger.sendPerformanceEvent(event, error);
405
418
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryErrorEvent,\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n\tTelemetryEventPropertyType,\n\tITaggedTelemetryPropertyType,\n\tTelemetryEventCategory,\n} from \"@fluidframework/common-definitions\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from \"./config\";\nimport {\n\tisILoggingError,\n\textractLogSafeErrorProperties,\n\tgenerateStack,\n\tisTaggedTelemetryPropertyValue,\n} from \"./errorLogging\";\nimport {\n\tITaggedTelemetryPropertyTypeExt,\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\tITelemetryPerformanceEventExt,\n\tTelemetryEventPropertyTypeExt,\n} from \"./telemetryTypes\";\n\n/**\n * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.\n * Please do not modify existing entries for backwards compatibility.\n */\nexport enum TelemetryDataTag {\n\t/** Data containing terms or IDs from code packages that may have been dynamically loaded */\n\tCodeArtifact = \"CodeArtifact\",\n\t/** Personal data of a variety of classifications that pertains to the user */\n\tUserData = \"UserData\",\n}\n\nexport type TelemetryEventPropertyTypes = TelemetryEventPropertyType | ITaggedTelemetryPropertyType;\n\nexport interface ITelemetryLoggerPropertyBag {\n\t[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);\n}\nexport interface ITelemetryLoggerPropertyBags {\n\tall?: ITelemetryLoggerPropertyBag;\n\terror?: ITelemetryLoggerPropertyBag;\n}\n\n/**\n * TelemetryLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport abstract class TelemetryLogger implements ITelemetryLoggerExt {\n\tpublic static readonly eventNamespaceSeparator = \":\";\n\n\tpublic static formatTick(tick: number): number {\n\t\treturn Math.floor(tick);\n\t}\n\n\t/**\n\t * Attempts to parse number from string.\n\t * If fails,returns original string.\n\t * Used to make telemetry data typed (and support math operations, like comparison),\n\t * in places where we do expect numbers (like contentsize/duration property in http header)\n\t */\n\tpublic static numberFromString(str: string | null | undefined): string | number | undefined {\n\t\tif (str === undefined || str === null) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst num = Number(str);\n\t\treturn Number.isNaN(num) ? str : num;\n\t}\n\n\tpublic static sanitizePkgName(name: string) {\n\t\treturn name.replace(\"@\", \"\").replace(\"/\", \"-\");\n\t}\n\n\t/**\n\t * Take an unknown error object and add the appropriate info from it to the event. Message and stack will be copied\n\t * over from the error object, along with other telemetry properties if it's an ILoggingError.\n\t * @param event - Event being logged\n\t * @param error - Error to extract info from\n\t * @param fetchStack - Whether to fetch the current callstack if error.stack is undefined\n\t */\n\tpublic static prepareErrorObject(event: ITelemetryBaseEvent, error: any, fetchStack: boolean) {\n\t\tconst { message, errorType, stack } = extractLogSafeErrorProperties(\n\t\t\terror,\n\t\t\ttrue /* sanitizeStack */,\n\t\t);\n\t\t// First, copy over error message, stack, and errorType directly (overwrite if present on event)\n\t\tevent.stack = stack;\n\t\tevent.error = message; // Note that the error message goes on the 'error' field\n\t\tevent.errorType = errorType;\n\n\t\tif (isILoggingError(error)) {\n\t\t\t// Add any other telemetry properties from the LoggingError\n\t\t\tconst telemetryProp = error.getTelemetryProperties();\n\t\t\tfor (const key of Object.keys(telemetryProp)) {\n\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t// Don't overwrite existing properties on the event\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tevent[key] = telemetryProp[key];\n\t\t\t}\n\t\t}\n\n\t\t// Collect stack if we were not able to extract it from error\n\t\tif (event.stack === undefined && fetchStack) {\n\t\t\tevent.stack = generateStack();\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tprotected readonly namespace?: string,\n\t\tprotected readonly properties?: ITelemetryLoggerPropertyBags,\n\t) {}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic abstract send(event: ITelemetryBaseEvent): void;\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEventExt, error?: any) {\n\t\tthis.sendTelemetryEventCore({ ...event, category: event.category ?? \"generic\" }, error);\n\t}\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tprotected sendTelemetryEventCore(\n\t\tevent: ITelemetryGenericEventExt & { category: TelemetryEventCategory },\n\t\terror?: any,\n\t) {\n\t\tconst newEvent = convertToBaseEvent(event);\n\t\tif (error !== undefined) {\n\t\t\tTelemetryLogger.prepareErrorObject(newEvent, error, false);\n\t\t}\n\n\t\t// Will include Nan & Infinity, but probably we do not care\n\t\tif (typeof newEvent.duration === \"number\") {\n\t\t\tnewEvent.duration = TelemetryLogger.formatTick(newEvent.duration);\n\t\t}\n\n\t\tthis.send(newEvent);\n\t}\n\n\t/**\n\t * Send an error telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.sendTelemetryEventCore(\n\t\t\t{\n\t\t\t\t// ensure the error field has some value,\n\t\t\t\t// this can and will be overridden by event, or error\n\t\t\t\terror: event.eventName,\n\t\t\t\t...event,\n\t\t\t\tcategory: \"error\",\n\t\t\t},\n\t\t\terror,\n\t\t);\n\t}\n\n\t/**\n\t * Send a performance telemetry event with the logger\n\t *\n\t * @param event - Event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEventExt, error?: any): void {\n\t\tconst perfEvent = {\n\t\t\t...event,\n\t\t\tcategory: event.category ?? \"performance\",\n\t\t};\n\n\t\tthis.sendTelemetryEventCore(perfEvent, error);\n\t}\n\n\tprotected prepareEvent(event: ITelemetryBaseEvent): ITelemetryBaseEvent {\n\t\tconst includeErrorProps = event.category === \"error\" || event.error !== undefined;\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\t...event,\n\t\t};\n\t\tif (this.namespace !== undefined) {\n\t\t\tnewEvent.eventName = `${this.namespace}${TelemetryLogger.eventNamespaceSeparator}${newEvent.eventName}`;\n\t\t}\n\t\tif (this.properties) {\n\t\t\tconst properties: (undefined | ITelemetryLoggerPropertyBag)[] = [];\n\t\t\tproperties.push(this.properties.all);\n\t\t\tif (includeErrorProps) {\n\t\t\t\tproperties.push(this.properties.error);\n\t\t\t}\n\t\t\tfor (const props of properties) {\n\t\t\t\tif (props !== undefined) {\n\t\t\t\t\tfor (const key of Object.keys(props)) {\n\t\t\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst getterOrValue = props[key];\n\t\t\t\t\t\t// If this throws, hopefully it is handled elsewhere\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof getterOrValue === \"function\" ? getterOrValue() : getterOrValue;\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn newEvent;\n\t}\n}\n\n/**\n * @deprecated 0.56, remove TaggedLoggerAdapter once its usage is removed from\n * container-runtime. Issue: #8191\n * TaggedLoggerAdapter class can add tag handling to your logger.\n */\nexport class TaggedLoggerAdapter implements ITelemetryBaseLogger {\n\tpublic constructor(private readonly logger: ITelemetryBaseLogger) {}\n\n\tpublic send(eventWithTagsMaybe: ITelemetryBaseEvent) {\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\tcategory: eventWithTagsMaybe.category,\n\t\t\teventName: eventWithTagsMaybe.eventName,\n\t\t};\n\t\tfor (const key of Object.keys(eventWithTagsMaybe)) {\n\t\t\tconst taggableProp = eventWithTagsMaybe[key];\n\t\t\tconst { value, tag } =\n\t\t\t\ttypeof taggableProp === \"object\"\n\t\t\t\t\t? taggableProp\n\t\t\t\t\t: { value: taggableProp, tag: undefined };\n\t\t\tswitch (tag) {\n\t\t\t\tcase undefined:\n\t\t\t\t\t// No tag means we can log plainly\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"PackageData\": // For back-compat\n\t\t\t\tcase TelemetryDataTag.CodeArtifact:\n\t\t\t\t\t// For Microsoft applications, CodeArtifact is safe for now\n\t\t\t\t\t// (we don't load 3P code in 1P apps)\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TelemetryDataTag.UserData:\n\t\t\t\t\t// Strip out anything tagged explicitly as UserData.\n\t\t\t\t\t// Alternate strategy would be to hash these props\n\t\t\t\t\tnewEvent[key] = \"REDACTED (UserData)\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// If we encounter a tag we don't recognize\n\t\t\t\t\t// then we must assume we should scrub.\n\t\t\t\t\tnewEvent[key] = \"REDACTED (unknown tag)\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.logger.send(newEvent);\n\t}\n}\n\n/**\n * ChildLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport class ChildLogger extends TelemetryLogger {\n\t/**\n\t * Create child logger\n\t * @param baseLogger - Base logger to use to output events. If undefined, proper child logger\n\t * is created, but it does not send telemetry events anywhere.\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tpublic static create(\n\t\tbaseLogger?: ITelemetryBaseLogger,\n\t\tnamespace?: string,\n\t\tproperties?: ITelemetryLoggerPropertyBags,\n\t): TelemetryLogger {\n\t\t// if we are creating a child of a child, rather than nest, which will increase\n\t\t// the callstack overhead, just generate a new logger that includes everything from the previous\n\t\tif (baseLogger instanceof ChildLogger) {\n\t\t\tconst combinedProperties: ITelemetryLoggerPropertyBags = {};\n\t\t\tfor (const extendedProps of [baseLogger.properties, properties]) {\n\t\t\t\tif (extendedProps !== undefined) {\n\t\t\t\t\tif (extendedProps.all !== undefined) {\n\t\t\t\t\t\tcombinedProperties.all = {\n\t\t\t\t\t\t\t...combinedProperties.all,\n\t\t\t\t\t\t\t...extendedProps.all,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (extendedProps.error !== undefined) {\n\t\t\t\t\t\tcombinedProperties.error = {\n\t\t\t\t\t\t\t...combinedProperties.error,\n\t\t\t\t\t\t\t...extendedProps.error,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst combinedNamespace =\n\t\t\t\tbaseLogger.namespace === undefined\n\t\t\t\t\t? namespace\n\t\t\t\t\t: namespace === undefined\n\t\t\t\t\t? baseLogger.namespace\n\t\t\t\t\t: `${baseLogger.namespace}${TelemetryLogger.eventNamespaceSeparator}${namespace}`;\n\n\t\t\treturn new ChildLogger(baseLogger.baseLogger, combinedNamespace, combinedProperties);\n\t\t}\n\n\t\treturn new ChildLogger(\n\t\t\tbaseLogger ? baseLogger : new BaseTelemetryNullLogger(),\n\t\t\tnamespace,\n\t\t\tproperties,\n\t\t);\n\t}\n\n\tprivate constructor(\n\t\tprotected readonly baseLogger: ITelemetryBaseLogger,\n\t\tnamespace: string | undefined,\n\t\tproperties: ITelemetryLoggerPropertyBags | undefined,\n\t) {\n\t\tsuper(namespace, properties);\n\n\t\t// propagate the monitoring context\n\t\tif (loggerIsMonitoringContext(baseLogger)) {\n\t\t\tmixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));\n\t\t}\n\t}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tthis.baseLogger.send(this.prepareEvent(event));\n\t}\n}\n\n/**\n * Multi-sink logger\n * Takes multiple ITelemetryBaseLogger objects (sinks) and logs all events into each sink\n */\nexport class MultiSinkLogger extends TelemetryLogger {\n\tprotected loggers: ITelemetryBaseLogger[] = [];\n\n\t/**\n\t * Create multiple sink logger (i.e. logger that sends events to multiple sinks)\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tconstructor(namespace?: string, properties?: ITelemetryLoggerPropertyBags) {\n\t\tsuper(namespace, properties);\n\t}\n\n\t/**\n\t * Add logger to send all events to\n\t * @param logger - Logger to add\n\t */\n\tpublic addLogger(logger?: ITelemetryBaseLogger) {\n\t\tif (logger !== undefined && logger !== null) {\n\t\t\tthis.loggers.push(logger);\n\t\t}\n\t}\n\n\t/**\n\t * Send an event to the loggers\n\t *\n\t * @param event - the event to send to all the registered logger\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tconst newEvent = this.prepareEvent(event);\n\t\tthis.loggers.forEach((logger: ITelemetryBaseLogger) => {\n\t\t\tlogger.send(newEvent);\n\t\t});\n\t}\n}\n\n/**\n * Describes what events PerformanceEvent should log\n * By default, all events are logged, but client can override this behavior\n * For example, there is rarely a need to record start event, as we really after\n * success / failure tracking, including duration (on success).\n */\nexport interface IPerformanceEventMarkers {\n\tstart?: true;\n\tend?: true;\n\tcancel?: \"generic\" | \"error\"; // tells wether to issue \"generic\" or \"error\" category cancel event\n}\n\n/**\n * Helper class to log performance events\n */\nexport class PerformanceEvent {\n\tpublic static start(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\treturn new PerformanceEvent(logger, event, markers);\n\t}\n\n\tpublic static timedExec<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => T,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers);\n\t\ttry {\n\t\t\tconst ret = callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic static async timedExecAsync<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => Promise<T>,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers);\n\t\ttry {\n\t\t\tconst ret = await callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic get duration() {\n\t\treturn performance.now() - this.startTime;\n\t}\n\n\tprivate event?: ITelemetryGenericEvent;\n\tprivate readonly startTime = performance.now();\n\tprivate startMark?: string;\n\n\tprotected constructor(\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tprivate readonly markers: IPerformanceEventMarkers = { end: true, cancel: \"generic\" },\n\t) {\n\t\tthis.event = { ...event };\n\t\tif (this.markers.start) {\n\t\t\tthis.reportEvent(\"start\");\n\t\t}\n\n\t\tif (typeof window === \"object\" && window != null && window.performance?.mark) {\n\t\t\tthis.startMark = `${event.eventName}-start`;\n\t\t\twindow.performance.mark(this.startMark);\n\t\t}\n\t}\n\n\tpublic reportProgress(props?: ITelemetryProperties, eventNameSuffix: string = \"update\"): void {\n\t\tthis.reportEvent(eventNameSuffix, props);\n\t}\n\n\tprivate autoEnd() {\n\t\t// Event might have been cancelled or ended in the callback\n\t\tif (this.event && this.markers.end) {\n\t\t\tthis.reportEvent(\"end\");\n\t\t}\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tpublic end(props?: ITelemetryProperties): void {\n\t\tthis.reportEvent(\"end\", props);\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tprivate performanceEndMark() {\n\t\tif (this.startMark && this.event) {\n\t\t\tconst endMark = `${this.event.eventName}-end`;\n\t\t\twindow.performance.mark(endMark);\n\t\t\twindow.performance.measure(`${this.event.eventName}`, this.startMark, endMark);\n\t\t\tthis.startMark = undefined;\n\t\t}\n\t}\n\n\tpublic cancel(props?: ITelemetryProperties, error?: any): void {\n\t\tif (this.markers.cancel !== undefined) {\n\t\t\tthis.reportEvent(\"cancel\", { category: this.markers.cancel, ...props }, error);\n\t\t}\n\t\tthis.event = undefined;\n\t}\n\n\t/**\n\t * Report the event, if it hasn't already been reported.\n\t */\n\tpublic reportEvent(eventNameSuffix: string, props?: ITelemetryProperties, error?: any) {\n\t\t// There are strange sequences involving multiple Promise chains\n\t\t// where the event can be cancelled and then later a callback is invoked\n\t\t// and the caller attempts to end directly, e.g. issue #3936. Just return.\n\t\tif (!this.event) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst event: ITelemetryPerformanceEvent = { ...this.event, ...props };\n\t\tevent.eventName = `${event.eventName}_${eventNameSuffix}`;\n\t\tif (eventNameSuffix !== \"start\") {\n\t\t\tevent.duration = this.duration;\n\t\t}\n\n\t\tthis.logger.sendPerformanceEvent(event, error);\n\t}\n}\n\n/**\n * Logger that is useful for UT\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryUTLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any) {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.reportError(\"errorEvent in UT logger!\", event, error);\n\t}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n\tpublic logGenericError(eventName: string, error: any) {\n\t\tthis.reportError(`genericError in UT logger!`, { eventName }, error);\n\t}\n\tpublic logException(event: ITelemetryErrorEvent, exception: any): void {\n\t\tthis.reportError(\"exception in UT logger!\", event, exception);\n\t}\n\tpublic debugAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"debugAssert in UT logger!\");\n\t}\n\tpublic shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"shipAssert in UT logger!\");\n\t}\n\n\tprivate reportError(message: string, event?: ITelemetryErrorEvent, err?: any) {\n\t\tconst error = new Error(message);\n\t\t(error as any).error = error;\n\t\t(error as any).event = event;\n\t\t// report to console as exception can be eaten\n\t\tconsole.error(message);\n\t\tconsole.error(error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class BaseTelemetryNullLogger implements ITelemetryBaseLogger {\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\treturn;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryNullLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any): void {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any): void {}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n}\n\n/**\n * Takes in an event object, and converts all of its values to a basePropertyType.\n * In the case of an invalid property type, the value will be converted to an error string.\n * @param event - Event with fields you want to stringify.\n */\nfunction convertToBaseEvent({\n\tcategory,\n\teventName,\n\t...props\n}: ITelemetryEventExt): ITelemetryBaseEvent {\n\tconst newEvent: ITelemetryBaseEvent = { category, eventName };\n\tfor (const key of Object.keys(props)) {\n\t\tnewEvent[key] = convertToBasePropertyType(props[key]);\n\t}\n\treturn newEvent;\n}\n\n/**\n * Takes in value, and does one of 4 things.\n * if value is of primitive type - returns the original value.\n * If the value is an array of primitives - returns a stringified version of the array.\n * If the value is an object of type ITaggedTelemetryPropertyType - returns the object\n * with its values recursively converted to base property Type.\n * If none of these cases are reached - returns an error string\n * @param x - value passed in to convert to a base property type\n */\nexport function convertToBasePropertyType(\n\tx: TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,\n): TelemetryEventPropertyType | ITaggedTelemetryPropertyType {\n\treturn isTaggedTelemetryPropertyValue(x)\n\t\t? {\n\t\t\t\tvalue: convertToBasePropertyTypeUntagged(x.value),\n\t\t\t\ttag: x.tag,\n\t\t }\n\t\t: convertToBasePropertyTypeUntagged(x);\n}\n\nfunction convertToBasePropertyTypeUntagged(\n\tx: TelemetryEventPropertyTypeExt,\n): TelemetryEventPropertyType {\n\tswitch (typeof x) {\n\t\tcase \"string\":\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"undefined\":\n\t\t\treturn x;\n\t\tcase \"object\":\n\t\t\t// We assume this is an array or flat object based on the input types\n\t\t\treturn JSON.stringify(x);\n\t\tdefault:\n\t\t\t// should never reach this case based on the input types\n\t\t\tconsole.error(\n\t\t\t\t`convertToBasePropertyTypeUntagged: INVALID PROPERTY (typed as ${typeof x})`,\n\t\t\t);\n\t\t\treturn `INVALID PROPERTY (typed as ${typeof x})`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryErrorEvent,\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n\tTelemetryEventPropertyType,\n\tITaggedTelemetryPropertyType,\n\tTelemetryEventCategory,\n} from \"@fluidframework/common-definitions\";\nimport { IsomorphicPerformance, performance } from \"@fluidframework/common-utils\";\nimport { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from \"./config\";\nimport {\n\tisILoggingError,\n\textractLogSafeErrorProperties,\n\tgenerateStack,\n\tisTaggedTelemetryPropertyValue,\n} from \"./errorLogging\";\nimport {\n\tITaggedTelemetryPropertyTypeExt,\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\tITelemetryPerformanceEventExt,\n\tTelemetryEventPropertyTypeExt,\n} from \"./telemetryTypes\";\n\nexport interface Memory {\n\tusedJSHeapSize: number;\n}\n\nexport interface PerformanceWithMemory extends IsomorphicPerformance {\n\treadonly memory: Memory;\n}\n/**\n * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.\n * Please do not modify existing entries for backwards compatibility.\n */\nexport enum TelemetryDataTag {\n\t/** Data containing terms or IDs from code packages that may have been dynamically loaded */\n\tCodeArtifact = \"CodeArtifact\",\n\t/** Personal data of a variety of classifications that pertains to the user */\n\tUserData = \"UserData\",\n}\n\nexport type TelemetryEventPropertyTypes = TelemetryEventPropertyType | ITaggedTelemetryPropertyType;\n\nexport interface ITelemetryLoggerPropertyBag {\n\t[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);\n}\nexport interface ITelemetryLoggerPropertyBags {\n\tall?: ITelemetryLoggerPropertyBag;\n\terror?: ITelemetryLoggerPropertyBag;\n}\n\n/**\n * TelemetryLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport abstract class TelemetryLogger implements ITelemetryLoggerExt {\n\tpublic static readonly eventNamespaceSeparator = \":\";\n\n\tpublic static formatTick(tick: number): number {\n\t\treturn Math.floor(tick);\n\t}\n\n\t/**\n\t * Attempts to parse number from string.\n\t * If fails,returns original string.\n\t * Used to make telemetry data typed (and support math operations, like comparison),\n\t * in places where we do expect numbers (like contentsize/duration property in http header)\n\t */\n\tpublic static numberFromString(str: string | null | undefined): string | number | undefined {\n\t\tif (str === undefined || str === null) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst num = Number(str);\n\t\treturn Number.isNaN(num) ? str : num;\n\t}\n\n\tpublic static sanitizePkgName(name: string) {\n\t\treturn name.replace(\"@\", \"\").replace(\"/\", \"-\");\n\t}\n\n\t/**\n\t * Take an unknown error object and add the appropriate info from it to the event. Message and stack will be copied\n\t * over from the error object, along with other telemetry properties if it's an ILoggingError.\n\t * @param event - Event being logged\n\t * @param error - Error to extract info from\n\t * @param fetchStack - Whether to fetch the current callstack if error.stack is undefined\n\t */\n\tpublic static prepareErrorObject(event: ITelemetryBaseEvent, error: any, fetchStack: boolean) {\n\t\tconst { message, errorType, stack } = extractLogSafeErrorProperties(\n\t\t\terror,\n\t\t\ttrue /* sanitizeStack */,\n\t\t);\n\t\t// First, copy over error message, stack, and errorType directly (overwrite if present on event)\n\t\tevent.stack = stack;\n\t\tevent.error = message; // Note that the error message goes on the 'error' field\n\t\tevent.errorType = errorType;\n\n\t\tif (isILoggingError(error)) {\n\t\t\t// Add any other telemetry properties from the LoggingError\n\t\t\tconst telemetryProp = error.getTelemetryProperties();\n\t\t\tfor (const key of Object.keys(telemetryProp)) {\n\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t// Don't overwrite existing properties on the event\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tevent[key] = telemetryProp[key];\n\t\t\t}\n\t\t}\n\n\t\t// Collect stack if we were not able to extract it from error\n\t\tif (event.stack === undefined && fetchStack) {\n\t\t\tevent.stack = generateStack();\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tprotected readonly namespace?: string,\n\t\tprotected readonly properties?: ITelemetryLoggerPropertyBags,\n\t) {}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic abstract send(event: ITelemetryBaseEvent): void;\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEventExt, error?: any) {\n\t\tthis.sendTelemetryEventCore({ ...event, category: event.category ?? \"generic\" }, error);\n\t}\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tprotected sendTelemetryEventCore(\n\t\tevent: ITelemetryGenericEventExt & { category: TelemetryEventCategory },\n\t\terror?: any,\n\t) {\n\t\tconst newEvent = convertToBaseEvent(event);\n\t\tif (error !== undefined) {\n\t\t\tTelemetryLogger.prepareErrorObject(newEvent, error, false);\n\t\t}\n\n\t\t// Will include Nan & Infinity, but probably we do not care\n\t\tif (typeof newEvent.duration === \"number\") {\n\t\t\tnewEvent.duration = TelemetryLogger.formatTick(newEvent.duration);\n\t\t}\n\n\t\tthis.send(newEvent);\n\t}\n\n\t/**\n\t * Send an error telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.sendTelemetryEventCore(\n\t\t\t{\n\t\t\t\t// ensure the error field has some value,\n\t\t\t\t// this can and will be overridden by event, or error\n\t\t\t\terror: event.eventName,\n\t\t\t\t...event,\n\t\t\t\tcategory: \"error\",\n\t\t\t},\n\t\t\terror,\n\t\t);\n\t}\n\n\t/**\n\t * Send a performance telemetry event with the logger\n\t *\n\t * @param event - Event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEventExt, error?: any): void {\n\t\tconst perfEvent = {\n\t\t\t...event,\n\t\t\tcategory: event.category ?? \"performance\",\n\t\t};\n\n\t\tthis.sendTelemetryEventCore(perfEvent, error);\n\t}\n\n\tprotected prepareEvent(event: ITelemetryBaseEvent): ITelemetryBaseEvent {\n\t\tconst includeErrorProps = event.category === \"error\" || event.error !== undefined;\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\t...event,\n\t\t};\n\t\tif (this.namespace !== undefined) {\n\t\t\tnewEvent.eventName = `${this.namespace}${TelemetryLogger.eventNamespaceSeparator}${newEvent.eventName}`;\n\t\t}\n\t\tif (this.properties) {\n\t\t\tconst properties: (undefined | ITelemetryLoggerPropertyBag)[] = [];\n\t\t\tproperties.push(this.properties.all);\n\t\t\tif (includeErrorProps) {\n\t\t\t\tproperties.push(this.properties.error);\n\t\t\t}\n\t\t\tfor (const props of properties) {\n\t\t\t\tif (props !== undefined) {\n\t\t\t\t\tfor (const key of Object.keys(props)) {\n\t\t\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst getterOrValue = props[key];\n\t\t\t\t\t\t// If this throws, hopefully it is handled elsewhere\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof getterOrValue === \"function\" ? getterOrValue() : getterOrValue;\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn newEvent;\n\t}\n}\n\n/**\n * @deprecated 0.56, remove TaggedLoggerAdapter once its usage is removed from\n * container-runtime. Issue: #8191\n * TaggedLoggerAdapter class can add tag handling to your logger.\n */\nexport class TaggedLoggerAdapter implements ITelemetryBaseLogger {\n\tpublic constructor(private readonly logger: ITelemetryBaseLogger) {}\n\n\tpublic send(eventWithTagsMaybe: ITelemetryBaseEvent) {\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\tcategory: eventWithTagsMaybe.category,\n\t\t\teventName: eventWithTagsMaybe.eventName,\n\t\t};\n\t\tfor (const key of Object.keys(eventWithTagsMaybe)) {\n\t\t\tconst taggableProp = eventWithTagsMaybe[key];\n\t\t\tconst { value, tag } =\n\t\t\t\ttypeof taggableProp === \"object\"\n\t\t\t\t\t? taggableProp\n\t\t\t\t\t: { value: taggableProp, tag: undefined };\n\t\t\tswitch (tag) {\n\t\t\t\tcase undefined:\n\t\t\t\t\t// No tag means we can log plainly\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"PackageData\": // For back-compat\n\t\t\t\tcase TelemetryDataTag.CodeArtifact:\n\t\t\t\t\t// For Microsoft applications, CodeArtifact is safe for now\n\t\t\t\t\t// (we don't load 3P code in 1P apps)\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TelemetryDataTag.UserData:\n\t\t\t\t\t// Strip out anything tagged explicitly as UserData.\n\t\t\t\t\t// Alternate strategy would be to hash these props\n\t\t\t\t\tnewEvent[key] = \"REDACTED (UserData)\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// If we encounter a tag we don't recognize\n\t\t\t\t\t// then we must assume we should scrub.\n\t\t\t\t\tnewEvent[key] = \"REDACTED (unknown tag)\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.logger.send(newEvent);\n\t}\n}\n\n/**\n * ChildLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport class ChildLogger extends TelemetryLogger {\n\t/**\n\t * Create child logger\n\t * @param baseLogger - Base logger to use to output events. If undefined, proper child logger\n\t * is created, but it does not send telemetry events anywhere.\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tpublic static create(\n\t\tbaseLogger?: ITelemetryBaseLogger,\n\t\tnamespace?: string,\n\t\tproperties?: ITelemetryLoggerPropertyBags,\n\t): TelemetryLogger {\n\t\t// if we are creating a child of a child, rather than nest, which will increase\n\t\t// the callstack overhead, just generate a new logger that includes everything from the previous\n\t\tif (baseLogger instanceof ChildLogger) {\n\t\t\tconst combinedProperties: ITelemetryLoggerPropertyBags = {};\n\t\t\tfor (const extendedProps of [baseLogger.properties, properties]) {\n\t\t\t\tif (extendedProps !== undefined) {\n\t\t\t\t\tif (extendedProps.all !== undefined) {\n\t\t\t\t\t\tcombinedProperties.all = {\n\t\t\t\t\t\t\t...combinedProperties.all,\n\t\t\t\t\t\t\t...extendedProps.all,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (extendedProps.error !== undefined) {\n\t\t\t\t\t\tcombinedProperties.error = {\n\t\t\t\t\t\t\t...combinedProperties.error,\n\t\t\t\t\t\t\t...extendedProps.error,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst combinedNamespace =\n\t\t\t\tbaseLogger.namespace === undefined\n\t\t\t\t\t? namespace\n\t\t\t\t\t: namespace === undefined\n\t\t\t\t\t? baseLogger.namespace\n\t\t\t\t\t: `${baseLogger.namespace}${TelemetryLogger.eventNamespaceSeparator}${namespace}`;\n\n\t\t\treturn new ChildLogger(baseLogger.baseLogger, combinedNamespace, combinedProperties);\n\t\t}\n\n\t\treturn new ChildLogger(\n\t\t\tbaseLogger ? baseLogger : new BaseTelemetryNullLogger(),\n\t\t\tnamespace,\n\t\t\tproperties,\n\t\t);\n\t}\n\n\tprivate constructor(\n\t\tprotected readonly baseLogger: ITelemetryBaseLogger,\n\t\tnamespace: string | undefined,\n\t\tproperties: ITelemetryLoggerPropertyBags | undefined,\n\t) {\n\t\tsuper(namespace, properties);\n\n\t\t// propagate the monitoring context\n\t\tif (loggerIsMonitoringContext(baseLogger)) {\n\t\t\tmixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));\n\t\t}\n\t}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tthis.baseLogger.send(this.prepareEvent(event));\n\t}\n}\n\n/**\n * Multi-sink logger\n * Takes multiple ITelemetryBaseLogger objects (sinks) and logs all events into each sink\n */\nexport class MultiSinkLogger extends TelemetryLogger {\n\tprotected loggers: ITelemetryBaseLogger[] = [];\n\n\t/**\n\t * Create multiple sink logger (i.e. logger that sends events to multiple sinks)\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tconstructor(namespace?: string, properties?: ITelemetryLoggerPropertyBags) {\n\t\tsuper(namespace, properties);\n\t}\n\n\t/**\n\t * Add logger to send all events to\n\t * @param logger - Logger to add\n\t */\n\tpublic addLogger(logger?: ITelemetryBaseLogger) {\n\t\tif (logger !== undefined && logger !== null) {\n\t\t\tthis.loggers.push(logger);\n\t\t}\n\t}\n\n\t/**\n\t * Send an event to the loggers\n\t *\n\t * @param event - the event to send to all the registered logger\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tconst newEvent = this.prepareEvent(event);\n\t\tthis.loggers.forEach((logger: ITelemetryBaseLogger) => {\n\t\t\tlogger.send(newEvent);\n\t\t});\n\t}\n}\n\n/**\n * Describes what events PerformanceEvent should log\n * By default, all events are logged, but client can override this behavior\n * For example, there is rarely a need to record start event, as we really after\n * success / failure tracking, including duration (on success).\n */\nexport interface IPerformanceEventMarkers {\n\tstart?: true;\n\tend?: true;\n\tcancel?: \"generic\" | \"error\"; // tells wether to issue \"generic\" or \"error\" category cancel event\n}\n\n/**\n * Helper class to log performance events\n */\nexport class PerformanceEvent {\n\tpublic static start(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t\trecordHeapSize: boolean = false,\n\t) {\n\t\treturn new PerformanceEvent(logger, event, markers, recordHeapSize);\n\t}\n\n\tpublic static timedExec<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => T,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers);\n\t\ttry {\n\t\t\tconst ret = callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic static async timedExecAsync<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => Promise<T>,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t\trecordHeapSize?: boolean,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers, recordHeapSize);\n\t\ttry {\n\t\t\tconst ret = await callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic get duration() {\n\t\treturn performance.now() - this.startTime;\n\t}\n\n\tprivate event?: ITelemetryGenericEvent;\n\tprivate readonly startTime = performance.now();\n\tprivate startMark?: string;\n\tprivate startMemoryCollection: number | undefined = 0;\n\n\tprotected constructor(\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tprivate readonly markers: IPerformanceEventMarkers = { end: true, cancel: \"generic\" },\n\t\tprivate readonly recordHeapSize: boolean = false,\n\t) {\n\t\tthis.event = { ...event };\n\t\tif (this.markers.start) {\n\t\t\tthis.reportEvent(\"start\");\n\t\t}\n\n\t\tif (typeof window === \"object\" && window != null && window.performance?.mark) {\n\t\t\tthis.startMark = `${event.eventName}-start`;\n\t\t\twindow.performance.mark(this.startMark);\n\t\t}\n\t}\n\n\tpublic reportProgress(props?: ITelemetryProperties, eventNameSuffix: string = \"update\"): void {\n\t\tthis.reportEvent(eventNameSuffix, props);\n\t}\n\n\tprivate autoEnd() {\n\t\t// Event might have been cancelled or ended in the callback\n\t\tif (this.event && this.markers.end) {\n\t\t\tthis.reportEvent(\"end\");\n\t\t}\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tpublic end(props?: ITelemetryProperties): void {\n\t\tthis.reportEvent(\"end\", props);\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tprivate performanceEndMark() {\n\t\tif (this.startMark && this.event) {\n\t\t\tconst endMark = `${this.event.eventName}-end`;\n\t\t\twindow.performance.mark(endMark);\n\t\t\twindow.performance.measure(`${this.event.eventName}`, this.startMark, endMark);\n\t\t\tthis.startMark = undefined;\n\t\t}\n\t}\n\n\tpublic cancel(props?: ITelemetryProperties, error?: any): void {\n\t\tif (this.markers.cancel !== undefined) {\n\t\t\tthis.reportEvent(\"cancel\", { category: this.markers.cancel, ...props }, error);\n\t\t}\n\t\tthis.event = undefined;\n\t}\n\n\t/**\n\t * Report the event, if it hasn't already been reported.\n\t */\n\tpublic reportEvent(eventNameSuffix: string, props?: ITelemetryProperties, error?: any) {\n\t\t// There are strange sequences involving multiple Promise chains\n\t\t// where the event can be cancelled and then later a callback is invoked\n\t\t// and the caller attempts to end directly, e.g. issue #3936. Just return.\n\t\tif (!this.event) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst event: ITelemetryPerformanceEvent = { ...this.event, ...props };\n\t\tevent.eventName = `${event.eventName}_${eventNameSuffix}`;\n\t\tif (eventNameSuffix !== \"start\") {\n\t\t\tevent.duration = this.duration;\n\t\t\tif (this.startMemoryCollection) {\n\t\t\t\tconst currentMemory = (performance as PerformanceWithMemory)?.memory\n\t\t\t\t\t?.usedJSHeapSize;\n\t\t\t\tconst differenceInKBytes = Math.floor(\n\t\t\t\t\t(currentMemory - this.startMemoryCollection) / 1024,\n\t\t\t\t);\n\t\t\t\tif (differenceInKBytes > 0) {\n\t\t\t\t\tevent.usedJSHeapSize = differenceInKBytes;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.recordHeapSize) {\n\t\t\tthis.startMemoryCollection = (\n\t\t\t\tperformance as PerformanceWithMemory\n\t\t\t)?.memory?.usedJSHeapSize;\n\t\t}\n\n\t\tthis.logger.sendPerformanceEvent(event, error);\n\t}\n}\n\n/**\n * Logger that is useful for UT\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryUTLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any) {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.reportError(\"errorEvent in UT logger!\", event, error);\n\t}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n\tpublic logGenericError(eventName: string, error: any) {\n\t\tthis.reportError(`genericError in UT logger!`, { eventName }, error);\n\t}\n\tpublic logException(event: ITelemetryErrorEvent, exception: any): void {\n\t\tthis.reportError(\"exception in UT logger!\", event, exception);\n\t}\n\tpublic debugAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"debugAssert in UT logger!\");\n\t}\n\tpublic shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"shipAssert in UT logger!\");\n\t}\n\n\tprivate reportError(message: string, event?: ITelemetryErrorEvent, err?: any) {\n\t\tconst error = new Error(message);\n\t\t(error as any).error = error;\n\t\t(error as any).event = event;\n\t\t// report to console as exception can be eaten\n\t\tconsole.error(message);\n\t\tconsole.error(error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class BaseTelemetryNullLogger implements ITelemetryBaseLogger {\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\treturn;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryNullLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any): void {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any): void {}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n}\n\n/**\n * Takes in an event object, and converts all of its values to a basePropertyType.\n * In the case of an invalid property type, the value will be converted to an error string.\n * @param event - Event with fields you want to stringify.\n */\nfunction convertToBaseEvent({\n\tcategory,\n\teventName,\n\t...props\n}: ITelemetryEventExt): ITelemetryBaseEvent {\n\tconst newEvent: ITelemetryBaseEvent = { category, eventName };\n\tfor (const key of Object.keys(props)) {\n\t\tnewEvent[key] = convertToBasePropertyType(props[key]);\n\t}\n\treturn newEvent;\n}\n\n/**\n * Takes in value, and does one of 4 things.\n * if value is of primitive type - returns the original value.\n * If the value is an array of primitives - returns a stringified version of the array.\n * If the value is an object of type ITaggedTelemetryPropertyType - returns the object\n * with its values recursively converted to base property Type.\n * If none of these cases are reached - returns an error string\n * @param x - value passed in to convert to a base property type\n */\nexport function convertToBasePropertyType(\n\tx: TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,\n): TelemetryEventPropertyType | ITaggedTelemetryPropertyType {\n\treturn isTaggedTelemetryPropertyValue(x)\n\t\t? {\n\t\t\t\tvalue: convertToBasePropertyTypeUntagged(x.value),\n\t\t\t\ttag: x.tag,\n\t\t }\n\t\t: convertToBasePropertyTypeUntagged(x);\n}\n\nfunction convertToBasePropertyTypeUntagged(\n\tx: TelemetryEventPropertyTypeExt,\n): TelemetryEventPropertyType {\n\tswitch (typeof x) {\n\t\tcase \"string\":\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"undefined\":\n\t\t\treturn x;\n\t\tcase \"object\":\n\t\t\t// We assume this is an array or flat object based on the input types\n\t\t\treturn JSON.stringify(x);\n\t\tdefault:\n\t\t\t// should never reach this case based on the input types\n\t\t\tconsole.error(\n\t\t\t\t`convertToBasePropertyTypeUntagged: INVALID PROPERTY (typed as ${typeof x})`,\n\t\t\t);\n\t\t\treturn `INVALID PROPERTY (typed as ${typeof x})`;\n\t}\n}\n"]}
@@ -2,7 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IDisposable, ITelemetryGenericEvent, ITelemetryProperties } from "@fluidframework/common-definitions";
5
+ import { ITelemetryGenericEvent, ITelemetryProperties } from "@fluidframework/common-definitions";
6
+ import { IDisposable } from "@fluidframework/core-interfaces";
6
7
  import { ITelemetryLoggerExt } from "./telemetryTypes";
7
8
  /**
8
9
  * Helper class that executes a specified code block and writes an
@@ -1 +1 @@
1
- {"version":3,"file":"sampledTelemetryHelper.d.ts","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,WAAW,EACX,sBAAsB,EAEtB,oBAAoB,EACpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAiCvD;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,WAAW;IAwBxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IA3BrC,QAAQ,EAAE,OAAO,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IAEnE;;;;;;;;;;;;;;;;;OAiBG;gBAEe,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,mBAAmB,EAC3B,eAAe,EAAE,MAAM,EACvB,uBAAuB,GAAE,OAAe,EACxC,mBAAmB,oCAA0C;IAG/E;;;;;;;;OAQG;IACI,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAE,MAAW,GAAG,CAAC;IA0BjE,OAAO,CAAC,WAAW;IAoBZ,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI;CAG/C"}
1
+ {"version":3,"file":"sampledTelemetryHelper.d.ts","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,sBAAsB,EAEtB,oBAAoB,EACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAiCvD;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,WAAW;IAwBxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IA3BrC,QAAQ,EAAE,OAAO,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IAEnE;;;;;;;;;;;;;;;;;OAiBG;gBAEe,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,mBAAmB,EAC3B,eAAe,EAAE,MAAM,EACvB,uBAAuB,GAAE,OAAe,EACxC,mBAAmB,oCAA0C;IAG/E;;;;;;;;OAQG;IACI,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAE,MAAW,GAAG,CAAC;IA0BjE,OAAO,CAAC,WAAW;IAoBZ,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI;CAG/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"sampledTelemetryHelper.js","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,+DAA2D;AAkC3D;;;;;;GAMG;AACH,MAAa,sBAAsB;IAKlC;;;;;;;;;;;;;;;;;OAiBG;IACH,YACkB,SAAiC,EACjC,MAA2B,EAC3B,eAAuB,EACvB,0BAAmC,KAAK,EACxC,sBAAsB,IAAI,GAAG,EAAgC;QAJ7D,cAAS,GAAT,SAAS,CAAwB;QACjC,WAAM,GAAN,MAAM,CAAqB;QAC3B,oBAAe,GAAf,eAAe,CAAQ;QACvB,4BAAuB,GAAvB,uBAAuB,CAAiB;QACxC,wBAAmB,GAAnB,mBAAmB,CAA0C;QA3B/E,aAAQ,GAAY,KAAK,CAAC;QAET,oBAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IA0BhE,CAAC;IAEJ;;;;;;;;OAQG;IACI,OAAO,CAAI,aAAsB,EAAE,SAAiB,EAAE;;QAC5D,MAAM,KAAK,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,0BAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE3C,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,EAAE;YACpB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACpC;QACD,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEtB,IAAI,IAAI,CAAC,uBAAuB,EAAE;YACjC,CAAC,CAAC,aAAa,GAAG,CAAC,MAAA,CAAC,CAAC,aAAa,mCAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;YACpD,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9D,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;SACvD;QAED,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SACzB;QAED,OAAO,WAAW,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,MAAc;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC/B,OAAO;SACP;QAED,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,cAAc,iDAChB,IAAI,CAAC,SAAS,GACd,gBAAgB,GAChB,YAAY,CACf,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACpC;IACF,CAAC;IAEM,OAAO,CAAC,KAAyB;QACvC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;CACD;AAzFD,wDAyFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIDisposable,\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { ITelemetryLoggerExt } from \"./telemetryTypes\";\n\ninterface Measurements {\n\t// The names of the properties in this interface are the ones that will get stamped in the\n\t// telemetry event, changes should be considered carefully. The optional properties should\n\t// only be populated if 'includeAggregateMetrics' is true.\n\n\t/**\n\t * The duration of the latest execution.\n\t */\n\tduration: number;\n\n\t/**\n\t * The number of executions since the last time an event was generated.\n\t */\n\tcount: number;\n\n\t/**\n\t * Total duration across all the executions since the last event was generated.\n\t */\n\ttotalDuration?: number;\n\n\t/**\n\t * Min duration across all the executions since the last event was generated.\n\t */\n\tminDuration?: number;\n\n\t/**\n\t * Max duration across all the executions since the last event was generated.\n\t */\n\tmaxDuration?: number;\n}\n\n/**\n * Helper class that executes a specified code block and writes an\n * {@link @fluidframework/common-definitions#ITelemetryPerformanceEvent} to a specified logger every time a specified\n * number of executions is reached (or when the class is disposed). The `duration` field in the telemetry event is\n * the duration of the latest execution (sample) of the specified function. See the documentation of the\n * `includeAggregateMetrics` parameter for additional details that can be included.\n */\nexport class SampledTelemetryHelper implements IDisposable {\n\tdisposed: boolean = false;\n\n\tprivate readonly measurementsMap = new Map<string, Measurements>();\n\n\t/**\n\t * @param eventBase -\n\t * Custom properties to include in the telemetry performance event when it is written.\n\t * @param logger -\n\t * The logger to use to write the telemetry performance event.\n\t * @param sampleThreshold -\n\t * Telemetry performance events will be generated every time we hit this many executions of the code block.\n\t * @param includeAggregateMetrics -\n\t * If set to `true`, the telemetry performance event will include aggregated metrics (total duration, min duration,\n\t * max duration) for all the executions in between generated events.\n\t * @param perBucketProperties -\n\t * Map of strings that represent different buckets (which can be specified when calling the 'measure' method), to\n\t * properties which should be added to the telemetry event for that bucket. If a bucket being measured does not\n\t * have an entry in this map, no additional properties will be added to its telemetry events. The following keys are\n\t * reserved for use by this class: \"duration\", \"count\", \"totalDuration\", \"minDuration\", \"maxDuration\". If any of\n\t * them is specified as a key in one of the ITelemetryProperties objects in this map, that key-value pair will be\n\t * ignored.\n\t */\n\tpublic constructor(\n\t\tprivate readonly eventBase: ITelemetryGenericEvent,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly sampleThreshold: number,\n\t\tprivate readonly includeAggregateMetrics: boolean = false,\n\t\tprivate readonly perBucketProperties = new Map<string, ITelemetryProperties>(),\n\t) {}\n\n\t/**\n\t * @param codeToMeasure -\n\t * The code to be executed and measured.\n\t * @param bucket -\n\t * A key to track executions of the code block separately. Each different value of this parameter has a separate\n\t * set of executions and metrics tracked by the class. If no such distinction needs to be made, do not provide a\n\t * value.\n\t * @returns Whatever the passed-in code block returns.\n\t */\n\tpublic measure<T>(codeToMeasure: () => T, bucket: string = \"\"): T {\n\t\tconst start = performance.now();\n\t\tconst returnValue = codeToMeasure();\n\t\tconst duration = performance.now() - start;\n\n\t\tlet m = this.measurementsMap.get(bucket);\n\t\tif (m === undefined) {\n\t\t\tm = { count: 0, duration: -1 };\n\t\t\tthis.measurementsMap.set(bucket, m);\n\t\t}\n\t\tm.count++;\n\t\tm.duration = duration;\n\n\t\tif (this.includeAggregateMetrics) {\n\t\t\tm.totalDuration = (m.totalDuration ?? 0) + duration;\n\t\t\tm.minDuration = Math.min(m.minDuration ?? duration, duration);\n\t\t\tm.maxDuration = Math.max(m.maxDuration ?? 0, duration);\n\t\t}\n\n\t\tif (m.count >= this.sampleThreshold) {\n\t\t\tthis.flushBucket(bucket);\n\t\t}\n\n\t\treturn returnValue;\n\t}\n\n\tprivate flushBucket(bucket: string) {\n\t\tconst measurements = this.measurementsMap.get(bucket);\n\t\tif (measurements === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (measurements.count !== 0) {\n\t\t\tconst bucketProperties = this.perBucketProperties.get(bucket);\n\n\t\t\tconst telemetryEvent: ITelemetryPerformanceEvent = {\n\t\t\t\t...this.eventBase,\n\t\t\t\t...bucketProperties, // If the bucket doesn't exist and this is undefined, things work as expected\n\t\t\t\t...measurements,\n\t\t\t};\n\n\t\t\tthis.logger.sendPerformanceEvent(telemetryEvent);\n\t\t\tthis.measurementsMap.delete(bucket);\n\t\t}\n\t}\n\n\tpublic dispose(error?: Error | undefined): void {\n\t\tthis.measurementsMap.forEach((_, k) => this.flushBucket(k));\n\t}\n}\n"]}
1
+ {"version":3,"file":"sampledTelemetryHelper.js","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,+DAA2D;AAkC3D;;;;;;GAMG;AACH,MAAa,sBAAsB;IAKlC;;;;;;;;;;;;;;;;;OAiBG;IACH,YACkB,SAAiC,EACjC,MAA2B,EAC3B,eAAuB,EACvB,0BAAmC,KAAK,EACxC,sBAAsB,IAAI,GAAG,EAAgC;QAJ7D,cAAS,GAAT,SAAS,CAAwB;QACjC,WAAM,GAAN,MAAM,CAAqB;QAC3B,oBAAe,GAAf,eAAe,CAAQ;QACvB,4BAAuB,GAAvB,uBAAuB,CAAiB;QACxC,wBAAmB,GAAnB,mBAAmB,CAA0C;QA3B/E,aAAQ,GAAY,KAAK,CAAC;QAET,oBAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IA0BhE,CAAC;IAEJ;;;;;;;;OAQG;IACI,OAAO,CAAI,aAAsB,EAAE,SAAiB,EAAE;;QAC5D,MAAM,KAAK,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,0BAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE3C,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,EAAE;YACpB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACpC;QACD,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEtB,IAAI,IAAI,CAAC,uBAAuB,EAAE;YACjC,CAAC,CAAC,aAAa,GAAG,CAAC,MAAA,CAAC,CAAC,aAAa,mCAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;YACpD,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9D,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;SACvD;QAED,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SACzB;QAED,OAAO,WAAW,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,MAAc;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC/B,OAAO;SACP;QAED,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,cAAc,iDAChB,IAAI,CAAC,SAAS,GACd,gBAAgB,GAChB,YAAY,CACf,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACpC;IACF,CAAC;IAEM,OAAO,CAAC,KAAyB;QACvC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;CACD;AAzFD,wDAyFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { IDisposable } from \"@fluidframework/core-interfaces\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { ITelemetryLoggerExt } from \"./telemetryTypes\";\n\ninterface Measurements {\n\t// The names of the properties in this interface are the ones that will get stamped in the\n\t// telemetry event, changes should be considered carefully. The optional properties should\n\t// only be populated if 'includeAggregateMetrics' is true.\n\n\t/**\n\t * The duration of the latest execution.\n\t */\n\tduration: number;\n\n\t/**\n\t * The number of executions since the last time an event was generated.\n\t */\n\tcount: number;\n\n\t/**\n\t * Total duration across all the executions since the last event was generated.\n\t */\n\ttotalDuration?: number;\n\n\t/**\n\t * Min duration across all the executions since the last event was generated.\n\t */\n\tminDuration?: number;\n\n\t/**\n\t * Max duration across all the executions since the last event was generated.\n\t */\n\tmaxDuration?: number;\n}\n\n/**\n * Helper class that executes a specified code block and writes an\n * {@link @fluidframework/common-definitions#ITelemetryPerformanceEvent} to a specified logger every time a specified\n * number of executions is reached (or when the class is disposed). The `duration` field in the telemetry event is\n * the duration of the latest execution (sample) of the specified function. See the documentation of the\n * `includeAggregateMetrics` parameter for additional details that can be included.\n */\nexport class SampledTelemetryHelper implements IDisposable {\n\tdisposed: boolean = false;\n\n\tprivate readonly measurementsMap = new Map<string, Measurements>();\n\n\t/**\n\t * @param eventBase -\n\t * Custom properties to include in the telemetry performance event when it is written.\n\t * @param logger -\n\t * The logger to use to write the telemetry performance event.\n\t * @param sampleThreshold -\n\t * Telemetry performance events will be generated every time we hit this many executions of the code block.\n\t * @param includeAggregateMetrics -\n\t * If set to `true`, the telemetry performance event will include aggregated metrics (total duration, min duration,\n\t * max duration) for all the executions in between generated events.\n\t * @param perBucketProperties -\n\t * Map of strings that represent different buckets (which can be specified when calling the 'measure' method), to\n\t * properties which should be added to the telemetry event for that bucket. If a bucket being measured does not\n\t * have an entry in this map, no additional properties will be added to its telemetry events. The following keys are\n\t * reserved for use by this class: \"duration\", \"count\", \"totalDuration\", \"minDuration\", \"maxDuration\". If any of\n\t * them is specified as a key in one of the ITelemetryProperties objects in this map, that key-value pair will be\n\t * ignored.\n\t */\n\tpublic constructor(\n\t\tprivate readonly eventBase: ITelemetryGenericEvent,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly sampleThreshold: number,\n\t\tprivate readonly includeAggregateMetrics: boolean = false,\n\t\tprivate readonly perBucketProperties = new Map<string, ITelemetryProperties>(),\n\t) {}\n\n\t/**\n\t * @param codeToMeasure -\n\t * The code to be executed and measured.\n\t * @param bucket -\n\t * A key to track executions of the code block separately. Each different value of this parameter has a separate\n\t * set of executions and metrics tracked by the class. If no such distinction needs to be made, do not provide a\n\t * value.\n\t * @returns Whatever the passed-in code block returns.\n\t */\n\tpublic measure<T>(codeToMeasure: () => T, bucket: string = \"\"): T {\n\t\tconst start = performance.now();\n\t\tconst returnValue = codeToMeasure();\n\t\tconst duration = performance.now() - start;\n\n\t\tlet m = this.measurementsMap.get(bucket);\n\t\tif (m === undefined) {\n\t\t\tm = { count: 0, duration: -1 };\n\t\t\tthis.measurementsMap.set(bucket, m);\n\t\t}\n\t\tm.count++;\n\t\tm.duration = duration;\n\n\t\tif (this.includeAggregateMetrics) {\n\t\t\tm.totalDuration = (m.totalDuration ?? 0) + duration;\n\t\t\tm.minDuration = Math.min(m.minDuration ?? duration, duration);\n\t\t\tm.maxDuration = Math.max(m.maxDuration ?? 0, duration);\n\t\t}\n\n\t\tif (m.count >= this.sampleThreshold) {\n\t\t\tthis.flushBucket(bucket);\n\t\t}\n\n\t\treturn returnValue;\n\t}\n\n\tprivate flushBucket(bucket: string) {\n\t\tconst measurements = this.measurementsMap.get(bucket);\n\t\tif (measurements === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (measurements.count !== 0) {\n\t\t\tconst bucketProperties = this.perBucketProperties.get(bucket);\n\n\t\t\tconst telemetryEvent: ITelemetryPerformanceEvent = {\n\t\t\t\t...this.eventBase,\n\t\t\t\t...bucketProperties, // If the bucket doesn't exist and this is undefined, things work as expected\n\t\t\t\t...measurements,\n\t\t\t};\n\n\t\t\tthis.logger.sendPerformanceEvent(telemetryEvent);\n\t\t\tthis.measurementsMap.delete(bucket);\n\t\t}\n\t}\n\n\tpublic dispose(error?: Error | undefined): void {\n\t\tthis.measurementsMap.forEach((_, k) => this.flushBucket(k));\n\t}\n}\n"]}
package/lib/logger.d.ts CHANGED
@@ -3,7 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { ITelemetryBaseEvent, ITelemetryBaseLogger, ITelemetryErrorEvent, ITelemetryGenericEvent, ITelemetryPerformanceEvent, ITelemetryProperties, TelemetryEventPropertyType, ITaggedTelemetryPropertyType, TelemetryEventCategory } from "@fluidframework/common-definitions";
6
+ import { IsomorphicPerformance } from "@fluidframework/common-utils";
6
7
  import { ITaggedTelemetryPropertyTypeExt, ITelemetryGenericEventExt, ITelemetryLoggerExt, ITelemetryPerformanceEventExt, TelemetryEventPropertyTypeExt } from "./telemetryTypes";
8
+ export interface Memory {
9
+ usedJSHeapSize: number;
10
+ }
11
+ export interface PerformanceWithMemory extends IsomorphicPerformance {
12
+ readonly memory: Memory;
13
+ }
7
14
  /**
8
15
  * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.
9
16
  * Please do not modify existing entries for backwards compatibility.
@@ -161,14 +168,16 @@ export interface IPerformanceEventMarkers {
161
168
  export declare class PerformanceEvent {
162
169
  private readonly logger;
163
170
  private readonly markers;
164
- static start(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers): PerformanceEvent;
171
+ private readonly recordHeapSize;
172
+ static start(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers, recordHeapSize?: boolean): PerformanceEvent;
165
173
  static timedExec<T>(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, callback: (event: PerformanceEvent) => T, markers?: IPerformanceEventMarkers): T;
166
- static timedExecAsync<T>(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, callback: (event: PerformanceEvent) => Promise<T>, markers?: IPerformanceEventMarkers): Promise<T>;
174
+ static timedExecAsync<T>(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, callback: (event: PerformanceEvent) => Promise<T>, markers?: IPerformanceEventMarkers, recordHeapSize?: boolean): Promise<T>;
167
175
  get duration(): number;
168
176
  private event?;
169
177
  private readonly startTime;
170
178
  private startMark?;
171
- protected constructor(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers);
179
+ private startMemoryCollection;
180
+ protected constructor(logger: ITelemetryLoggerExt, event: ITelemetryGenericEvent, markers?: IPerformanceEventMarkers, recordHeapSize?: boolean);
172
181
  reportProgress(props?: ITelemetryProperties, eventNameSuffix?: string): void;
173
182
  private autoEnd;
174
183
  end(props?: ITelemetryProperties): void;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
package/lib/logger.js CHANGED
@@ -305,11 +305,13 @@ export class MultiSinkLogger extends TelemetryLogger {
305
305
  * Helper class to log performance events
306
306
  */
307
307
  export class PerformanceEvent {
308
- constructor(logger, event, markers = { end: true, cancel: "generic" }) {
308
+ constructor(logger, event, markers = { end: true, cancel: "generic" }, recordHeapSize = false) {
309
309
  var _a;
310
310
  this.logger = logger;
311
311
  this.markers = markers;
312
+ this.recordHeapSize = recordHeapSize;
312
313
  this.startTime = performance.now();
314
+ this.startMemoryCollection = 0;
313
315
  this.event = Object.assign({}, event);
314
316
  if (this.markers.start) {
315
317
  this.reportEvent("start");
@@ -319,8 +321,8 @@ export class PerformanceEvent {
319
321
  window.performance.mark(this.startMark);
320
322
  }
321
323
  }
322
- static start(logger, event, markers) {
323
- return new PerformanceEvent(logger, event, markers);
324
+ static start(logger, event, markers, recordHeapSize = false) {
325
+ return new PerformanceEvent(logger, event, markers, recordHeapSize);
324
326
  }
325
327
  static timedExec(logger, event, callback, markers) {
326
328
  const perfEvent = PerformanceEvent.start(logger, event, markers);
@@ -334,8 +336,8 @@ export class PerformanceEvent {
334
336
  throw error;
335
337
  }
336
338
  }
337
- static async timedExecAsync(logger, event, callback, markers) {
338
- const perfEvent = PerformanceEvent.start(logger, event, markers);
339
+ static async timedExecAsync(logger, event, callback, markers, recordHeapSize) {
340
+ const perfEvent = PerformanceEvent.start(logger, event, markers, recordHeapSize);
339
341
  try {
340
342
  const ret = await callback(perfEvent);
341
343
  perfEvent.autoEnd();
@@ -383,6 +385,7 @@ export class PerformanceEvent {
383
385
  * Report the event, if it hasn't already been reported.
384
386
  */
385
387
  reportEvent(eventNameSuffix, props, error) {
388
+ var _a, _b, _c, _d;
386
389
  // There are strange sequences involving multiple Promise chains
387
390
  // where the event can be cancelled and then later a callback is invoked
388
391
  // and the caller attempts to end directly, e.g. issue #3936. Just return.
@@ -393,6 +396,16 @@ export class PerformanceEvent {
393
396
  event.eventName = `${event.eventName}_${eventNameSuffix}`;
394
397
  if (eventNameSuffix !== "start") {
395
398
  event.duration = this.duration;
399
+ if (this.startMemoryCollection) {
400
+ const currentMemory = (_b = (_a = performance) === null || _a === void 0 ? void 0 : _a.memory) === null || _b === void 0 ? void 0 : _b.usedJSHeapSize;
401
+ const differenceInKBytes = Math.floor((currentMemory - this.startMemoryCollection) / 1024);
402
+ if (differenceInKBytes > 0) {
403
+ event.usedJSHeapSize = differenceInKBytes;
404
+ }
405
+ }
406
+ }
407
+ else if (this.recordHeapSize) {
408
+ this.startMemoryCollection = (_d = (_c = performance) === null || _c === void 0 ? void 0 : _c.memory) === null || _d === void 0 ? void 0 : _d.usedJSHeapSize;
396
409
  }
397
410
  this.logger.sendPerformanceEvent(event, error);
398
411
  }
package/lib/logger.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryErrorEvent,\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n\tTelemetryEventPropertyType,\n\tITaggedTelemetryPropertyType,\n\tTelemetryEventCategory,\n} from \"@fluidframework/common-definitions\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from \"./config\";\nimport {\n\tisILoggingError,\n\textractLogSafeErrorProperties,\n\tgenerateStack,\n\tisTaggedTelemetryPropertyValue,\n} from \"./errorLogging\";\nimport {\n\tITaggedTelemetryPropertyTypeExt,\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\tITelemetryPerformanceEventExt,\n\tTelemetryEventPropertyTypeExt,\n} from \"./telemetryTypes\";\n\n/**\n * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.\n * Please do not modify existing entries for backwards compatibility.\n */\nexport enum TelemetryDataTag {\n\t/** Data containing terms or IDs from code packages that may have been dynamically loaded */\n\tCodeArtifact = \"CodeArtifact\",\n\t/** Personal data of a variety of classifications that pertains to the user */\n\tUserData = \"UserData\",\n}\n\nexport type TelemetryEventPropertyTypes = TelemetryEventPropertyType | ITaggedTelemetryPropertyType;\n\nexport interface ITelemetryLoggerPropertyBag {\n\t[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);\n}\nexport interface ITelemetryLoggerPropertyBags {\n\tall?: ITelemetryLoggerPropertyBag;\n\terror?: ITelemetryLoggerPropertyBag;\n}\n\n/**\n * TelemetryLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport abstract class TelemetryLogger implements ITelemetryLoggerExt {\n\tpublic static readonly eventNamespaceSeparator = \":\";\n\n\tpublic static formatTick(tick: number): number {\n\t\treturn Math.floor(tick);\n\t}\n\n\t/**\n\t * Attempts to parse number from string.\n\t * If fails,returns original string.\n\t * Used to make telemetry data typed (and support math operations, like comparison),\n\t * in places where we do expect numbers (like contentsize/duration property in http header)\n\t */\n\tpublic static numberFromString(str: string | null | undefined): string | number | undefined {\n\t\tif (str === undefined || str === null) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst num = Number(str);\n\t\treturn Number.isNaN(num) ? str : num;\n\t}\n\n\tpublic static sanitizePkgName(name: string) {\n\t\treturn name.replace(\"@\", \"\").replace(\"/\", \"-\");\n\t}\n\n\t/**\n\t * Take an unknown error object and add the appropriate info from it to the event. Message and stack will be copied\n\t * over from the error object, along with other telemetry properties if it's an ILoggingError.\n\t * @param event - Event being logged\n\t * @param error - Error to extract info from\n\t * @param fetchStack - Whether to fetch the current callstack if error.stack is undefined\n\t */\n\tpublic static prepareErrorObject(event: ITelemetryBaseEvent, error: any, fetchStack: boolean) {\n\t\tconst { message, errorType, stack } = extractLogSafeErrorProperties(\n\t\t\terror,\n\t\t\ttrue /* sanitizeStack */,\n\t\t);\n\t\t// First, copy over error message, stack, and errorType directly (overwrite if present on event)\n\t\tevent.stack = stack;\n\t\tevent.error = message; // Note that the error message goes on the 'error' field\n\t\tevent.errorType = errorType;\n\n\t\tif (isILoggingError(error)) {\n\t\t\t// Add any other telemetry properties from the LoggingError\n\t\t\tconst telemetryProp = error.getTelemetryProperties();\n\t\t\tfor (const key of Object.keys(telemetryProp)) {\n\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t// Don't overwrite existing properties on the event\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tevent[key] = telemetryProp[key];\n\t\t\t}\n\t\t}\n\n\t\t// Collect stack if we were not able to extract it from error\n\t\tif (event.stack === undefined && fetchStack) {\n\t\t\tevent.stack = generateStack();\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tprotected readonly namespace?: string,\n\t\tprotected readonly properties?: ITelemetryLoggerPropertyBags,\n\t) {}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic abstract send(event: ITelemetryBaseEvent): void;\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEventExt, error?: any) {\n\t\tthis.sendTelemetryEventCore({ ...event, category: event.category ?? \"generic\" }, error);\n\t}\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tprotected sendTelemetryEventCore(\n\t\tevent: ITelemetryGenericEventExt & { category: TelemetryEventCategory },\n\t\terror?: any,\n\t) {\n\t\tconst newEvent = convertToBaseEvent(event);\n\t\tif (error !== undefined) {\n\t\t\tTelemetryLogger.prepareErrorObject(newEvent, error, false);\n\t\t}\n\n\t\t// Will include Nan & Infinity, but probably we do not care\n\t\tif (typeof newEvent.duration === \"number\") {\n\t\t\tnewEvent.duration = TelemetryLogger.formatTick(newEvent.duration);\n\t\t}\n\n\t\tthis.send(newEvent);\n\t}\n\n\t/**\n\t * Send an error telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.sendTelemetryEventCore(\n\t\t\t{\n\t\t\t\t// ensure the error field has some value,\n\t\t\t\t// this can and will be overridden by event, or error\n\t\t\t\terror: event.eventName,\n\t\t\t\t...event,\n\t\t\t\tcategory: \"error\",\n\t\t\t},\n\t\t\terror,\n\t\t);\n\t}\n\n\t/**\n\t * Send a performance telemetry event with the logger\n\t *\n\t * @param event - Event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEventExt, error?: any): void {\n\t\tconst perfEvent = {\n\t\t\t...event,\n\t\t\tcategory: event.category ?? \"performance\",\n\t\t};\n\n\t\tthis.sendTelemetryEventCore(perfEvent, error);\n\t}\n\n\tprotected prepareEvent(event: ITelemetryBaseEvent): ITelemetryBaseEvent {\n\t\tconst includeErrorProps = event.category === \"error\" || event.error !== undefined;\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\t...event,\n\t\t};\n\t\tif (this.namespace !== undefined) {\n\t\t\tnewEvent.eventName = `${this.namespace}${TelemetryLogger.eventNamespaceSeparator}${newEvent.eventName}`;\n\t\t}\n\t\tif (this.properties) {\n\t\t\tconst properties: (undefined | ITelemetryLoggerPropertyBag)[] = [];\n\t\t\tproperties.push(this.properties.all);\n\t\t\tif (includeErrorProps) {\n\t\t\t\tproperties.push(this.properties.error);\n\t\t\t}\n\t\t\tfor (const props of properties) {\n\t\t\t\tif (props !== undefined) {\n\t\t\t\t\tfor (const key of Object.keys(props)) {\n\t\t\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst getterOrValue = props[key];\n\t\t\t\t\t\t// If this throws, hopefully it is handled elsewhere\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof getterOrValue === \"function\" ? getterOrValue() : getterOrValue;\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn newEvent;\n\t}\n}\n\n/**\n * @deprecated 0.56, remove TaggedLoggerAdapter once its usage is removed from\n * container-runtime. Issue: #8191\n * TaggedLoggerAdapter class can add tag handling to your logger.\n */\nexport class TaggedLoggerAdapter implements ITelemetryBaseLogger {\n\tpublic constructor(private readonly logger: ITelemetryBaseLogger) {}\n\n\tpublic send(eventWithTagsMaybe: ITelemetryBaseEvent) {\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\tcategory: eventWithTagsMaybe.category,\n\t\t\teventName: eventWithTagsMaybe.eventName,\n\t\t};\n\t\tfor (const key of Object.keys(eventWithTagsMaybe)) {\n\t\t\tconst taggableProp = eventWithTagsMaybe[key];\n\t\t\tconst { value, tag } =\n\t\t\t\ttypeof taggableProp === \"object\"\n\t\t\t\t\t? taggableProp\n\t\t\t\t\t: { value: taggableProp, tag: undefined };\n\t\t\tswitch (tag) {\n\t\t\t\tcase undefined:\n\t\t\t\t\t// No tag means we can log plainly\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"PackageData\": // For back-compat\n\t\t\t\tcase TelemetryDataTag.CodeArtifact:\n\t\t\t\t\t// For Microsoft applications, CodeArtifact is safe for now\n\t\t\t\t\t// (we don't load 3P code in 1P apps)\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TelemetryDataTag.UserData:\n\t\t\t\t\t// Strip out anything tagged explicitly as UserData.\n\t\t\t\t\t// Alternate strategy would be to hash these props\n\t\t\t\t\tnewEvent[key] = \"REDACTED (UserData)\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// If we encounter a tag we don't recognize\n\t\t\t\t\t// then we must assume we should scrub.\n\t\t\t\t\tnewEvent[key] = \"REDACTED (unknown tag)\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.logger.send(newEvent);\n\t}\n}\n\n/**\n * ChildLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport class ChildLogger extends TelemetryLogger {\n\t/**\n\t * Create child logger\n\t * @param baseLogger - Base logger to use to output events. If undefined, proper child logger\n\t * is created, but it does not send telemetry events anywhere.\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tpublic static create(\n\t\tbaseLogger?: ITelemetryBaseLogger,\n\t\tnamespace?: string,\n\t\tproperties?: ITelemetryLoggerPropertyBags,\n\t): TelemetryLogger {\n\t\t// if we are creating a child of a child, rather than nest, which will increase\n\t\t// the callstack overhead, just generate a new logger that includes everything from the previous\n\t\tif (baseLogger instanceof ChildLogger) {\n\t\t\tconst combinedProperties: ITelemetryLoggerPropertyBags = {};\n\t\t\tfor (const extendedProps of [baseLogger.properties, properties]) {\n\t\t\t\tif (extendedProps !== undefined) {\n\t\t\t\t\tif (extendedProps.all !== undefined) {\n\t\t\t\t\t\tcombinedProperties.all = {\n\t\t\t\t\t\t\t...combinedProperties.all,\n\t\t\t\t\t\t\t...extendedProps.all,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (extendedProps.error !== undefined) {\n\t\t\t\t\t\tcombinedProperties.error = {\n\t\t\t\t\t\t\t...combinedProperties.error,\n\t\t\t\t\t\t\t...extendedProps.error,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst combinedNamespace =\n\t\t\t\tbaseLogger.namespace === undefined\n\t\t\t\t\t? namespace\n\t\t\t\t\t: namespace === undefined\n\t\t\t\t\t? baseLogger.namespace\n\t\t\t\t\t: `${baseLogger.namespace}${TelemetryLogger.eventNamespaceSeparator}${namespace}`;\n\n\t\t\treturn new ChildLogger(baseLogger.baseLogger, combinedNamespace, combinedProperties);\n\t\t}\n\n\t\treturn new ChildLogger(\n\t\t\tbaseLogger ? baseLogger : new BaseTelemetryNullLogger(),\n\t\t\tnamespace,\n\t\t\tproperties,\n\t\t);\n\t}\n\n\tprivate constructor(\n\t\tprotected readonly baseLogger: ITelemetryBaseLogger,\n\t\tnamespace: string | undefined,\n\t\tproperties: ITelemetryLoggerPropertyBags | undefined,\n\t) {\n\t\tsuper(namespace, properties);\n\n\t\t// propagate the monitoring context\n\t\tif (loggerIsMonitoringContext(baseLogger)) {\n\t\t\tmixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));\n\t\t}\n\t}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tthis.baseLogger.send(this.prepareEvent(event));\n\t}\n}\n\n/**\n * Multi-sink logger\n * Takes multiple ITelemetryBaseLogger objects (sinks) and logs all events into each sink\n */\nexport class MultiSinkLogger extends TelemetryLogger {\n\tprotected loggers: ITelemetryBaseLogger[] = [];\n\n\t/**\n\t * Create multiple sink logger (i.e. logger that sends events to multiple sinks)\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tconstructor(namespace?: string, properties?: ITelemetryLoggerPropertyBags) {\n\t\tsuper(namespace, properties);\n\t}\n\n\t/**\n\t * Add logger to send all events to\n\t * @param logger - Logger to add\n\t */\n\tpublic addLogger(logger?: ITelemetryBaseLogger) {\n\t\tif (logger !== undefined && logger !== null) {\n\t\t\tthis.loggers.push(logger);\n\t\t}\n\t}\n\n\t/**\n\t * Send an event to the loggers\n\t *\n\t * @param event - the event to send to all the registered logger\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tconst newEvent = this.prepareEvent(event);\n\t\tthis.loggers.forEach((logger: ITelemetryBaseLogger) => {\n\t\t\tlogger.send(newEvent);\n\t\t});\n\t}\n}\n\n/**\n * Describes what events PerformanceEvent should log\n * By default, all events are logged, but client can override this behavior\n * For example, there is rarely a need to record start event, as we really after\n * success / failure tracking, including duration (on success).\n */\nexport interface IPerformanceEventMarkers {\n\tstart?: true;\n\tend?: true;\n\tcancel?: \"generic\" | \"error\"; // tells wether to issue \"generic\" or \"error\" category cancel event\n}\n\n/**\n * Helper class to log performance events\n */\nexport class PerformanceEvent {\n\tpublic static start(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\treturn new PerformanceEvent(logger, event, markers);\n\t}\n\n\tpublic static timedExec<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => T,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers);\n\t\ttry {\n\t\t\tconst ret = callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic static async timedExecAsync<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => Promise<T>,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers);\n\t\ttry {\n\t\t\tconst ret = await callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic get duration() {\n\t\treturn performance.now() - this.startTime;\n\t}\n\n\tprivate event?: ITelemetryGenericEvent;\n\tprivate readonly startTime = performance.now();\n\tprivate startMark?: string;\n\n\tprotected constructor(\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tprivate readonly markers: IPerformanceEventMarkers = { end: true, cancel: \"generic\" },\n\t) {\n\t\tthis.event = { ...event };\n\t\tif (this.markers.start) {\n\t\t\tthis.reportEvent(\"start\");\n\t\t}\n\n\t\tif (typeof window === \"object\" && window != null && window.performance?.mark) {\n\t\t\tthis.startMark = `${event.eventName}-start`;\n\t\t\twindow.performance.mark(this.startMark);\n\t\t}\n\t}\n\n\tpublic reportProgress(props?: ITelemetryProperties, eventNameSuffix: string = \"update\"): void {\n\t\tthis.reportEvent(eventNameSuffix, props);\n\t}\n\n\tprivate autoEnd() {\n\t\t// Event might have been cancelled or ended in the callback\n\t\tif (this.event && this.markers.end) {\n\t\t\tthis.reportEvent(\"end\");\n\t\t}\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tpublic end(props?: ITelemetryProperties): void {\n\t\tthis.reportEvent(\"end\", props);\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tprivate performanceEndMark() {\n\t\tif (this.startMark && this.event) {\n\t\t\tconst endMark = `${this.event.eventName}-end`;\n\t\t\twindow.performance.mark(endMark);\n\t\t\twindow.performance.measure(`${this.event.eventName}`, this.startMark, endMark);\n\t\t\tthis.startMark = undefined;\n\t\t}\n\t}\n\n\tpublic cancel(props?: ITelemetryProperties, error?: any): void {\n\t\tif (this.markers.cancel !== undefined) {\n\t\t\tthis.reportEvent(\"cancel\", { category: this.markers.cancel, ...props }, error);\n\t\t}\n\t\tthis.event = undefined;\n\t}\n\n\t/**\n\t * Report the event, if it hasn't already been reported.\n\t */\n\tpublic reportEvent(eventNameSuffix: string, props?: ITelemetryProperties, error?: any) {\n\t\t// There are strange sequences involving multiple Promise chains\n\t\t// where the event can be cancelled and then later a callback is invoked\n\t\t// and the caller attempts to end directly, e.g. issue #3936. Just return.\n\t\tif (!this.event) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst event: ITelemetryPerformanceEvent = { ...this.event, ...props };\n\t\tevent.eventName = `${event.eventName}_${eventNameSuffix}`;\n\t\tif (eventNameSuffix !== \"start\") {\n\t\t\tevent.duration = this.duration;\n\t\t}\n\n\t\tthis.logger.sendPerformanceEvent(event, error);\n\t}\n}\n\n/**\n * Logger that is useful for UT\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryUTLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any) {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.reportError(\"errorEvent in UT logger!\", event, error);\n\t}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n\tpublic logGenericError(eventName: string, error: any) {\n\t\tthis.reportError(`genericError in UT logger!`, { eventName }, error);\n\t}\n\tpublic logException(event: ITelemetryErrorEvent, exception: any): void {\n\t\tthis.reportError(\"exception in UT logger!\", event, exception);\n\t}\n\tpublic debugAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"debugAssert in UT logger!\");\n\t}\n\tpublic shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"shipAssert in UT logger!\");\n\t}\n\n\tprivate reportError(message: string, event?: ITelemetryErrorEvent, err?: any) {\n\t\tconst error = new Error(message);\n\t\t(error as any).error = error;\n\t\t(error as any).event = event;\n\t\t// report to console as exception can be eaten\n\t\tconsole.error(message);\n\t\tconsole.error(error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class BaseTelemetryNullLogger implements ITelemetryBaseLogger {\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\treturn;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryNullLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any): void {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any): void {}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n}\n\n/**\n * Takes in an event object, and converts all of its values to a basePropertyType.\n * In the case of an invalid property type, the value will be converted to an error string.\n * @param event - Event with fields you want to stringify.\n */\nfunction convertToBaseEvent({\n\tcategory,\n\teventName,\n\t...props\n}: ITelemetryEventExt): ITelemetryBaseEvent {\n\tconst newEvent: ITelemetryBaseEvent = { category, eventName };\n\tfor (const key of Object.keys(props)) {\n\t\tnewEvent[key] = convertToBasePropertyType(props[key]);\n\t}\n\treturn newEvent;\n}\n\n/**\n * Takes in value, and does one of 4 things.\n * if value is of primitive type - returns the original value.\n * If the value is an array of primitives - returns a stringified version of the array.\n * If the value is an object of type ITaggedTelemetryPropertyType - returns the object\n * with its values recursively converted to base property Type.\n * If none of these cases are reached - returns an error string\n * @param x - value passed in to convert to a base property type\n */\nexport function convertToBasePropertyType(\n\tx: TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,\n): TelemetryEventPropertyType | ITaggedTelemetryPropertyType {\n\treturn isTaggedTelemetryPropertyValue(x)\n\t\t? {\n\t\t\t\tvalue: convertToBasePropertyTypeUntagged(x.value),\n\t\t\t\ttag: x.tag,\n\t\t }\n\t\t: convertToBasePropertyTypeUntagged(x);\n}\n\nfunction convertToBasePropertyTypeUntagged(\n\tx: TelemetryEventPropertyTypeExt,\n): TelemetryEventPropertyType {\n\tswitch (typeof x) {\n\t\tcase \"string\":\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"undefined\":\n\t\t\treturn x;\n\t\tcase \"object\":\n\t\t\t// We assume this is an array or flat object based on the input types\n\t\t\treturn JSON.stringify(x);\n\t\tdefault:\n\t\t\t// should never reach this case based on the input types\n\t\t\tconsole.error(\n\t\t\t\t`convertToBasePropertyTypeUntagged: INVALID PROPERTY (typed as ${typeof x})`,\n\t\t\t);\n\t\t\treturn `INVALID PROPERTY (typed as ${typeof x})`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryErrorEvent,\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n\tTelemetryEventPropertyType,\n\tITaggedTelemetryPropertyType,\n\tTelemetryEventCategory,\n} from \"@fluidframework/common-definitions\";\nimport { IsomorphicPerformance, performance } from \"@fluidframework/common-utils\";\nimport { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from \"./config\";\nimport {\n\tisILoggingError,\n\textractLogSafeErrorProperties,\n\tgenerateStack,\n\tisTaggedTelemetryPropertyValue,\n} from \"./errorLogging\";\nimport {\n\tITaggedTelemetryPropertyTypeExt,\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\tITelemetryPerformanceEventExt,\n\tTelemetryEventPropertyTypeExt,\n} from \"./telemetryTypes\";\n\nexport interface Memory {\n\tusedJSHeapSize: number;\n}\n\nexport interface PerformanceWithMemory extends IsomorphicPerformance {\n\treadonly memory: Memory;\n}\n/**\n * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.\n * Please do not modify existing entries for backwards compatibility.\n */\nexport enum TelemetryDataTag {\n\t/** Data containing terms or IDs from code packages that may have been dynamically loaded */\n\tCodeArtifact = \"CodeArtifact\",\n\t/** Personal data of a variety of classifications that pertains to the user */\n\tUserData = \"UserData\",\n}\n\nexport type TelemetryEventPropertyTypes = TelemetryEventPropertyType | ITaggedTelemetryPropertyType;\n\nexport interface ITelemetryLoggerPropertyBag {\n\t[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);\n}\nexport interface ITelemetryLoggerPropertyBags {\n\tall?: ITelemetryLoggerPropertyBag;\n\terror?: ITelemetryLoggerPropertyBag;\n}\n\n/**\n * TelemetryLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport abstract class TelemetryLogger implements ITelemetryLoggerExt {\n\tpublic static readonly eventNamespaceSeparator = \":\";\n\n\tpublic static formatTick(tick: number): number {\n\t\treturn Math.floor(tick);\n\t}\n\n\t/**\n\t * Attempts to parse number from string.\n\t * If fails,returns original string.\n\t * Used to make telemetry data typed (and support math operations, like comparison),\n\t * in places where we do expect numbers (like contentsize/duration property in http header)\n\t */\n\tpublic static numberFromString(str: string | null | undefined): string | number | undefined {\n\t\tif (str === undefined || str === null) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst num = Number(str);\n\t\treturn Number.isNaN(num) ? str : num;\n\t}\n\n\tpublic static sanitizePkgName(name: string) {\n\t\treturn name.replace(\"@\", \"\").replace(\"/\", \"-\");\n\t}\n\n\t/**\n\t * Take an unknown error object and add the appropriate info from it to the event. Message and stack will be copied\n\t * over from the error object, along with other telemetry properties if it's an ILoggingError.\n\t * @param event - Event being logged\n\t * @param error - Error to extract info from\n\t * @param fetchStack - Whether to fetch the current callstack if error.stack is undefined\n\t */\n\tpublic static prepareErrorObject(event: ITelemetryBaseEvent, error: any, fetchStack: boolean) {\n\t\tconst { message, errorType, stack } = extractLogSafeErrorProperties(\n\t\t\terror,\n\t\t\ttrue /* sanitizeStack */,\n\t\t);\n\t\t// First, copy over error message, stack, and errorType directly (overwrite if present on event)\n\t\tevent.stack = stack;\n\t\tevent.error = message; // Note that the error message goes on the 'error' field\n\t\tevent.errorType = errorType;\n\n\t\tif (isILoggingError(error)) {\n\t\t\t// Add any other telemetry properties from the LoggingError\n\t\t\tconst telemetryProp = error.getTelemetryProperties();\n\t\t\tfor (const key of Object.keys(telemetryProp)) {\n\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t// Don't overwrite existing properties on the event\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tevent[key] = telemetryProp[key];\n\t\t\t}\n\t\t}\n\n\t\t// Collect stack if we were not able to extract it from error\n\t\tif (event.stack === undefined && fetchStack) {\n\t\t\tevent.stack = generateStack();\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tprotected readonly namespace?: string,\n\t\tprotected readonly properties?: ITelemetryLoggerPropertyBags,\n\t) {}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic abstract send(event: ITelemetryBaseEvent): void;\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEventExt, error?: any) {\n\t\tthis.sendTelemetryEventCore({ ...event, category: event.category ?? \"generic\" }, error);\n\t}\n\n\t/**\n\t * Send a telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tprotected sendTelemetryEventCore(\n\t\tevent: ITelemetryGenericEventExt & { category: TelemetryEventCategory },\n\t\terror?: any,\n\t) {\n\t\tconst newEvent = convertToBaseEvent(event);\n\t\tif (error !== undefined) {\n\t\t\tTelemetryLogger.prepareErrorObject(newEvent, error, false);\n\t\t}\n\n\t\t// Will include Nan & Infinity, but probably we do not care\n\t\tif (typeof newEvent.duration === \"number\") {\n\t\t\tnewEvent.duration = TelemetryLogger.formatTick(newEvent.duration);\n\t\t}\n\n\t\tthis.send(newEvent);\n\t}\n\n\t/**\n\t * Send an error telemetry event with the logger\n\t *\n\t * @param event - the event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.sendTelemetryEventCore(\n\t\t\t{\n\t\t\t\t// ensure the error field has some value,\n\t\t\t\t// this can and will be overridden by event, or error\n\t\t\t\terror: event.eventName,\n\t\t\t\t...event,\n\t\t\t\tcategory: \"error\",\n\t\t\t},\n\t\t\terror,\n\t\t);\n\t}\n\n\t/**\n\t * Send a performance telemetry event with the logger\n\t *\n\t * @param event - Event to send\n\t * @param error - optional error object to log\n\t */\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEventExt, error?: any): void {\n\t\tconst perfEvent = {\n\t\t\t...event,\n\t\t\tcategory: event.category ?? \"performance\",\n\t\t};\n\n\t\tthis.sendTelemetryEventCore(perfEvent, error);\n\t}\n\n\tprotected prepareEvent(event: ITelemetryBaseEvent): ITelemetryBaseEvent {\n\t\tconst includeErrorProps = event.category === \"error\" || event.error !== undefined;\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\t...event,\n\t\t};\n\t\tif (this.namespace !== undefined) {\n\t\t\tnewEvent.eventName = `${this.namespace}${TelemetryLogger.eventNamespaceSeparator}${newEvent.eventName}`;\n\t\t}\n\t\tif (this.properties) {\n\t\t\tconst properties: (undefined | ITelemetryLoggerPropertyBag)[] = [];\n\t\t\tproperties.push(this.properties.all);\n\t\t\tif (includeErrorProps) {\n\t\t\t\tproperties.push(this.properties.error);\n\t\t\t}\n\t\t\tfor (const props of properties) {\n\t\t\t\tif (props !== undefined) {\n\t\t\t\t\tfor (const key of Object.keys(props)) {\n\t\t\t\t\t\tif (event[key] !== undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst getterOrValue = props[key];\n\t\t\t\t\t\t// If this throws, hopefully it is handled elsewhere\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof getterOrValue === \"function\" ? getterOrValue() : getterOrValue;\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn newEvent;\n\t}\n}\n\n/**\n * @deprecated 0.56, remove TaggedLoggerAdapter once its usage is removed from\n * container-runtime. Issue: #8191\n * TaggedLoggerAdapter class can add tag handling to your logger.\n */\nexport class TaggedLoggerAdapter implements ITelemetryBaseLogger {\n\tpublic constructor(private readonly logger: ITelemetryBaseLogger) {}\n\n\tpublic send(eventWithTagsMaybe: ITelemetryBaseEvent) {\n\t\tconst newEvent: ITelemetryBaseEvent = {\n\t\t\tcategory: eventWithTagsMaybe.category,\n\t\t\teventName: eventWithTagsMaybe.eventName,\n\t\t};\n\t\tfor (const key of Object.keys(eventWithTagsMaybe)) {\n\t\t\tconst taggableProp = eventWithTagsMaybe[key];\n\t\t\tconst { value, tag } =\n\t\t\t\ttypeof taggableProp === \"object\"\n\t\t\t\t\t? taggableProp\n\t\t\t\t\t: { value: taggableProp, tag: undefined };\n\t\t\tswitch (tag) {\n\t\t\t\tcase undefined:\n\t\t\t\t\t// No tag means we can log plainly\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"PackageData\": // For back-compat\n\t\t\t\tcase TelemetryDataTag.CodeArtifact:\n\t\t\t\t\t// For Microsoft applications, CodeArtifact is safe for now\n\t\t\t\t\t// (we don't load 3P code in 1P apps)\n\t\t\t\t\tnewEvent[key] = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TelemetryDataTag.UserData:\n\t\t\t\t\t// Strip out anything tagged explicitly as UserData.\n\t\t\t\t\t// Alternate strategy would be to hash these props\n\t\t\t\t\tnewEvent[key] = \"REDACTED (UserData)\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// If we encounter a tag we don't recognize\n\t\t\t\t\t// then we must assume we should scrub.\n\t\t\t\t\tnewEvent[key] = \"REDACTED (unknown tag)\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.logger.send(newEvent);\n\t}\n}\n\n/**\n * ChildLogger class contains various helper telemetry methods,\n * encoding in one place schemas for various types of Fluid telemetry events.\n * Creates sub-logger that appends properties to all events\n */\nexport class ChildLogger extends TelemetryLogger {\n\t/**\n\t * Create child logger\n\t * @param baseLogger - Base logger to use to output events. If undefined, proper child logger\n\t * is created, but it does not send telemetry events anywhere.\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tpublic static create(\n\t\tbaseLogger?: ITelemetryBaseLogger,\n\t\tnamespace?: string,\n\t\tproperties?: ITelemetryLoggerPropertyBags,\n\t): TelemetryLogger {\n\t\t// if we are creating a child of a child, rather than nest, which will increase\n\t\t// the callstack overhead, just generate a new logger that includes everything from the previous\n\t\tif (baseLogger instanceof ChildLogger) {\n\t\t\tconst combinedProperties: ITelemetryLoggerPropertyBags = {};\n\t\t\tfor (const extendedProps of [baseLogger.properties, properties]) {\n\t\t\t\tif (extendedProps !== undefined) {\n\t\t\t\t\tif (extendedProps.all !== undefined) {\n\t\t\t\t\t\tcombinedProperties.all = {\n\t\t\t\t\t\t\t...combinedProperties.all,\n\t\t\t\t\t\t\t...extendedProps.all,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (extendedProps.error !== undefined) {\n\t\t\t\t\t\tcombinedProperties.error = {\n\t\t\t\t\t\t\t...combinedProperties.error,\n\t\t\t\t\t\t\t...extendedProps.error,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst combinedNamespace =\n\t\t\t\tbaseLogger.namespace === undefined\n\t\t\t\t\t? namespace\n\t\t\t\t\t: namespace === undefined\n\t\t\t\t\t? baseLogger.namespace\n\t\t\t\t\t: `${baseLogger.namespace}${TelemetryLogger.eventNamespaceSeparator}${namespace}`;\n\n\t\t\treturn new ChildLogger(baseLogger.baseLogger, combinedNamespace, combinedProperties);\n\t\t}\n\n\t\treturn new ChildLogger(\n\t\t\tbaseLogger ? baseLogger : new BaseTelemetryNullLogger(),\n\t\t\tnamespace,\n\t\t\tproperties,\n\t\t);\n\t}\n\n\tprivate constructor(\n\t\tprotected readonly baseLogger: ITelemetryBaseLogger,\n\t\tnamespace: string | undefined,\n\t\tproperties: ITelemetryLoggerPropertyBags | undefined,\n\t) {\n\t\tsuper(namespace, properties);\n\n\t\t// propagate the monitoring context\n\t\tif (loggerIsMonitoringContext(baseLogger)) {\n\t\t\tmixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));\n\t\t}\n\t}\n\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tthis.baseLogger.send(this.prepareEvent(event));\n\t}\n}\n\n/**\n * Multi-sink logger\n * Takes multiple ITelemetryBaseLogger objects (sinks) and logs all events into each sink\n */\nexport class MultiSinkLogger extends TelemetryLogger {\n\tprotected loggers: ITelemetryBaseLogger[] = [];\n\n\t/**\n\t * Create multiple sink logger (i.e. logger that sends events to multiple sinks)\n\t * @param namespace - Telemetry event name prefix to add to all events\n\t * @param properties - Base properties to add to all events\n\t */\n\tconstructor(namespace?: string, properties?: ITelemetryLoggerPropertyBags) {\n\t\tsuper(namespace, properties);\n\t}\n\n\t/**\n\t * Add logger to send all events to\n\t * @param logger - Logger to add\n\t */\n\tpublic addLogger(logger?: ITelemetryBaseLogger) {\n\t\tif (logger !== undefined && logger !== null) {\n\t\t\tthis.loggers.push(logger);\n\t\t}\n\t}\n\n\t/**\n\t * Send an event to the loggers\n\t *\n\t * @param event - the event to send to all the registered logger\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tconst newEvent = this.prepareEvent(event);\n\t\tthis.loggers.forEach((logger: ITelemetryBaseLogger) => {\n\t\t\tlogger.send(newEvent);\n\t\t});\n\t}\n}\n\n/**\n * Describes what events PerformanceEvent should log\n * By default, all events are logged, but client can override this behavior\n * For example, there is rarely a need to record start event, as we really after\n * success / failure tracking, including duration (on success).\n */\nexport interface IPerformanceEventMarkers {\n\tstart?: true;\n\tend?: true;\n\tcancel?: \"generic\" | \"error\"; // tells wether to issue \"generic\" or \"error\" category cancel event\n}\n\n/**\n * Helper class to log performance events\n */\nexport class PerformanceEvent {\n\tpublic static start(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t\trecordHeapSize: boolean = false,\n\t) {\n\t\treturn new PerformanceEvent(logger, event, markers, recordHeapSize);\n\t}\n\n\tpublic static timedExec<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => T,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers);\n\t\ttry {\n\t\t\tconst ret = callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic static async timedExecAsync<T>(\n\t\tlogger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tcallback: (event: PerformanceEvent) => Promise<T>,\n\t\tmarkers?: IPerformanceEventMarkers,\n\t\trecordHeapSize?: boolean,\n\t) {\n\t\tconst perfEvent = PerformanceEvent.start(logger, event, markers, recordHeapSize);\n\t\ttry {\n\t\t\tconst ret = await callback(perfEvent);\n\t\t\tperfEvent.autoEnd();\n\t\t\treturn ret;\n\t\t} catch (error) {\n\t\t\tperfEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic get duration() {\n\t\treturn performance.now() - this.startTime;\n\t}\n\n\tprivate event?: ITelemetryGenericEvent;\n\tprivate readonly startTime = performance.now();\n\tprivate startMark?: string;\n\tprivate startMemoryCollection: number | undefined = 0;\n\n\tprotected constructor(\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tevent: ITelemetryGenericEvent,\n\t\tprivate readonly markers: IPerformanceEventMarkers = { end: true, cancel: \"generic\" },\n\t\tprivate readonly recordHeapSize: boolean = false,\n\t) {\n\t\tthis.event = { ...event };\n\t\tif (this.markers.start) {\n\t\t\tthis.reportEvent(\"start\");\n\t\t}\n\n\t\tif (typeof window === \"object\" && window != null && window.performance?.mark) {\n\t\t\tthis.startMark = `${event.eventName}-start`;\n\t\t\twindow.performance.mark(this.startMark);\n\t\t}\n\t}\n\n\tpublic reportProgress(props?: ITelemetryProperties, eventNameSuffix: string = \"update\"): void {\n\t\tthis.reportEvent(eventNameSuffix, props);\n\t}\n\n\tprivate autoEnd() {\n\t\t// Event might have been cancelled or ended in the callback\n\t\tif (this.event && this.markers.end) {\n\t\t\tthis.reportEvent(\"end\");\n\t\t}\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tpublic end(props?: ITelemetryProperties): void {\n\t\tthis.reportEvent(\"end\", props);\n\t\tthis.performanceEndMark();\n\t\tthis.event = undefined;\n\t}\n\n\tprivate performanceEndMark() {\n\t\tif (this.startMark && this.event) {\n\t\t\tconst endMark = `${this.event.eventName}-end`;\n\t\t\twindow.performance.mark(endMark);\n\t\t\twindow.performance.measure(`${this.event.eventName}`, this.startMark, endMark);\n\t\t\tthis.startMark = undefined;\n\t\t}\n\t}\n\n\tpublic cancel(props?: ITelemetryProperties, error?: any): void {\n\t\tif (this.markers.cancel !== undefined) {\n\t\t\tthis.reportEvent(\"cancel\", { category: this.markers.cancel, ...props }, error);\n\t\t}\n\t\tthis.event = undefined;\n\t}\n\n\t/**\n\t * Report the event, if it hasn't already been reported.\n\t */\n\tpublic reportEvent(eventNameSuffix: string, props?: ITelemetryProperties, error?: any) {\n\t\t// There are strange sequences involving multiple Promise chains\n\t\t// where the event can be cancelled and then later a callback is invoked\n\t\t// and the caller attempts to end directly, e.g. issue #3936. Just return.\n\t\tif (!this.event) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst event: ITelemetryPerformanceEvent = { ...this.event, ...props };\n\t\tevent.eventName = `${event.eventName}_${eventNameSuffix}`;\n\t\tif (eventNameSuffix !== \"start\") {\n\t\t\tevent.duration = this.duration;\n\t\t\tif (this.startMemoryCollection) {\n\t\t\t\tconst currentMemory = (performance as PerformanceWithMemory)?.memory\n\t\t\t\t\t?.usedJSHeapSize;\n\t\t\t\tconst differenceInKBytes = Math.floor(\n\t\t\t\t\t(currentMemory - this.startMemoryCollection) / 1024,\n\t\t\t\t);\n\t\t\t\tif (differenceInKBytes > 0) {\n\t\t\t\t\tevent.usedJSHeapSize = differenceInKBytes;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.recordHeapSize) {\n\t\t\tthis.startMemoryCollection = (\n\t\t\t\tperformance as PerformanceWithMemory\n\t\t\t)?.memory?.usedJSHeapSize;\n\t\t}\n\n\t\tthis.logger.sendPerformanceEvent(event, error);\n\t}\n}\n\n/**\n * Logger that is useful for UT\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryUTLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any) {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any) {\n\t\tthis.reportError(\"errorEvent in UT logger!\", event, error);\n\t}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n\tpublic logGenericError(eventName: string, error: any) {\n\t\tthis.reportError(`genericError in UT logger!`, { eventName }, error);\n\t}\n\tpublic logException(event: ITelemetryErrorEvent, exception: any): void {\n\t\tthis.reportError(\"exception in UT logger!\", event, exception);\n\t}\n\tpublic debugAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"debugAssert in UT logger!\");\n\t}\n\tpublic shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void {\n\t\tthis.reportError(\"shipAssert in UT logger!\");\n\t}\n\n\tprivate reportError(message: string, event?: ITelemetryErrorEvent, err?: any) {\n\t\tconst error = new Error(message);\n\t\t(error as any).error = error;\n\t\t(error as any).event = event;\n\t\t// report to console as exception can be eaten\n\t\tconsole.error(message);\n\t\tconsole.error(error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class BaseTelemetryNullLogger implements ITelemetryBaseLogger {\n\t/**\n\t * Send an event with the logger\n\t *\n\t * @param event - the event to send\n\t */\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\treturn;\n\t}\n}\n\n/**\n * Null logger\n * It can be used in places where logger instance is required, but events should be not send over.\n */\nexport class TelemetryNullLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any): void {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: any): void {}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void {}\n}\n\n/**\n * Takes in an event object, and converts all of its values to a basePropertyType.\n * In the case of an invalid property type, the value will be converted to an error string.\n * @param event - Event with fields you want to stringify.\n */\nfunction convertToBaseEvent({\n\tcategory,\n\teventName,\n\t...props\n}: ITelemetryEventExt): ITelemetryBaseEvent {\n\tconst newEvent: ITelemetryBaseEvent = { category, eventName };\n\tfor (const key of Object.keys(props)) {\n\t\tnewEvent[key] = convertToBasePropertyType(props[key]);\n\t}\n\treturn newEvent;\n}\n\n/**\n * Takes in value, and does one of 4 things.\n * if value is of primitive type - returns the original value.\n * If the value is an array of primitives - returns a stringified version of the array.\n * If the value is an object of type ITaggedTelemetryPropertyType - returns the object\n * with its values recursively converted to base property Type.\n * If none of these cases are reached - returns an error string\n * @param x - value passed in to convert to a base property type\n */\nexport function convertToBasePropertyType(\n\tx: TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,\n): TelemetryEventPropertyType | ITaggedTelemetryPropertyType {\n\treturn isTaggedTelemetryPropertyValue(x)\n\t\t? {\n\t\t\t\tvalue: convertToBasePropertyTypeUntagged(x.value),\n\t\t\t\ttag: x.tag,\n\t\t }\n\t\t: convertToBasePropertyTypeUntagged(x);\n}\n\nfunction convertToBasePropertyTypeUntagged(\n\tx: TelemetryEventPropertyTypeExt,\n): TelemetryEventPropertyType {\n\tswitch (typeof x) {\n\t\tcase \"string\":\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"undefined\":\n\t\t\treturn x;\n\t\tcase \"object\":\n\t\t\t// We assume this is an array or flat object based on the input types\n\t\t\treturn JSON.stringify(x);\n\t\tdefault:\n\t\t\t// should never reach this case based on the input types\n\t\t\tconsole.error(\n\t\t\t\t`convertToBasePropertyTypeUntagged: INVALID PROPERTY (typed as ${typeof x})`,\n\t\t\t);\n\t\t\treturn `INVALID PROPERTY (typed as ${typeof x})`;\n\t}\n}\n"]}
@@ -2,7 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IDisposable, ITelemetryGenericEvent, ITelemetryProperties } from "@fluidframework/common-definitions";
5
+ import { ITelemetryGenericEvent, ITelemetryProperties } from "@fluidframework/common-definitions";
6
+ import { IDisposable } from "@fluidframework/core-interfaces";
6
7
  import { ITelemetryLoggerExt } from "./telemetryTypes";
7
8
  /**
8
9
  * Helper class that executes a specified code block and writes an
@@ -1 +1 @@
1
- {"version":3,"file":"sampledTelemetryHelper.d.ts","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,WAAW,EACX,sBAAsB,EAEtB,oBAAoB,EACpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAiCvD;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,WAAW;IAwBxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IA3BrC,QAAQ,EAAE,OAAO,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IAEnE;;;;;;;;;;;;;;;;;OAiBG;gBAEe,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,mBAAmB,EAC3B,eAAe,EAAE,MAAM,EACvB,uBAAuB,GAAE,OAAe,EACxC,mBAAmB,oCAA0C;IAG/E;;;;;;;;OAQG;IACI,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAE,MAAW,GAAG,CAAC;IA0BjE,OAAO,CAAC,WAAW;IAoBZ,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI;CAG/C"}
1
+ {"version":3,"file":"sampledTelemetryHelper.d.ts","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,sBAAsB,EAEtB,oBAAoB,EACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAiCvD;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,WAAW;IAwBxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IA3BrC,QAAQ,EAAE,OAAO,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IAEnE;;;;;;;;;;;;;;;;;OAiBG;gBAEe,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,mBAAmB,EAC3B,eAAe,EAAE,MAAM,EACvB,uBAAuB,GAAE,OAAe,EACxC,mBAAmB,oCAA0C;IAG/E;;;;;;;;OAQG;IACI,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAE,MAAW,GAAG,CAAC;IA0BjE,OAAO,CAAC,WAAW;IAoBZ,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI;CAG/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"sampledTelemetryHelper.js","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAkC3D;;;;;;GAMG;AACH,MAAM,OAAO,sBAAsB;IAKlC;;;;;;;;;;;;;;;;;OAiBG;IACH,YACkB,SAAiC,EACjC,MAA2B,EAC3B,eAAuB,EACvB,0BAAmC,KAAK,EACxC,sBAAsB,IAAI,GAAG,EAAgC;QAJ7D,cAAS,GAAT,SAAS,CAAwB;QACjC,WAAM,GAAN,MAAM,CAAqB;QAC3B,oBAAe,GAAf,eAAe,CAAQ;QACvB,4BAAuB,GAAvB,uBAAuB,CAAiB;QACxC,wBAAmB,GAAnB,mBAAmB,CAA0C;QA3B/E,aAAQ,GAAY,KAAK,CAAC;QAET,oBAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IA0BhE,CAAC;IAEJ;;;;;;;;OAQG;IACI,OAAO,CAAI,aAAsB,EAAE,SAAiB,EAAE;;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE3C,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,EAAE;YACpB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACpC;QACD,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEtB,IAAI,IAAI,CAAC,uBAAuB,EAAE;YACjC,CAAC,CAAC,aAAa,GAAG,CAAC,MAAA,CAAC,CAAC,aAAa,mCAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;YACpD,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9D,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;SACvD;QAED,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SACzB;QAED,OAAO,WAAW,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,MAAc;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC/B,OAAO;SACP;QAED,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,cAAc,iDAChB,IAAI,CAAC,SAAS,GACd,gBAAgB,GAChB,YAAY,CACf,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACpC;IACF,CAAC;IAEM,OAAO,CAAC,KAAyB;QACvC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIDisposable,\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { ITelemetryLoggerExt } from \"./telemetryTypes\";\n\ninterface Measurements {\n\t// The names of the properties in this interface are the ones that will get stamped in the\n\t// telemetry event, changes should be considered carefully. The optional properties should\n\t// only be populated if 'includeAggregateMetrics' is true.\n\n\t/**\n\t * The duration of the latest execution.\n\t */\n\tduration: number;\n\n\t/**\n\t * The number of executions since the last time an event was generated.\n\t */\n\tcount: number;\n\n\t/**\n\t * Total duration across all the executions since the last event was generated.\n\t */\n\ttotalDuration?: number;\n\n\t/**\n\t * Min duration across all the executions since the last event was generated.\n\t */\n\tminDuration?: number;\n\n\t/**\n\t * Max duration across all the executions since the last event was generated.\n\t */\n\tmaxDuration?: number;\n}\n\n/**\n * Helper class that executes a specified code block and writes an\n * {@link @fluidframework/common-definitions#ITelemetryPerformanceEvent} to a specified logger every time a specified\n * number of executions is reached (or when the class is disposed). The `duration` field in the telemetry event is\n * the duration of the latest execution (sample) of the specified function. See the documentation of the\n * `includeAggregateMetrics` parameter for additional details that can be included.\n */\nexport class SampledTelemetryHelper implements IDisposable {\n\tdisposed: boolean = false;\n\n\tprivate readonly measurementsMap = new Map<string, Measurements>();\n\n\t/**\n\t * @param eventBase -\n\t * Custom properties to include in the telemetry performance event when it is written.\n\t * @param logger -\n\t * The logger to use to write the telemetry performance event.\n\t * @param sampleThreshold -\n\t * Telemetry performance events will be generated every time we hit this many executions of the code block.\n\t * @param includeAggregateMetrics -\n\t * If set to `true`, the telemetry performance event will include aggregated metrics (total duration, min duration,\n\t * max duration) for all the executions in between generated events.\n\t * @param perBucketProperties -\n\t * Map of strings that represent different buckets (which can be specified when calling the 'measure' method), to\n\t * properties which should be added to the telemetry event for that bucket. If a bucket being measured does not\n\t * have an entry in this map, no additional properties will be added to its telemetry events. The following keys are\n\t * reserved for use by this class: \"duration\", \"count\", \"totalDuration\", \"minDuration\", \"maxDuration\". If any of\n\t * them is specified as a key in one of the ITelemetryProperties objects in this map, that key-value pair will be\n\t * ignored.\n\t */\n\tpublic constructor(\n\t\tprivate readonly eventBase: ITelemetryGenericEvent,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly sampleThreshold: number,\n\t\tprivate readonly includeAggregateMetrics: boolean = false,\n\t\tprivate readonly perBucketProperties = new Map<string, ITelemetryProperties>(),\n\t) {}\n\n\t/**\n\t * @param codeToMeasure -\n\t * The code to be executed and measured.\n\t * @param bucket -\n\t * A key to track executions of the code block separately. Each different value of this parameter has a separate\n\t * set of executions and metrics tracked by the class. If no such distinction needs to be made, do not provide a\n\t * value.\n\t * @returns Whatever the passed-in code block returns.\n\t */\n\tpublic measure<T>(codeToMeasure: () => T, bucket: string = \"\"): T {\n\t\tconst start = performance.now();\n\t\tconst returnValue = codeToMeasure();\n\t\tconst duration = performance.now() - start;\n\n\t\tlet m = this.measurementsMap.get(bucket);\n\t\tif (m === undefined) {\n\t\t\tm = { count: 0, duration: -1 };\n\t\t\tthis.measurementsMap.set(bucket, m);\n\t\t}\n\t\tm.count++;\n\t\tm.duration = duration;\n\n\t\tif (this.includeAggregateMetrics) {\n\t\t\tm.totalDuration = (m.totalDuration ?? 0) + duration;\n\t\t\tm.minDuration = Math.min(m.minDuration ?? duration, duration);\n\t\t\tm.maxDuration = Math.max(m.maxDuration ?? 0, duration);\n\t\t}\n\n\t\tif (m.count >= this.sampleThreshold) {\n\t\t\tthis.flushBucket(bucket);\n\t\t}\n\n\t\treturn returnValue;\n\t}\n\n\tprivate flushBucket(bucket: string) {\n\t\tconst measurements = this.measurementsMap.get(bucket);\n\t\tif (measurements === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (measurements.count !== 0) {\n\t\t\tconst bucketProperties = this.perBucketProperties.get(bucket);\n\n\t\t\tconst telemetryEvent: ITelemetryPerformanceEvent = {\n\t\t\t\t...this.eventBase,\n\t\t\t\t...bucketProperties, // If the bucket doesn't exist and this is undefined, things work as expected\n\t\t\t\t...measurements,\n\t\t\t};\n\n\t\t\tthis.logger.sendPerformanceEvent(telemetryEvent);\n\t\t\tthis.measurementsMap.delete(bucket);\n\t\t}\n\t}\n\n\tpublic dispose(error?: Error | undefined): void {\n\t\tthis.measurementsMap.forEach((_, k) => this.flushBucket(k));\n\t}\n}\n"]}
1
+ {"version":3,"file":"sampledTelemetryHelper.js","sourceRoot":"","sources":["../src/sampledTelemetryHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAkC3D;;;;;;GAMG;AACH,MAAM,OAAO,sBAAsB;IAKlC;;;;;;;;;;;;;;;;;OAiBG;IACH,YACkB,SAAiC,EACjC,MAA2B,EAC3B,eAAuB,EACvB,0BAAmC,KAAK,EACxC,sBAAsB,IAAI,GAAG,EAAgC;QAJ7D,cAAS,GAAT,SAAS,CAAwB;QACjC,WAAM,GAAN,MAAM,CAAqB;QAC3B,oBAAe,GAAf,eAAe,CAAQ;QACvB,4BAAuB,GAAvB,uBAAuB,CAAiB;QACxC,wBAAmB,GAAnB,mBAAmB,CAA0C;QA3B/E,aAAQ,GAAY,KAAK,CAAC;QAET,oBAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IA0BhE,CAAC;IAEJ;;;;;;;;OAQG;IACI,OAAO,CAAI,aAAsB,EAAE,SAAiB,EAAE;;QAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE3C,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,EAAE;YACpB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACpC;QACD,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEtB,IAAI,IAAI,CAAC,uBAAuB,EAAE;YACjC,CAAC,CAAC,aAAa,GAAG,CAAC,MAAA,CAAC,CAAC,aAAa,mCAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;YACpD,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9D,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,WAAW,mCAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;SACvD;QAED,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SACzB;QAED,OAAO,WAAW,CAAC;IACpB,CAAC;IAEO,WAAW,CAAC,MAAc;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC/B,OAAO;SACP;QAED,IAAI,YAAY,CAAC,KAAK,KAAK,CAAC,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,cAAc,iDAChB,IAAI,CAAC,SAAS,GACd,gBAAgB,GAChB,YAAY,CACf,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACpC;IACF,CAAC;IAEM,OAAO,CAAC,KAAyB;QACvC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryGenericEvent,\n\tITelemetryPerformanceEvent,\n\tITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { IDisposable } from \"@fluidframework/core-interfaces\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { ITelemetryLoggerExt } from \"./telemetryTypes\";\n\ninterface Measurements {\n\t// The names of the properties in this interface are the ones that will get stamped in the\n\t// telemetry event, changes should be considered carefully. The optional properties should\n\t// only be populated if 'includeAggregateMetrics' is true.\n\n\t/**\n\t * The duration of the latest execution.\n\t */\n\tduration: number;\n\n\t/**\n\t * The number of executions since the last time an event was generated.\n\t */\n\tcount: number;\n\n\t/**\n\t * Total duration across all the executions since the last event was generated.\n\t */\n\ttotalDuration?: number;\n\n\t/**\n\t * Min duration across all the executions since the last event was generated.\n\t */\n\tminDuration?: number;\n\n\t/**\n\t * Max duration across all the executions since the last event was generated.\n\t */\n\tmaxDuration?: number;\n}\n\n/**\n * Helper class that executes a specified code block and writes an\n * {@link @fluidframework/common-definitions#ITelemetryPerformanceEvent} to a specified logger every time a specified\n * number of executions is reached (or when the class is disposed). The `duration` field in the telemetry event is\n * the duration of the latest execution (sample) of the specified function. See the documentation of the\n * `includeAggregateMetrics` parameter for additional details that can be included.\n */\nexport class SampledTelemetryHelper implements IDisposable {\n\tdisposed: boolean = false;\n\n\tprivate readonly measurementsMap = new Map<string, Measurements>();\n\n\t/**\n\t * @param eventBase -\n\t * Custom properties to include in the telemetry performance event when it is written.\n\t * @param logger -\n\t * The logger to use to write the telemetry performance event.\n\t * @param sampleThreshold -\n\t * Telemetry performance events will be generated every time we hit this many executions of the code block.\n\t * @param includeAggregateMetrics -\n\t * If set to `true`, the telemetry performance event will include aggregated metrics (total duration, min duration,\n\t * max duration) for all the executions in between generated events.\n\t * @param perBucketProperties -\n\t * Map of strings that represent different buckets (which can be specified when calling the 'measure' method), to\n\t * properties which should be added to the telemetry event for that bucket. If a bucket being measured does not\n\t * have an entry in this map, no additional properties will be added to its telemetry events. The following keys are\n\t * reserved for use by this class: \"duration\", \"count\", \"totalDuration\", \"minDuration\", \"maxDuration\". If any of\n\t * them is specified as a key in one of the ITelemetryProperties objects in this map, that key-value pair will be\n\t * ignored.\n\t */\n\tpublic constructor(\n\t\tprivate readonly eventBase: ITelemetryGenericEvent,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly sampleThreshold: number,\n\t\tprivate readonly includeAggregateMetrics: boolean = false,\n\t\tprivate readonly perBucketProperties = new Map<string, ITelemetryProperties>(),\n\t) {}\n\n\t/**\n\t * @param codeToMeasure -\n\t * The code to be executed and measured.\n\t * @param bucket -\n\t * A key to track executions of the code block separately. Each different value of this parameter has a separate\n\t * set of executions and metrics tracked by the class. If no such distinction needs to be made, do not provide a\n\t * value.\n\t * @returns Whatever the passed-in code block returns.\n\t */\n\tpublic measure<T>(codeToMeasure: () => T, bucket: string = \"\"): T {\n\t\tconst start = performance.now();\n\t\tconst returnValue = codeToMeasure();\n\t\tconst duration = performance.now() - start;\n\n\t\tlet m = this.measurementsMap.get(bucket);\n\t\tif (m === undefined) {\n\t\t\tm = { count: 0, duration: -1 };\n\t\t\tthis.measurementsMap.set(bucket, m);\n\t\t}\n\t\tm.count++;\n\t\tm.duration = duration;\n\n\t\tif (this.includeAggregateMetrics) {\n\t\t\tm.totalDuration = (m.totalDuration ?? 0) + duration;\n\t\t\tm.minDuration = Math.min(m.minDuration ?? duration, duration);\n\t\t\tm.maxDuration = Math.max(m.maxDuration ?? 0, duration);\n\t\t}\n\n\t\tif (m.count >= this.sampleThreshold) {\n\t\t\tthis.flushBucket(bucket);\n\t\t}\n\n\t\treturn returnValue;\n\t}\n\n\tprivate flushBucket(bucket: string) {\n\t\tconst measurements = this.measurementsMap.get(bucket);\n\t\tif (measurements === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (measurements.count !== 0) {\n\t\t\tconst bucketProperties = this.perBucketProperties.get(bucket);\n\n\t\t\tconst telemetryEvent: ITelemetryPerformanceEvent = {\n\t\t\t\t...this.eventBase,\n\t\t\t\t...bucketProperties, // If the bucket doesn't exist and this is undefined, things work as expected\n\t\t\t\t...measurements,\n\t\t\t};\n\n\t\t\tthis.logger.sendPerformanceEvent(telemetryEvent);\n\t\t\tthis.measurementsMap.delete(bucket);\n\t\t}\n\t}\n\n\tpublic dispose(error?: Error | undefined): void {\n\t\tthis.measurementsMap.forEach((_, k) => this.flushBucket(k));\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/telemetry-utils",
3
- "version": "2.0.0-internal.5.1.0",
3
+ "version": "2.0.0-internal.5.2.0",
4
4
  "description": "Collection of telemetry relates utilities for Fluid",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -41,16 +41,17 @@
41
41
  "dependencies": {
42
42
  "@fluidframework/common-definitions": "^0.20.1",
43
43
  "@fluidframework/common-utils": "^1.1.1",
44
+ "@fluidframework/core-interfaces": ">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0",
44
45
  "debug": "^4.1.1",
45
46
  "events": "^3.1.0",
46
47
  "uuid": "^8.3.1"
47
48
  },
48
49
  "devDependencies": {
49
- "@fluid-tools/build-cli": "^0.19.0",
50
+ "@fluid-tools/build-cli": "^0.20.0",
50
51
  "@fluidframework/build-common": "^1.2.0",
51
- "@fluidframework/build-tools": "^0.19.0",
52
+ "@fluidframework/build-tools": "^0.20.0",
52
53
  "@fluidframework/eslint-config-fluid": "^2.0.0",
53
- "@fluidframework/mocha-test-setup": ">=2.0.0-internal.5.1.0 <2.0.0-internal.5.2.0",
54
+ "@fluidframework/mocha-test-setup": ">=2.0.0-internal.5.2.0 <2.0.0-internal.5.3.0",
54
55
  "@fluidframework/telemetry-utils-previous": "npm:@fluidframework/telemetry-utils@2.0.0-internal.5.0.0",
55
56
  "@microsoft/api-extractor": "^7.34.4",
56
57
  "@types/debug": "^4.1.5",
package/src/logger.ts CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  ITaggedTelemetryPropertyType,
15
15
  TelemetryEventCategory,
16
16
  } from "@fluidframework/common-definitions";
17
- import { performance } from "@fluidframework/common-utils";
17
+ import { IsomorphicPerformance, performance } from "@fluidframework/common-utils";
18
18
  import { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from "./config";
19
19
  import {
20
20
  isILoggingError,
@@ -31,6 +31,13 @@ import {
31
31
  TelemetryEventPropertyTypeExt,
32
32
  } from "./telemetryTypes";
33
33
 
34
+ export interface Memory {
35
+ usedJSHeapSize: number;
36
+ }
37
+
38
+ export interface PerformanceWithMemory extends IsomorphicPerformance {
39
+ readonly memory: Memory;
40
+ }
34
41
  /**
35
42
  * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.
36
43
  * Please do not modify existing entries for backwards compatibility.
@@ -415,8 +422,9 @@ export class PerformanceEvent {
415
422
  logger: ITelemetryLoggerExt,
416
423
  event: ITelemetryGenericEvent,
417
424
  markers?: IPerformanceEventMarkers,
425
+ recordHeapSize: boolean = false,
418
426
  ) {
419
- return new PerformanceEvent(logger, event, markers);
427
+ return new PerformanceEvent(logger, event, markers, recordHeapSize);
420
428
  }
421
429
 
422
430
  public static timedExec<T>(
@@ -441,8 +449,9 @@ export class PerformanceEvent {
441
449
  event: ITelemetryGenericEvent,
442
450
  callback: (event: PerformanceEvent) => Promise<T>,
443
451
  markers?: IPerformanceEventMarkers,
452
+ recordHeapSize?: boolean,
444
453
  ) {
445
- const perfEvent = PerformanceEvent.start(logger, event, markers);
454
+ const perfEvent = PerformanceEvent.start(logger, event, markers, recordHeapSize);
446
455
  try {
447
456
  const ret = await callback(perfEvent);
448
457
  perfEvent.autoEnd();
@@ -460,11 +469,13 @@ export class PerformanceEvent {
460
469
  private event?: ITelemetryGenericEvent;
461
470
  private readonly startTime = performance.now();
462
471
  private startMark?: string;
472
+ private startMemoryCollection: number | undefined = 0;
463
473
 
464
474
  protected constructor(
465
475
  private readonly logger: ITelemetryLoggerExt,
466
476
  event: ITelemetryGenericEvent,
467
477
  private readonly markers: IPerformanceEventMarkers = { end: true, cancel: "generic" },
478
+ private readonly recordHeapSize: boolean = false,
468
479
  ) {
469
480
  this.event = { ...event };
470
481
  if (this.markers.start) {
@@ -527,6 +538,20 @@ export class PerformanceEvent {
527
538
  event.eventName = `${event.eventName}_${eventNameSuffix}`;
528
539
  if (eventNameSuffix !== "start") {
529
540
  event.duration = this.duration;
541
+ if (this.startMemoryCollection) {
542
+ const currentMemory = (performance as PerformanceWithMemory)?.memory
543
+ ?.usedJSHeapSize;
544
+ const differenceInKBytes = Math.floor(
545
+ (currentMemory - this.startMemoryCollection) / 1024,
546
+ );
547
+ if (differenceInKBytes > 0) {
548
+ event.usedJSHeapSize = differenceInKBytes;
549
+ }
550
+ }
551
+ } else if (this.recordHeapSize) {
552
+ this.startMemoryCollection = (
553
+ performance as PerformanceWithMemory
554
+ )?.memory?.usedJSHeapSize;
530
555
  }
531
556
 
532
557
  this.logger.sendPerformanceEvent(event, error);
@@ -4,11 +4,11 @@
4
4
  */
5
5
 
6
6
  import {
7
- IDisposable,
8
7
  ITelemetryGenericEvent,
9
8
  ITelemetryPerformanceEvent,
10
9
  ITelemetryProperties,
11
10
  } from "@fluidframework/common-definitions";
11
+ import { IDisposable } from "@fluidframework/core-interfaces";
12
12
  import { performance } from "@fluidframework/common-utils";
13
13
  import { ITelemetryLoggerExt } from "./telemetryTypes";
14
14