@fluidframework/telemetry-utils 2.0.0-internal.6.3.3 → 2.0.0-internal.7.0.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 +73 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/error.d.ts +13 -5
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +10 -2
- package/dist/error.js.map +1 -1
- package/dist/errorLogging.d.ts +36 -1
- package/dist/errorLogging.d.ts.map +1 -1
- package/dist/errorLogging.js +56 -20
- package/dist/errorLogging.js.map +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +16 -6
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +64 -42
- package/dist/logger.js.map +1 -1
- package/dist/telemetryTypes.d.ts +2 -2
- package/dist/telemetryTypes.d.ts.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/lib/config.d.ts +1 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +4 -2
- package/lib/config.js.map +1 -1
- package/lib/error.d.ts +13 -5
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +10 -2
- package/lib/error.js.map +1 -1
- package/lib/errorLogging.d.ts +36 -1
- package/lib/errorLogging.d.ts.map +1 -1
- package/lib/errorLogging.js +55 -20
- package/lib/errorLogging.js.map +1 -1
- package/lib/events.d.ts.map +1 -1
- package/lib/events.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/logger.d.ts +16 -6
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js +63 -41
- package/lib/logger.js.map +1 -1
- package/lib/telemetryTypes.d.ts +2 -2
- package/lib/telemetryTypes.d.ts.map +1 -1
- package/lib/utils.d.ts +1 -1
- package/lib/utils.js +1 -1
- package/lib/utils.js.map +1 -1
- package/package.json +11 -11
- package/src/config.ts +4 -2
- package/src/error.ts +15 -7
- package/src/errorLogging.ts +55 -15
- package/src/events.ts +2 -0
- package/src/index.ts +1 -0
- package/src/logger.ts +68 -37
- package/src/utils.ts +1 -1
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACN,4BAA4B,EAC5B,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,yBAAyB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,YAAY,EACZ,UAAU,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,8BAA8B,EAC9B,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,eAAe,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACd,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,mBAAmB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACN,6BAA6B,EAC7B,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,mBAAmB,EACnB,+BAA+B,EAC/B,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACN,4BAA4B,EAC5B,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,yBAAyB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,YAAY,EACZ,UAAU,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,8BAA8B,EAC9B,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,SAAS,EACT,eAAe,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACd,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,mBAAmB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACN,6BAA6B,EAC7B,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,mBAAmB,EACnB,+BAA+B,EAC/B,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { createChildMonitoringContext, sessionStorageConfigProvider, mixinMonitoringContext, loggerToMonitoringContext, } from "./config";
|
|
6
6
|
export { DataCorruptionError, DataProcessingError, extractSafePropertiesFromMessage, GenericError, UsageError, } from "./error";
|
|
7
|
-
export { extractLogSafeErrorProperties, generateErrorWithStack, generateStack, getCircularReplacer, isExternalError, isILoggingError, isTaggedTelemetryPropertyValue, LoggingError, NORMALIZED_ERROR_TYPE, normalizeError, wrapError, wrapErrorAndLog, } from "./errorLogging";
|
|
7
|
+
export { extractLogSafeErrorProperties, generateErrorWithStack, generateStack, getCircularReplacer, isExternalError, isILoggingError, isTaggedTelemetryPropertyValue, LoggingError, NORMALIZED_ERROR_TYPE, normalizeError, overwriteStack, wrapError, wrapErrorAndLog, } from "./errorLogging";
|
|
8
8
|
export { EventEmitterWithErrorHandling } from "./eventEmitterWithErrorHandling";
|
|
9
9
|
export { connectedEventName, disconnectedEventName, raiseConnectedEvent, safeRaiseEvent, } from "./events";
|
|
10
10
|
export { hasErrorInstanceId, isFluidError, isValidLegacyError, } from "./fluidErrorBase";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACN,4BAA4B,EAG5B,4BAA4B,EAC5B,sBAAsB,EAGtB,yBAAyB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,YAAY,EACZ,UAAU,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EAEnB,eAAe,EACf,eAAe,EACf,8BAA8B,EAC9B,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,eAAe,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACd,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAElB,YAAY,EACZ,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EAIV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAEhB,mBAAmB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nexport {\n\tcreateChildMonitoringContext,\n\tMonitoringContext,\n\tIConfigProviderBase,\n\tsessionStorageConfigProvider,\n\tmixinMonitoringContext,\n\tIConfigProvider,\n\tConfigTypes,\n\tloggerToMonitoringContext,\n} from \"./config\";\nexport {\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n\tGenericError,\n\tUsageError,\n} from \"./error\";\nexport {\n\textractLogSafeErrorProperties,\n\tgenerateErrorWithStack,\n\tgenerateStack,\n\tgetCircularReplacer,\n\tIFluidErrorAnnotations,\n\tisExternalError,\n\tisILoggingError,\n\tisTaggedTelemetryPropertyValue,\n\tLoggingError,\n\tNORMALIZED_ERROR_TYPE,\n\tnormalizeError,\n\twrapError,\n\twrapErrorAndLog,\n} from \"./errorLogging\";\nexport { EventEmitterWithErrorHandling } from \"./eventEmitterWithErrorHandling\";\nexport {\n\tconnectedEventName,\n\tdisconnectedEventName,\n\traiseConnectedEvent,\n\tsafeRaiseEvent,\n} from \"./events\";\nexport {\n\thasErrorInstanceId,\n\tIFluidErrorBase,\n\tisFluidError,\n\tisValidLegacyError,\n} from \"./fluidErrorBase\";\nexport {\n\teventNamespaceSeparator,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n\tformatTick,\n\tIPerformanceEventMarkers,\n\tITelemetryLoggerPropertyBag,\n\tITelemetryLoggerPropertyBags,\n\tnumberFromString,\n\tPerformanceEvent,\n\tTaggedLoggerAdapter,\n\ttagData,\n\ttagCodeArtifacts,\n\tTelemetryDataTag,\n\tTelemetryEventPropertyTypes,\n\tTelemetryNullLogger,\n} from \"./logger\";\nexport { MockLogger } from \"./mockLogger\";\nexport { ThresholdCounter } from \"./thresholdCounter\";\nexport { SampledTelemetryHelper } from \"./sampledTelemetryHelper\";\nexport { logIfFalse } from \"./utils\";\nexport {\n\tTelemetryEventPropertyTypeExt,\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryErrorEventExt,\n\tITelemetryPerformanceEventExt,\n\tITelemetryLoggerExt,\n\tITaggedTelemetryPropertyTypeExt,\n\tITelemetryPropertiesExt,\n\tTelemetryEventCategory,\n} from \"./telemetryTypes\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACN,4BAA4B,EAG5B,4BAA4B,EAC5B,sBAAsB,EAGtB,yBAAyB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,YAAY,EACZ,UAAU,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EAEnB,eAAe,EACf,eAAe,EACf,8BAA8B,EAC9B,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,SAAS,EACT,eAAe,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACd,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAElB,YAAY,EACZ,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EAIV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAEhB,mBAAmB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nexport {\n\tcreateChildMonitoringContext,\n\tMonitoringContext,\n\tIConfigProviderBase,\n\tsessionStorageConfigProvider,\n\tmixinMonitoringContext,\n\tIConfigProvider,\n\tConfigTypes,\n\tloggerToMonitoringContext,\n} from \"./config\";\nexport {\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n\tGenericError,\n\tUsageError,\n} from \"./error\";\nexport {\n\textractLogSafeErrorProperties,\n\tgenerateErrorWithStack,\n\tgenerateStack,\n\tgetCircularReplacer,\n\tIFluidErrorAnnotations,\n\tisExternalError,\n\tisILoggingError,\n\tisTaggedTelemetryPropertyValue,\n\tLoggingError,\n\tNORMALIZED_ERROR_TYPE,\n\tnormalizeError,\n\toverwriteStack,\n\twrapError,\n\twrapErrorAndLog,\n} from \"./errorLogging\";\nexport { EventEmitterWithErrorHandling } from \"./eventEmitterWithErrorHandling\";\nexport {\n\tconnectedEventName,\n\tdisconnectedEventName,\n\traiseConnectedEvent,\n\tsafeRaiseEvent,\n} from \"./events\";\nexport {\n\thasErrorInstanceId,\n\tIFluidErrorBase,\n\tisFluidError,\n\tisValidLegacyError,\n} from \"./fluidErrorBase\";\nexport {\n\teventNamespaceSeparator,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n\tformatTick,\n\tIPerformanceEventMarkers,\n\tITelemetryLoggerPropertyBag,\n\tITelemetryLoggerPropertyBags,\n\tnumberFromString,\n\tPerformanceEvent,\n\tTaggedLoggerAdapter,\n\ttagData,\n\ttagCodeArtifacts,\n\tTelemetryDataTag,\n\tTelemetryEventPropertyTypes,\n\tTelemetryNullLogger,\n} from \"./logger\";\nexport { MockLogger } from \"./mockLogger\";\nexport { ThresholdCounter } from \"./thresholdCounter\";\nexport { SampledTelemetryHelper } from \"./sampledTelemetryHelper\";\nexport { logIfFalse } from \"./utils\";\nexport {\n\tTelemetryEventPropertyTypeExt,\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryErrorEventExt,\n\tITelemetryPerformanceEventExt,\n\tITelemetryLoggerExt,\n\tITaggedTelemetryPropertyTypeExt,\n\tITelemetryPropertiesExt,\n\tTelemetryEventCategory,\n} from \"./telemetryTypes\";\n"]}
|
package/lib/logger.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { ITelemetryBaseEvent, ITelemetryBaseLogger, ITelemetryErrorEvent, ITelemetryGenericEvent, ITelemetryPerformanceEvent, ITelemetryProperties, TelemetryBaseEventPropertyType as TelemetryEventPropertyType, LogLevel, Tagged, ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
|
|
5
|
+
import { ITelemetryBaseEvent, ITelemetryBaseLogger, ITelemetryErrorEvent, ITelemetryGenericEvent, ITelemetryPerformanceEvent, ITelemetryProperties, TelemetryBaseEventPropertyType as TelemetryEventPropertyType, LogLevel, Tagged, ITelemetryBaseProperties, TelemetryBaseEventPropertyType } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { IsomorphicPerformance } from "@fluid-internal/client-utils";
|
|
7
7
|
import { ITelemetryGenericEventExt, ITelemetryLoggerExt, ITelemetryPerformanceEventExt, TelemetryEventPropertyTypeExt, TelemetryEventCategory } from "./telemetryTypes";
|
|
8
8
|
export interface Memory {
|
|
@@ -25,7 +25,7 @@ export declare enum TelemetryDataTag {
|
|
|
25
25
|
*/
|
|
26
26
|
UserData = "UserData"
|
|
27
27
|
}
|
|
28
|
-
export
|
|
28
|
+
export type TelemetryEventPropertyTypes = ITelemetryBaseProperties[string];
|
|
29
29
|
export interface ITelemetryLoggerPropertyBag {
|
|
30
30
|
[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);
|
|
31
31
|
}
|
|
@@ -255,12 +255,22 @@ export declare class TelemetryNullLogger implements ITelemetryLoggerExt {
|
|
|
255
255
|
* @param x - value passed in to convert to a base property type
|
|
256
256
|
*/
|
|
257
257
|
export declare function convertToBasePropertyType(x: TelemetryEventPropertyTypeExt | Tagged<TelemetryEventPropertyTypeExt>): TelemetryEventPropertyType | Tagged<TelemetryEventPropertyType>;
|
|
258
|
-
export declare const tagData: <T extends TelemetryDataTag, V extends Record<string,
|
|
258
|
+
export declare const tagData: <T extends TelemetryDataTag, V extends Record<string, import("@fluidframework/core-interfaces").TelemetryEventPropertyType | (() => TelemetryBaseEventPropertyType)>>(tag: T, values: V) => { [P in keyof V]: (V[P] extends () => TelemetryBaseEventPropertyType ? () => {
|
|
259
|
+
value: ReturnType<V[P]>;
|
|
260
|
+
tag: T;
|
|
261
|
+
} : {
|
|
259
262
|
value: Exclude<V[P], undefined>;
|
|
260
263
|
tag: T;
|
|
261
|
-
} | (V[P] extends undefined ? undefined : never); };
|
|
262
|
-
|
|
264
|
+
}) | (V[P] extends undefined ? undefined : never); };
|
|
265
|
+
/**
|
|
266
|
+
* Helper function to tag telemetry properties as CodeArtifacts. It supports properties of type
|
|
267
|
+
* TelemetryBaseEventPropertyType as well as getters that return TelemetryBaseEventPropertyType.
|
|
268
|
+
*/
|
|
269
|
+
export declare const tagCodeArtifacts: <T extends Record<string, import("@fluidframework/core-interfaces").TelemetryEventPropertyType | (() => TelemetryBaseEventPropertyType)>>(values: T) => { [P in keyof T]: (T[P] extends () => TelemetryBaseEventPropertyType ? () => {
|
|
270
|
+
value: ReturnType<T[P]>;
|
|
271
|
+
tag: TelemetryDataTag.CodeArtifact;
|
|
272
|
+
} : {
|
|
263
273
|
value: Exclude<T[P], undefined>;
|
|
264
274
|
tag: TelemetryDataTag.CodeArtifact;
|
|
265
|
-
} | (T[P] extends undefined ? undefined : never); };
|
|
275
|
+
}) | (T[P] extends undefined ? undefined : never); };
|
|
266
276
|
//# sourceMappingURL=logger.d.ts.map
|
package/lib/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,8BAA8B,IAAI,0BAA0B,EAC5D,QAAQ,EACR,MAAM,EACN,wBAAwB,EACxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAe,MAAM,8BAA8B,CAAC;AAQlF,OAAO,EAEN,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,6BAA6B,EAC7B,sBAAsB,EACtB,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;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;OAEG;IACH,QAAQ,aAAa;CACrB;AAED,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/lib/logger.js
CHANGED
|
@@ -45,10 +45,6 @@ export const eventNamespaceSeparator = ":";
|
|
|
45
45
|
* Creates sub-logger that appends properties to all events
|
|
46
46
|
*/
|
|
47
47
|
export class TelemetryLogger {
|
|
48
|
-
constructor(namespace, properties) {
|
|
49
|
-
this.namespace = namespace;
|
|
50
|
-
this.properties = properties;
|
|
51
|
-
}
|
|
52
48
|
static sanitizePkgName(name) {
|
|
53
49
|
return name.replace("@", "").replace("/", "-");
|
|
54
50
|
}
|
|
@@ -81,6 +77,10 @@ export class TelemetryLogger {
|
|
|
81
77
|
event.stack = generateStack();
|
|
82
78
|
}
|
|
83
79
|
}
|
|
80
|
+
constructor(namespace, properties) {
|
|
81
|
+
this.namespace = namespace;
|
|
82
|
+
this.properties = properties;
|
|
83
|
+
}
|
|
84
84
|
/**
|
|
85
85
|
* Send a telemetry event with the logger
|
|
86
86
|
*
|
|
@@ -201,26 +201,30 @@ export class TaggedLoggerAdapter {
|
|
|
201
201
|
? taggableProp
|
|
202
202
|
: { value: taggableProp, tag: undefined };
|
|
203
203
|
switch (tag) {
|
|
204
|
-
case undefined:
|
|
204
|
+
case undefined: {
|
|
205
205
|
// No tag means we can log plainly
|
|
206
206
|
newEvent[key] = value;
|
|
207
207
|
break;
|
|
208
|
+
}
|
|
208
209
|
case "PackageData": // For back-compat
|
|
209
|
-
case TelemetryDataTag.CodeArtifact:
|
|
210
|
+
case TelemetryDataTag.CodeArtifact: {
|
|
210
211
|
// For Microsoft applications, CodeArtifact is safe for now
|
|
211
212
|
// (we don't load 3P code in 1P apps)
|
|
212
213
|
newEvent[key] = value;
|
|
213
214
|
break;
|
|
214
|
-
|
|
215
|
+
}
|
|
216
|
+
case TelemetryDataTag.UserData: {
|
|
215
217
|
// Strip out anything tagged explicitly as UserData.
|
|
216
218
|
// Alternate strategy would be to hash these props
|
|
217
219
|
newEvent[key] = "REDACTED (UserData)";
|
|
218
220
|
break;
|
|
219
|
-
|
|
221
|
+
}
|
|
222
|
+
default: {
|
|
220
223
|
// If we encounter a tag we don't recognize
|
|
221
224
|
// then we must assume we should scrub.
|
|
222
225
|
newEvent[key] = "REDACTED (unknown tag)";
|
|
223
226
|
break;
|
|
227
|
+
}
|
|
224
228
|
}
|
|
225
229
|
}
|
|
226
230
|
this.logger.send(newEvent);
|
|
@@ -242,14 +246,6 @@ export function createChildLogger(props) {
|
|
|
242
246
|
* Creates sub-logger that appends properties to all events
|
|
243
247
|
*/
|
|
244
248
|
export class ChildLogger extends TelemetryLogger {
|
|
245
|
-
constructor(baseLogger, namespace, properties) {
|
|
246
|
-
super(namespace, properties);
|
|
247
|
-
this.baseLogger = baseLogger;
|
|
248
|
-
// propagate the monitoring context
|
|
249
|
-
if (loggerIsMonitoringContext(baseLogger)) {
|
|
250
|
-
mixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
249
|
/**
|
|
254
250
|
* Create child logger
|
|
255
251
|
* @param baseLogger - Base logger to use to output events. If undefined, proper child logger
|
|
@@ -289,7 +285,15 @@ export class ChildLogger extends TelemetryLogger {
|
|
|
289
285
|
}
|
|
290
286
|
return child;
|
|
291
287
|
}
|
|
292
|
-
return new ChildLogger(baseLogger
|
|
288
|
+
return new ChildLogger(baseLogger ?? { send() { } }, namespace, properties);
|
|
289
|
+
}
|
|
290
|
+
constructor(baseLogger, namespace, properties) {
|
|
291
|
+
super(namespace, properties);
|
|
292
|
+
this.baseLogger = baseLogger;
|
|
293
|
+
// propagate the monitoring context
|
|
294
|
+
if (loggerIsMonitoringContext(baseLogger)) {
|
|
295
|
+
mixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));
|
|
296
|
+
}
|
|
293
297
|
}
|
|
294
298
|
get minLogLevel() {
|
|
295
299
|
return this.baseLogger.minLogLevel;
|
|
@@ -333,7 +337,7 @@ export class MultiSinkLogger extends TelemetryLogger {
|
|
|
333
337
|
* @param tryInheritProperties - Will attempted to copy those loggers properties to this loggers if they are of a known type e.g. one from this package
|
|
334
338
|
*/
|
|
335
339
|
constructor(namespace, properties, loggers = [], tryInheritProperties) {
|
|
336
|
-
let realProperties = properties
|
|
340
|
+
let realProperties = properties === undefined ? undefined : { ...properties };
|
|
337
341
|
if (tryInheritProperties === true) {
|
|
338
342
|
const merge = (realProperties ?? (realProperties = {}));
|
|
339
343
|
loggers
|
|
@@ -392,22 +396,6 @@ export class MultiSinkLogger extends TelemetryLogger {
|
|
|
392
396
|
* Helper class to log performance events
|
|
393
397
|
*/
|
|
394
398
|
export class PerformanceEvent {
|
|
395
|
-
constructor(logger, event, markers = { end: true, cancel: "generic" }, recordHeapSize = false) {
|
|
396
|
-
this.logger = logger;
|
|
397
|
-
this.markers = markers;
|
|
398
|
-
this.recordHeapSize = recordHeapSize;
|
|
399
|
-
this.startTime = performance.now();
|
|
400
|
-
this.startMemoryCollection = 0;
|
|
401
|
-
this.event = { ...event };
|
|
402
|
-
if (this.markers.start) {
|
|
403
|
-
this.reportEvent("start");
|
|
404
|
-
}
|
|
405
|
-
// eslint-disable-next-line unicorn/no-null
|
|
406
|
-
if (typeof window === "object" && window != null && window.performance?.mark) {
|
|
407
|
-
this.startMark = `${event.eventName}-start`;
|
|
408
|
-
window.performance.mark(this.startMark);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
399
|
static start(logger, event, markers, recordHeapSize = false) {
|
|
412
400
|
return new PerformanceEvent(logger, event, markers, recordHeapSize);
|
|
413
401
|
}
|
|
@@ -438,6 +426,21 @@ export class PerformanceEvent {
|
|
|
438
426
|
get duration() {
|
|
439
427
|
return performance.now() - this.startTime;
|
|
440
428
|
}
|
|
429
|
+
constructor(logger, event, markers = { end: true, cancel: "generic" }, recordHeapSize = false) {
|
|
430
|
+
this.logger = logger;
|
|
431
|
+
this.markers = markers;
|
|
432
|
+
this.recordHeapSize = recordHeapSize;
|
|
433
|
+
this.startTime = performance.now();
|
|
434
|
+
this.startMemoryCollection = 0;
|
|
435
|
+
this.event = { ...event };
|
|
436
|
+
if (this.markers.start) {
|
|
437
|
+
this.reportEvent("start");
|
|
438
|
+
}
|
|
439
|
+
if (typeof window === "object" && window?.performance?.mark) {
|
|
440
|
+
this.startMark = `${event.eventName}-start`;
|
|
441
|
+
window.performance.mark(this.startMark);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
441
444
|
reportProgress(props, eventNameSuffix = "update") {
|
|
442
445
|
this.reportEvent(eventNameSuffix, props);
|
|
443
446
|
}
|
|
@@ -544,24 +547,43 @@ function convertToBasePropertyTypeUntagged(x) {
|
|
|
544
547
|
case "string":
|
|
545
548
|
case "number":
|
|
546
549
|
case "boolean":
|
|
547
|
-
case "undefined":
|
|
550
|
+
case "undefined": {
|
|
548
551
|
return x;
|
|
549
|
-
|
|
552
|
+
}
|
|
553
|
+
case "object": {
|
|
550
554
|
// We assume this is an array or flat object based on the input types
|
|
551
555
|
return JSON.stringify(x);
|
|
552
|
-
|
|
556
|
+
}
|
|
557
|
+
default: {
|
|
553
558
|
// should never reach this case based on the input types
|
|
554
559
|
console.error(`convertToBasePropertyTypeUntagged: INVALID PROPERTY (typed as ${typeof x})`);
|
|
555
560
|
return `INVALID PROPERTY (typed as ${typeof x})`;
|
|
561
|
+
}
|
|
556
562
|
}
|
|
557
563
|
}
|
|
558
|
-
export const tagData = (tag, values) =>
|
|
564
|
+
export const tagData = (tag, values) =>
|
|
565
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
566
|
+
Object.entries(values)
|
|
559
567
|
.filter((e) => e[1] !== undefined)
|
|
560
|
-
// eslint-disable-next-line unicorn/no-array-reduce
|
|
568
|
+
// eslint-disable-next-line unicorn/no-array-reduce, unicorn/prefer-object-from-entries
|
|
561
569
|
.reduce((pv, cv) => {
|
|
562
|
-
|
|
570
|
+
const [key, value] = cv;
|
|
571
|
+
// The ternary form is less legible in this case.
|
|
572
|
+
// eslint-disable-next-line unicorn/prefer-ternary
|
|
573
|
+
if (typeof value === "function") {
|
|
574
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
575
|
+
pv[key] = () => {
|
|
576
|
+
return { tag, value: value() };
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
pv[key] = { tag, value };
|
|
581
|
+
}
|
|
563
582
|
return pv;
|
|
564
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
565
583
|
}, {});
|
|
584
|
+
/**
|
|
585
|
+
* Helper function to tag telemetry properties as CodeArtifacts. It supports properties of type
|
|
586
|
+
* TelemetryBaseEventPropertyType as well as getters that return TelemetryBaseEventPropertyType.
|
|
587
|
+
*/
|
|
566
588
|
export const tagCodeArtifacts = (values) => tagData(TelemetryDataTag.CodeArtifact, values);
|
|
567
589
|
//# sourceMappingURL=logger.js.map
|
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\tTelemetryBaseEventPropertyType as TelemetryEventPropertyType,\n\tLogLevel,\n\tTagged,\n\tITelemetryBaseProperties,\n} from \"@fluidframework/core-interfaces\";\nimport { IsomorphicPerformance, performance } from \"@fluid-internal/client-utils\";\nimport { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from \"./config\";\nimport {\n\tisILoggingError,\n\textractLogSafeErrorProperties,\n\tgenerateStack,\n\tisTaggedTelemetryPropertyValue,\n} from \"./errorLogging\";\nimport {\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\tITelemetryPerformanceEventExt,\n\tTelemetryEventPropertyTypeExt,\n\tTelemetryEventCategory,\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/**\n\t * Data containing terms or IDs from code packages that may have been dynamically loaded\n\t */\n\tCodeArtifact = \"CodeArtifact\",\n\t/**\n\t * Personal data of a variety of classifications that pertains to the user\n\t */\n\tUserData = \"UserData\",\n}\n\nexport type TelemetryEventPropertyTypes = ITelemetryBaseProperties[string];\n\nexport interface ITelemetryLoggerPropertyBag {\n\t[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);\n}\nexport interface ITelemetryLoggerPropertyBags {\n\tall?: ITelemetryLoggerPropertyBag;\n\terror?: ITelemetryLoggerPropertyBag;\n}\n\n/**\n * Attempts to parse number from string.\n * If fails,returns original string.\n * Used to make telemetry data typed (and support math operations, like comparison),\n * in places where we do expect numbers (like contentsize/duration property in http header)\n */\n// eslint-disable-next-line @rushstack/no-new-null\nexport function numberFromString(str: string | null | undefined): string | number | undefined {\n\tif (str === undefined || str === null) {\n\t\treturn undefined;\n\t}\n\tconst num = Number(str);\n\treturn Number.isNaN(num) ? str : num;\n}\n\nexport function formatTick(tick: number): number {\n\treturn Math.floor(tick);\n}\n\nexport const eventNamespaceSeparator = \":\" as const;\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 = eventNamespaceSeparator;\n\n\tpublic static sanitizePkgName(name: string): 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(\n\t\tevent: ITelemetryBaseEvent,\n\t\terror: unknown,\n\t\tfetchStack: boolean,\n\t): void {\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, logLevel?: LogLevel): 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 * @param logLevel - optional level of the log. It category of event is set as error,\n\t * then the logLevel will be upgraded to be an error.\n\t */\n\tpublic sendTelemetryEvent(\n\t\tevent: ITelemetryGenericEventExt,\n\t\terror?: unknown,\n\t\tlogLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,\n\t): void {\n\t\tthis.sendTelemetryEventCore(\n\t\t\t{ ...event, category: event.category ?? \"generic\" },\n\t\t\terror,\n\t\t\tevent.category === \"error\" ? LogLevel.error : logLevel,\n\t\t);\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 * @param logLevel - optional level of the log.\n\t */\n\tprotected sendTelemetryEventCore(\n\t\tevent: ITelemetryGenericEventExt & { category: TelemetryEventCategory },\n\t\terror?: unknown,\n\t\tlogLevel?: LogLevel,\n\t): void {\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 = formatTick(newEvent.duration);\n\t\t}\n\n\t\tthis.send(newEvent, logLevel);\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?: unknown): void {\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\tLogLevel.error,\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 * @param logLevel - optional level of the log. It category of event is set as error,\n\t * then the logLevel will be upgraded to be an error.\n\t */\n\tpublic sendPerformanceEvent(\n\t\tevent: ITelemetryPerformanceEventExt,\n\t\terror?: unknown,\n\t\tlogLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,\n\t): 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(\n\t\t\tperfEvent,\n\t\t\terror,\n\t\t\tperfEvent.category === \"error\" ? LogLevel.error : logLevel,\n\t\t);\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\treturn this.extendProperties(newEvent, includeErrorProps);\n\t}\n\n\tprivate extendProperties<T extends ITelemetryLoggerPropertyBag = ITelemetryLoggerPropertyBag>(\n\t\ttoExtend: T,\n\t\tincludeErrorProps: boolean,\n\t): T {\n\t\tconst eventLike: ITelemetryLoggerPropertyBag = toExtend;\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 (eventLike[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\teventLike[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 toExtend;\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\t/**\n\t * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseLogger.send}\n\t */\n\tpublic send(eventWithTagsMaybe: ITelemetryBaseEvent): void {\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 * Create a child logger based on the provided props object\n * @param props - logger is the base logger the child will log to after it's processing, namespace will be prefixed to all event names, properties are default properties that will be applied events.\n *\n * @remarks\n * Passing in no props object (i.e. undefined) will return a logger that is effectively a no-op.\n */\nexport function createChildLogger(props?: {\n\tlogger?: ITelemetryBaseLogger;\n\tnamespace?: string;\n\tproperties?: ITelemetryLoggerPropertyBags;\n}): ITelemetryLoggerExt {\n\treturn ChildLogger.create(props?.logger, props?.namespace, props?.properties);\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\tconst child = new ChildLogger(\n\t\t\t\tbaseLogger.baseLogger,\n\t\t\t\tcombinedNamespace,\n\t\t\t\tcombinedProperties,\n\t\t\t);\n\n\t\t\tif (!loggerIsMonitoringContext(child) && loggerIsMonitoringContext(baseLogger)) {\n\t\t\t\tmixinMonitoringContext(child, baseLogger.config);\n\t\t\t}\n\t\t\treturn child;\n\t\t}\n\n\t\treturn new ChildLogger(\n\t\t\tbaseLogger ? baseLogger : { send(): void {} },\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\tpublic get minLogLevel(): LogLevel | undefined {\n\t\treturn this.baseLogger.minLogLevel;\n\t}\n\n\tprivate shouldFilterOutEvent(event: ITelemetryBaseEvent, logLevel?: LogLevel): boolean {\n\t\tconst eventLogLevel = logLevel ?? LogLevel.default;\n\t\tconst configLogLevel = this.baseLogger.minLogLevel ?? LogLevel.default;\n\t\t// Filter out in case event log level is below what is wanted in config.\n\t\treturn eventLogLevel < configLogLevel;\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, logLevel?: LogLevel): void {\n\t\tif (this.shouldFilterOutEvent(event, logLevel)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.baseLogger.send(this.prepareEvent(event), logLevel);\n\t}\n}\n\n/**\n * Create a logger which logs to multiple other loggers based on the provided props object\n * @param props - loggers are the base loggers that will logged to after it's processing, namespace will be prefixed to all event names, properties are default properties that will be applied events.\n * tryInheritProperties will attempted to copy those loggers properties to this loggers if they are of a known type e.g. one from this package\n */\nexport function createMultiSinkLogger(props: {\n\tnamespace?: string;\n\tproperties?: ITelemetryLoggerPropertyBags;\n\tloggers?: (ITelemetryBaseLogger | undefined)[];\n\ttryInheritProperties?: true;\n}): ITelemetryLoggerExt {\n\treturn new MultiSinkLogger(\n\t\tprops.namespace,\n\t\tprops.properties,\n\t\tprops.loggers?.filter((l): l is ITelemetryBaseLogger => l !== undefined),\n\t\tprops.tryInheritProperties,\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\t// This is minimum of minLlogLevel of all loggers.\n\tprivate _minLogLevelOfAllLoggers: LogLevel;\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 * @param loggers - The list of loggers to use as sinks\n\t * @param tryInheritProperties - Will attempted to copy those loggers properties to this loggers if they are of a known type e.g. one from this package\n\t */\n\tconstructor(\n\t\tnamespace?: string,\n\t\tproperties?: ITelemetryLoggerPropertyBags,\n\t\tloggers: ITelemetryBaseLogger[] = [],\n\t\ttryInheritProperties?: true,\n\t) {\n\t\tlet realProperties = properties !== undefined ? { ...properties } : undefined;\n\t\tif (tryInheritProperties === true) {\n\t\t\tconst merge = (realProperties ??= {});\n\t\t\tloggers\n\t\t\t\t.filter((l): l is this => l instanceof TelemetryLogger)\n\t\t\t\t.map((l) => l.properties ?? {})\n\t\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\t\t.forEach((cv) => {\n\t\t\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\t\t\tObject.keys(cv).forEach((k) => {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\tmerge[k] = { ...cv[k], ...merge?.[k] };\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tsuper(namespace, realProperties);\n\t\tthis.loggers = loggers;\n\t\tthis._minLogLevelOfAllLoggers = LogLevel.default;\n\t\tthis.calculateMinLogLevel();\n\t}\n\n\tpublic get minLogLevel(): LogLevel {\n\t\treturn this._minLogLevelOfAllLoggers;\n\t}\n\n\tprivate calculateMinLogLevel(): void {\n\t\tif (this.loggers.length > 0) {\n\t\t\tconst logLevels: LogLevel[] = [];\n\t\t\tfor (const logger of this.loggers) {\n\t\t\t\tlogLevels.push(logger.minLogLevel ?? LogLevel.default);\n\t\t\t}\n\t\t\tthis._minLogLevelOfAllLoggers = Math.min(...logLevels) as LogLevel;\n\t\t}\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): void {\n\t\tif (logger !== undefined && logger !== null) {\n\t\t\tthis.loggers.push(logger);\n\t\t\t// Update in case the logLevel of added logger is less than the current.\n\t\t\tthis.calculateMinLogLevel();\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\tfor (const logger of this.loggers) {\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): PerformanceEvent {\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): 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): Promise<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(): number {\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\t// eslint-disable-next-line unicorn/no-null\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(): void {\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(): void {\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?: unknown): 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(\n\t\teventNameSuffix: string,\n\t\tprops?: ITelemetryProperties,\n\t\terror?: unknown,\n\t): void {\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 * Null logger that no-ops for all telemetry events passed to it.\n * @deprecated - This will be removed in a future release.\n * For internal use within the FluidFramework codebase, use {@link createChildLogger} with no arguments instead.\n * For external consumers we recommend writing a trivial implementation of {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}\n * where the send() method does nothing and using that.\n */\nexport class TelemetryNullLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: unknown): void {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: unknown): void {}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: unknown): 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 a flat array or object - returns a stringified version of the array/object.\n * If the value is an object of type Tagged<TelemetryEventPropertyType> - 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 | Tagged<TelemetryEventPropertyTypeExt>,\n): TelemetryEventPropertyType | Tagged<TelemetryEventPropertyType> {\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\nexport const tagData = <\n\tT extends TelemetryDataTag,\n\tV extends Record<string, TelemetryEventPropertyTypeExt>,\n>(\n\ttag: T,\n\tvalues: V,\n): {\n\t[P in keyof V]:\n\t\t| {\n\t\t\t\tvalue: Exclude<V[P], undefined>;\n\t\t\t\ttag: T;\n\t\t }\n\t\t| (V[P] extends undefined ? undefined : never);\n} =>\n\t(Object.entries(values) as [keyof V, V[keyof V]][])\n\t\t.filter((e): e is [keyof V, Exclude<V[keyof V], undefined>] => e[1] !== undefined)\n\t\t// eslint-disable-next-line unicorn/no-array-reduce\n\t\t.reduce<{\n\t\t\t[P in keyof V]:\n\t\t\t\t| (V[P] extends undefined ? undefined : never)\n\t\t\t\t| { value: Exclude<V[P], undefined>; tag: T };\n\t\t}>((pv, cv) => {\n\t\t\tpv[cv[0]] = { tag, value: cv[1] };\n\t\t\treturn pv;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n\t\t}, {} as any);\n\nexport const tagCodeArtifacts = <T extends Record<string, TelemetryEventPropertyTypeExt>>(\n\tvalues: T,\n): {\n\t[P in keyof T]:\n\t\t| {\n\t\t\t\tvalue: Exclude<T[P], undefined>;\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact;\n\t\t }\n\t\t| (T[P] extends undefined ? undefined : never);\n} => tagData(TelemetryDataTag.CodeArtifact, values);\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\tTelemetryBaseEventPropertyType as TelemetryEventPropertyType,\n\tLogLevel,\n\tTagged,\n\tITelemetryBaseProperties,\n\tTelemetryBaseEventPropertyType,\n} from \"@fluidframework/core-interfaces\";\nimport { IsomorphicPerformance, performance } from \"@fluid-internal/client-utils\";\nimport { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from \"./config\";\nimport {\n\tisILoggingError,\n\textractLogSafeErrorProperties,\n\tgenerateStack,\n\tisTaggedTelemetryPropertyValue,\n} from \"./errorLogging\";\nimport {\n\tITelemetryEventExt,\n\tITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\tITelemetryPerformanceEventExt,\n\tTelemetryEventPropertyTypeExt,\n\tTelemetryEventCategory,\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/**\n\t * Data containing terms or IDs from code packages that may have been dynamically loaded\n\t */\n\tCodeArtifact = \"CodeArtifact\",\n\t/**\n\t * Personal data of a variety of classifications that pertains to the user\n\t */\n\tUserData = \"UserData\",\n}\n\nexport type TelemetryEventPropertyTypes = ITelemetryBaseProperties[string];\n\nexport interface ITelemetryLoggerPropertyBag {\n\t[index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);\n}\nexport interface ITelemetryLoggerPropertyBags {\n\tall?: ITelemetryLoggerPropertyBag;\n\terror?: ITelemetryLoggerPropertyBag;\n}\n\n/**\n * Attempts to parse number from string.\n * If fails,returns original string.\n * Used to make telemetry data typed (and support math operations, like comparison),\n * in places where we do expect numbers (like contentsize/duration property in http header)\n */\n// eslint-disable-next-line @rushstack/no-new-null\nexport function numberFromString(str: string | null | undefined): string | number | undefined {\n\tif (str === undefined || str === null) {\n\t\treturn undefined;\n\t}\n\tconst num = Number(str);\n\treturn Number.isNaN(num) ? str : num;\n}\n\nexport function formatTick(tick: number): number {\n\treturn Math.floor(tick);\n}\n\nexport const eventNamespaceSeparator = \":\" as const;\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 = eventNamespaceSeparator;\n\n\tpublic static sanitizePkgName(name: string): 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(\n\t\tevent: ITelemetryBaseEvent,\n\t\terror: unknown,\n\t\tfetchStack: boolean,\n\t): void {\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, logLevel?: LogLevel): 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 * @param logLevel - optional level of the log. It category of event is set as error,\n\t * then the logLevel will be upgraded to be an error.\n\t */\n\tpublic sendTelemetryEvent(\n\t\tevent: ITelemetryGenericEventExt,\n\t\terror?: unknown,\n\t\tlogLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,\n\t): void {\n\t\tthis.sendTelemetryEventCore(\n\t\t\t{ ...event, category: event.category ?? \"generic\" },\n\t\t\terror,\n\t\t\tevent.category === \"error\" ? LogLevel.error : logLevel,\n\t\t);\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 * @param logLevel - optional level of the log.\n\t */\n\tprotected sendTelemetryEventCore(\n\t\tevent: ITelemetryGenericEventExt & { category: TelemetryEventCategory },\n\t\terror?: unknown,\n\t\tlogLevel?: LogLevel,\n\t): void {\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 = formatTick(newEvent.duration);\n\t\t}\n\n\t\tthis.send(newEvent, logLevel);\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?: unknown): void {\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\tLogLevel.error,\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 * @param logLevel - optional level of the log. It category of event is set as error,\n\t * then the logLevel will be upgraded to be an error.\n\t */\n\tpublic sendPerformanceEvent(\n\t\tevent: ITelemetryPerformanceEventExt,\n\t\terror?: unknown,\n\t\tlogLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,\n\t): 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(\n\t\t\tperfEvent,\n\t\t\terror,\n\t\t\tperfEvent.category === \"error\" ? LogLevel.error : logLevel,\n\t\t);\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\treturn this.extendProperties(newEvent, includeErrorProps);\n\t}\n\n\tprivate extendProperties<T extends ITelemetryLoggerPropertyBag = ITelemetryLoggerPropertyBag>(\n\t\ttoExtend: T,\n\t\tincludeErrorProps: boolean,\n\t): T {\n\t\tconst eventLike: ITelemetryLoggerPropertyBag = toExtend;\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 (eventLike[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\teventLike[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 toExtend;\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\t/**\n\t * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseLogger.send}\n\t */\n\tpublic send(eventWithTagsMaybe: ITelemetryBaseEvent): void {\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\t}\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\t}\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\t}\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\t}\n\t\t\t}\n\t\t}\n\t\tthis.logger.send(newEvent);\n\t}\n}\n\n/**\n * Create a child logger based on the provided props object\n * @param props - logger is the base logger the child will log to after it's processing, namespace will be prefixed to all event names, properties are default properties that will be applied events.\n *\n * @remarks\n * Passing in no props object (i.e. undefined) will return a logger that is effectively a no-op.\n */\nexport function createChildLogger(props?: {\n\tlogger?: ITelemetryBaseLogger;\n\tnamespace?: string;\n\tproperties?: ITelemetryLoggerPropertyBags;\n}): ITelemetryLoggerExt {\n\treturn ChildLogger.create(props?.logger, props?.namespace, props?.properties);\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\tconst child = new ChildLogger(\n\t\t\t\tbaseLogger.baseLogger,\n\t\t\t\tcombinedNamespace,\n\t\t\t\tcombinedProperties,\n\t\t\t);\n\n\t\t\tif (!loggerIsMonitoringContext(child) && loggerIsMonitoringContext(baseLogger)) {\n\t\t\t\tmixinMonitoringContext(child, baseLogger.config);\n\t\t\t}\n\t\t\treturn child;\n\t\t}\n\n\t\treturn new ChildLogger(baseLogger ?? { send(): void {} }, namespace, properties);\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\tpublic get minLogLevel(): LogLevel | undefined {\n\t\treturn this.baseLogger.minLogLevel;\n\t}\n\n\tprivate shouldFilterOutEvent(event: ITelemetryBaseEvent, logLevel?: LogLevel): boolean {\n\t\tconst eventLogLevel = logLevel ?? LogLevel.default;\n\t\tconst configLogLevel = this.baseLogger.minLogLevel ?? LogLevel.default;\n\t\t// Filter out in case event log level is below what is wanted in config.\n\t\treturn eventLogLevel < configLogLevel;\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, logLevel?: LogLevel): void {\n\t\tif (this.shouldFilterOutEvent(event, logLevel)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.baseLogger.send(this.prepareEvent(event), logLevel);\n\t}\n}\n\n/**\n * Create a logger which logs to multiple other loggers based on the provided props object\n * @param props - loggers are the base loggers that will logged to after it's processing, namespace will be prefixed to all event names, properties are default properties that will be applied events.\n * tryInheritProperties will attempted to copy those loggers properties to this loggers if they are of a known type e.g. one from this package\n */\nexport function createMultiSinkLogger(props: {\n\tnamespace?: string;\n\tproperties?: ITelemetryLoggerPropertyBags;\n\tloggers?: (ITelemetryBaseLogger | undefined)[];\n\ttryInheritProperties?: true;\n}): ITelemetryLoggerExt {\n\treturn new MultiSinkLogger(\n\t\tprops.namespace,\n\t\tprops.properties,\n\t\tprops.loggers?.filter((l): l is ITelemetryBaseLogger => l !== undefined),\n\t\tprops.tryInheritProperties,\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\t// This is minimum of minLlogLevel of all loggers.\n\tprivate _minLogLevelOfAllLoggers: LogLevel;\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 * @param loggers - The list of loggers to use as sinks\n\t * @param tryInheritProperties - Will attempted to copy those loggers properties to this loggers if they are of a known type e.g. one from this package\n\t */\n\tconstructor(\n\t\tnamespace?: string,\n\t\tproperties?: ITelemetryLoggerPropertyBags,\n\t\tloggers: ITelemetryBaseLogger[] = [],\n\t\ttryInheritProperties?: true,\n\t) {\n\t\tlet realProperties = properties === undefined ? undefined : { ...properties };\n\t\tif (tryInheritProperties === true) {\n\t\t\tconst merge = (realProperties ??= {});\n\t\t\tloggers\n\t\t\t\t.filter((l): l is this => l instanceof TelemetryLogger)\n\t\t\t\t.map((l) => l.properties ?? {})\n\t\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\t\t.forEach((cv) => {\n\t\t\t\t\t// eslint-disable-next-line unicorn/no-array-for-each\n\t\t\t\t\tObject.keys(cv).forEach((k) => {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\tmerge[k] = { ...cv[k], ...merge?.[k] };\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tsuper(namespace, realProperties);\n\t\tthis.loggers = loggers;\n\t\tthis._minLogLevelOfAllLoggers = LogLevel.default;\n\t\tthis.calculateMinLogLevel();\n\t}\n\n\tpublic get minLogLevel(): LogLevel {\n\t\treturn this._minLogLevelOfAllLoggers;\n\t}\n\n\tprivate calculateMinLogLevel(): void {\n\t\tif (this.loggers.length > 0) {\n\t\t\tconst logLevels: LogLevel[] = [];\n\t\t\tfor (const logger of this.loggers) {\n\t\t\t\tlogLevels.push(logger.minLogLevel ?? LogLevel.default);\n\t\t\t}\n\t\t\tthis._minLogLevelOfAllLoggers = Math.min(...logLevels) as LogLevel;\n\t\t}\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): void {\n\t\tif (logger !== undefined && logger !== null) {\n\t\t\tthis.loggers.push(logger);\n\t\t\t// Update in case the logLevel of added logger is less than the current.\n\t\t\tthis.calculateMinLogLevel();\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\tfor (const logger of this.loggers) {\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): PerformanceEvent {\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): 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): Promise<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(): number {\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?.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(): void {\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(): void {\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?: unknown): 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(\n\t\teventNameSuffix: string,\n\t\tprops?: ITelemetryProperties,\n\t\terror?: unknown,\n\t): void {\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 * Null logger that no-ops for all telemetry events passed to it.\n * @deprecated - This will be removed in a future release.\n * For internal use within the FluidFramework codebase, use {@link createChildLogger} with no arguments instead.\n * For external consumers we recommend writing a trivial implementation of {@link @fluidframework/core-interfaces#ITelemetryBaseLogger}\n * where the send() method does nothing and using that.\n */\nexport class TelemetryNullLogger implements ITelemetryLoggerExt {\n\tpublic send(event: ITelemetryBaseEvent): void {}\n\tpublic sendTelemetryEvent(event: ITelemetryGenericEvent, error?: unknown): void {}\n\tpublic sendErrorEvent(event: ITelemetryErrorEvent, error?: unknown): void {}\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: unknown): 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 a flat array or object - returns a stringified version of the array/object.\n * If the value is an object of type Tagged<TelemetryEventPropertyType> - 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 | Tagged<TelemetryEventPropertyTypeExt>,\n): TelemetryEventPropertyType | Tagged<TelemetryEventPropertyType> {\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\t}\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\t}\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\t}\n\t}\n}\n\nexport const tagData = <\n\tT extends TelemetryDataTag,\n\tV extends Record<\n\t\tstring,\n\t\tTelemetryBaseEventPropertyType | (() => TelemetryBaseEventPropertyType)\n\t>,\n>(\n\ttag: T,\n\tvalues: V,\n): {\n\t[P in keyof V]:\n\t\t| (V[P] extends () => TelemetryBaseEventPropertyType\n\t\t\t\t? () => {\n\t\t\t\t\t\tvalue: ReturnType<V[P]>;\n\t\t\t\t\t\ttag: T;\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tvalue: Exclude<V[P], undefined>;\n\t\t\t\t\t\ttag: T;\n\t\t\t\t })\n\t\t| (V[P] extends undefined ? undefined : never);\n} =>\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\tObject.entries(values)\n\t\t.filter((e) => e[1] !== undefined)\n\t\t// eslint-disable-next-line unicorn/no-array-reduce, unicorn/prefer-object-from-entries\n\t\t.reduce((pv, cv) => {\n\t\t\tconst [key, value] = cv;\n\t\t\t// The ternary form is less legible in this case.\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (typeof value === \"function\") {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\t\t\tpv[key] = () => {\n\t\t\t\t\treturn { tag, value: value() };\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tpv[key] = { tag, value };\n\t\t\t}\n\t\t\treturn pv;\n\t\t}, {}) as ReturnType<typeof tagData>;\n\n/**\n * Helper function to tag telemetry properties as CodeArtifacts. It supports properties of type\n * TelemetryBaseEventPropertyType as well as getters that return TelemetryBaseEventPropertyType.\n */\nexport const tagCodeArtifacts = <\n\tT extends Record<\n\t\tstring,\n\t\tTelemetryBaseEventPropertyType | (() => TelemetryBaseEventPropertyType)\n\t>,\n>(\n\tvalues: T,\n): {\n\t[P in keyof T]:\n\t\t| (T[P] extends () => TelemetryBaseEventPropertyType\n\t\t\t\t? () => {\n\t\t\t\t\t\tvalue: ReturnType<T[P]>;\n\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact;\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tvalue: Exclude<T[P], undefined>;\n\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact;\n\t\t\t\t })\n\t\t| (T[P] extends undefined ? undefined : never);\n} => tagData<TelemetryDataTag.CodeArtifact, T>(TelemetryDataTag.CodeArtifact, values);\n"]}
|
package/lib/telemetryTypes.d.ts
CHANGED
|
@@ -10,12 +10,12 @@ import { ITelemetryBaseLogger, LogLevel, Tagged } from "@fluidframework/core-int
|
|
|
10
10
|
* error - Error log event, ideally 0 of these are logged during a session
|
|
11
11
|
* performance - Includes duration, and often has _start, _end, or _cancel suffixes for activity tracking
|
|
12
12
|
*/
|
|
13
|
-
export
|
|
13
|
+
export type TelemetryEventCategory = "generic" | "error" | "performance";
|
|
14
14
|
/**
|
|
15
15
|
* Property types that can be logged.
|
|
16
16
|
* Includes extra types beyond TelemetryBaseEventPropertyType, which must be converted before sending to a base logger
|
|
17
17
|
*/
|
|
18
|
-
export
|
|
18
|
+
export type TelemetryEventPropertyTypeExt = string | number | boolean | undefined | (string | number | boolean)[] | {
|
|
19
19
|
[key: string]: // Flat objects can have the same properties as the event itself
|
|
20
20
|
string | number | boolean | undefined | (string | number | boolean)[];
|
|
21
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetryTypes.d.ts","sourceRoot":"","sources":["../src/telemetryTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAEzF;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"telemetryTypes.d.ts","sourceRoot":"","sources":["../src/telemetryTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAEzF;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAEzE;;;GAGG;AACH,MAAM,MAAM,6BAA6B,GACtC,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,GACT,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,GAC7B;IACA,CAAC,GAAG,EAAE,MAAM,GACZ,AADe,gEAAgE;IAC/E,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;CACrE,CAAC;AAEL;;;;;;GAMG;AACH,MAAM,WAAW,+BAA+B;IAC/C,KAAK,EAAE,6BAA6B,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,CAAC,KAAK,EAAE,MAAM,GAAG,6BAA6B,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;CACvF;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACvE,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA8B,SAAQ,yBAAyB;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAChE;;;;;OAKG;IACH,kBAAkB,CACjB,KAAK,EAAE,yBAAyB,EAChC,KAAK,CAAC,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,OAAO,GAAG,OAAO,QAAQ,CAAC,OAAO,GAC1D,IAAI,CAAC;IAER;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,uBAAuB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAEtE;;;;;OAKG;IACH,oBAAoB,CACnB,KAAK,EAAE,6BAA6B,EACpC,KAAK,CAAC,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,OAAO,GAAG,OAAO,QAAQ,CAAC,OAAO,GAC1D,IAAI,CAAC;CACR"}
|
package/lib/utils.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { ITelemetryBaseLogger, ITelemetryGenericEvent } from "@fluidframework/co
|
|
|
8
8
|
* @param condition - The condition to attest too
|
|
9
9
|
* @param logger - The logger to log with
|
|
10
10
|
* @param event - The string or event to log
|
|
11
|
-
* @returns
|
|
11
|
+
* @returns The outcome of the condition
|
|
12
12
|
*/
|
|
13
13
|
export declare function logIfFalse(condition: unknown, logger: ITelemetryBaseLogger, event: string | ITelemetryGenericEvent): condition is true;
|
|
14
14
|
//# sourceMappingURL=utils.d.ts.map
|
package/lib/utils.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @param condition - The condition to attest too
|
|
4
4
|
* @param logger - The logger to log with
|
|
5
5
|
* @param event - The string or event to log
|
|
6
|
-
* @returns
|
|
6
|
+
* @returns The outcome of the condition
|
|
7
7
|
*/
|
|
8
8
|
export function logIfFalse(condition, logger, event) {
|
|
9
9
|
if (condition) {
|
package/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACzB,SAAkB,EAClB,MAA4B,EAC5B,KAAsC;IAEtC,IAAI,SAAS,EAAE;QACd,OAAO,IAAI,CAAC;KACZ;IACD,MAAM,QAAQ,GACb,OAAO,KAAK,KAAK,QAAQ;QACxB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACzC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryGenericEvent,\n} from \"@fluidframework/core-interfaces\";\n\n/**\n * Like assert, but logs only if the condition is false, rather than throwing\n * @param condition - The condition to attest too\n * @param logger - The logger to log with\n * @param event - The string or event to log\n * @returns
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACzB,SAAkB,EAClB,MAA4B,EAC5B,KAAsC;IAEtC,IAAI,SAAS,EAAE;QACd,OAAO,IAAI,CAAC;KACZ;IACD,MAAM,QAAQ,GACb,OAAO,KAAK,KAAK,QAAQ;QACxB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACzC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryGenericEvent,\n} from \"@fluidframework/core-interfaces\";\n\n/**\n * Like assert, but logs only if the condition is false, rather than throwing\n * @param condition - The condition to attest too\n * @param logger - The logger to log with\n * @param event - The string or event to log\n * @returns The outcome of the condition\n */\nexport function logIfFalse(\n\tcondition: unknown,\n\tlogger: ITelemetryBaseLogger,\n\tevent: string | ITelemetryGenericEvent,\n): condition is true {\n\tif (condition) {\n\t\treturn true;\n\t}\n\tconst newEvent: ITelemetryBaseEvent =\n\t\ttypeof event === \"string\"\n\t\t\t? { eventName: event, category: \"error\" }\n\t\t\t: { category: \"error\", ...event };\n\tlogger.send(newEvent);\n\treturn false;\n}\n"]}
|