@fluidframework/telemetry-utils 2.0.0-internal.6.2.0 → 2.0.0-internal.6.3.1

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.
Files changed (55) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/errorLogging.d.ts +7 -7
  3. package/dist/errorLogging.d.ts.map +1 -1
  4. package/dist/errorLogging.js.map +1 -1
  5. package/dist/eventEmitterWithErrorHandling.d.ts +1 -1
  6. package/dist/eventEmitterWithErrorHandling.d.ts.map +1 -1
  7. package/dist/eventEmitterWithErrorHandling.js +6 -2
  8. package/dist/eventEmitterWithErrorHandling.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/logger.d.ts +13 -9
  13. package/dist/logger.d.ts.map +1 -1
  14. package/dist/logger.js +34 -14
  15. package/dist/logger.js.map +1 -1
  16. package/dist/mockLogger.d.ts +3 -1
  17. package/dist/mockLogger.d.ts.map +1 -1
  18. package/dist/mockLogger.js +4 -3
  19. package/dist/mockLogger.js.map +1 -1
  20. package/dist/sampledTelemetryHelper.js +3 -3
  21. package/dist/sampledTelemetryHelper.js.map +1 -1
  22. package/dist/telemetryTypes.d.ts +15 -5
  23. package/dist/telemetryTypes.d.ts.map +1 -1
  24. package/dist/telemetryTypes.js.map +1 -1
  25. package/lib/errorLogging.d.ts +7 -7
  26. package/lib/errorLogging.d.ts.map +1 -1
  27. package/lib/errorLogging.js.map +1 -1
  28. package/lib/eventEmitterWithErrorHandling.d.ts +1 -1
  29. package/lib/eventEmitterWithErrorHandling.d.ts.map +1 -1
  30. package/lib/eventEmitterWithErrorHandling.js +5 -1
  31. package/lib/eventEmitterWithErrorHandling.js.map +1 -1
  32. package/lib/index.d.ts +1 -1
  33. package/lib/index.d.ts.map +1 -1
  34. package/lib/index.js.map +1 -1
  35. package/lib/logger.d.ts +13 -9
  36. package/lib/logger.d.ts.map +1 -1
  37. package/lib/logger.js +30 -10
  38. package/lib/logger.js.map +1 -1
  39. package/lib/mockLogger.d.ts +3 -1
  40. package/lib/mockLogger.d.ts.map +1 -1
  41. package/lib/mockLogger.js +3 -2
  42. package/lib/mockLogger.js.map +1 -1
  43. package/lib/sampledTelemetryHelper.js +1 -1
  44. package/lib/sampledTelemetryHelper.js.map +1 -1
  45. package/lib/telemetryTypes.d.ts +15 -5
  46. package/lib/telemetryTypes.d.ts.map +1 -1
  47. package/lib/telemetryTypes.js.map +1 -1
  48. package/package.json +12 -15
  49. package/src/errorLogging.ts +20 -22
  50. package/src/eventEmitterWithErrorHandling.ts +1 -1
  51. package/src/index.ts +1 -0
  52. package/src/logger.ts +38 -14
  53. package/src/mockLogger.ts +8 -2
  54. package/src/sampledTelemetryHelper.ts +1 -1
  55. package/src/telemetryTypes.ts +16 -9
@@ -5,9 +5,9 @@
5
5
 
6
6
  import {
7
7
  ILoggingError,
8
- ITaggedTelemetryPropertyType,
9
- ITelemetryProperties,
10
- TelemetryEventPropertyType,
8
+ ITelemetryBaseProperties,
9
+ TelemetryBaseEventPropertyType,
10
+ Tagged,
11
11
  } from "@fluidframework/core-interfaces";
12
12
  import { v4 as uuid } from "uuid";
13
13
  import {
@@ -16,11 +16,7 @@ import {
16
16
  isFluidError,
17
17
  isValidLegacyError,
18
18
  } from "./fluidErrorBase";
19
- import {
20
- ITaggedTelemetryPropertyTypeExt,
21
- ITelemetryLoggerExt,
22
- TelemetryEventPropertyTypeExt,
23
- } from "./telemetryTypes";
19
+ import { ITelemetryLoggerExt, TelemetryEventPropertyTypeExt } from "./telemetryTypes";
24
20
 
25
21
  /**
26
22
  * Determines if the provided value is an object but neither null nor an array.
@@ -87,8 +83,8 @@ export const isILoggingError = (x: unknown): x is ILoggingError =>
87
83
  * Copy props from source onto target, but do not overwrite an existing prop that matches
88
84
  */
89
85
  function copyProps(
90
- target: ITelemetryProperties | LoggingError,
91
- source: ITelemetryProperties,
86
+ target: ITelemetryBaseProperties | LoggingError,
87
+ source: ITelemetryBaseProperties,
92
88
  ): void {
93
89
  for (const key of Object.keys(source)) {
94
90
  if (target[key] === undefined) {
@@ -104,7 +100,7 @@ export interface IFluidErrorAnnotations {
104
100
  /**
105
101
  * Telemetry props to log with the error
106
102
  */
107
- props?: ITelemetryProperties;
103
+ props?: ITelemetryBaseProperties;
108
104
  }
109
105
 
110
106
  /**
@@ -319,9 +315,9 @@ export function isExternalError(error: unknown): boolean {
319
315
  * Type guard to identify if a particular telemetry property appears to be a tagged telemetry property
320
316
  */
321
317
  export function isTaggedTelemetryPropertyValue(
322
- x: ITaggedTelemetryPropertyTypeExt | TelemetryEventPropertyTypeExt,
323
- ): x is ITaggedTelemetryPropertyType | ITaggedTelemetryPropertyTypeExt {
324
- return typeof (x as Partial<ITaggedTelemetryPropertyTypeExt>)?.tag === "string";
318
+ x: Tagged<TelemetryEventPropertyTypeExt> | TelemetryEventPropertyTypeExt,
319
+ ): x is Tagged<TelemetryEventPropertyTypeExt> {
320
+ return typeof (x as Partial<Tagged<unknown>>)?.tag === "string";
325
321
  }
326
322
 
327
323
  /**
@@ -330,7 +326,7 @@ export function isTaggedTelemetryPropertyValue(
330
326
  * @returns - as-is if x is primitive. returns stringified if x is an array of primitive.
331
327
  * otherwise returns null since this is what we support at the moment.
332
328
  */
333
- function filterValidTelemetryProps(x: unknown, key: string): TelemetryEventPropertyType {
329
+ function filterValidTelemetryProps(x: unknown, key: string): TelemetryBaseEventPropertyType {
334
330
  if (Array.isArray(x) && x.every((val) => isTelemetryEventPropertyValue(val))) {
335
331
  return JSON.stringify(x);
336
332
  }
@@ -343,7 +339,7 @@ function filterValidTelemetryProps(x: unknown, key: string): TelemetryEventPrope
343
339
  }
344
340
 
345
341
  // checking type of x, returns false if x is null
346
- function isTelemetryEventPropertyValue(x: unknown): x is TelemetryEventPropertyType {
342
+ function isTelemetryEventPropertyValue(x: unknown): x is TelemetryBaseEventPropertyType {
347
343
  switch (typeof x) {
348
344
  case "string":
349
345
  case "number":
@@ -357,13 +353,15 @@ function isTelemetryEventPropertyValue(x: unknown): x is TelemetryEventPropertyT
357
353
  /**
358
354
  * Walk an object's enumerable properties to find those fit for telemetry.
359
355
  */
360
- function getValidTelemetryProps(obj: object, keysToOmit: Set<string>): ITelemetryProperties {
361
- const props: ITelemetryProperties = {};
356
+ function getValidTelemetryProps(obj: object, keysToOmit: Set<string>): ITelemetryBaseProperties {
357
+ const props: ITelemetryBaseProperties = {};
362
358
  for (const key of Object.keys(obj)) {
363
359
  if (keysToOmit.has(key)) {
364
360
  continue;
365
361
  }
366
- const val = obj[key] as ITaggedTelemetryPropertyTypeExt | TelemetryEventPropertyTypeExt;
362
+ const val = obj[key] as
363
+ | TelemetryEventPropertyTypeExt
364
+ | Tagged<TelemetryEventPropertyTypeExt>;
367
365
 
368
366
  // ensure only valid props get logged, since props of logging error could be in any shape
369
367
  if (isTaggedTelemetryPropertyValue(val)) {
@@ -435,7 +433,7 @@ export class LoggingError
435
433
  */
436
434
  constructor(
437
435
  message: string,
438
- props?: ITelemetryProperties,
436
+ props?: ITelemetryBaseProperties,
439
437
  private readonly omitPropsFromLogging: Set<string> = new Set(),
440
438
  ) {
441
439
  super(message);
@@ -468,14 +466,14 @@ export class LoggingError
468
466
  /**
469
467
  * Add additional properties to be logged
470
468
  */
471
- public addTelemetryProperties(props: ITelemetryProperties): void {
469
+ public addTelemetryProperties(props: ITelemetryBaseProperties): void {
472
470
  copyProps(this, props);
473
471
  }
474
472
 
475
473
  /**
476
474
  * Get all properties fit to be logged to telemetry for this error
477
475
  */
478
- public getTelemetryProperties(): ITelemetryProperties {
476
+ public getTelemetryProperties(): ITelemetryBaseProperties {
479
477
  const taggableProps = getValidTelemetryProps(this, this.omitPropsFromLogging);
480
478
  // Include non-enumerable props that are not returned by getValidTelemetryProps
481
479
  return {
@@ -2,8 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ import { TypedEventEmitter, EventEmitterEventType } from "@fluid-internal/client-utils";
5
6
  import { IEvent } from "@fluidframework/core-interfaces";
6
- import { TypedEventEmitter, EventEmitterEventType } from "@fluidframework/common-utils";
7
7
 
8
8
  /**
9
9
  * Event Emitter helper class
package/src/index.ts CHANGED
@@ -77,4 +77,5 @@ export {
77
77
  ITelemetryLoggerExt,
78
78
  ITaggedTelemetryPropertyTypeExt,
79
79
  ITelemetryPropertiesExt,
80
+ TelemetryEventCategory,
80
81
  } from "./telemetryTypes";
package/src/logger.ts CHANGED
@@ -10,12 +10,12 @@ import {
10
10
  ITelemetryGenericEvent,
11
11
  ITelemetryPerformanceEvent,
12
12
  ITelemetryProperties,
13
- TelemetryEventPropertyType,
14
- ITaggedTelemetryPropertyType,
15
- TelemetryEventCategory,
13
+ TelemetryBaseEventPropertyType as TelemetryEventPropertyType,
16
14
  LogLevel,
15
+ Tagged,
16
+ ITelemetryBaseProperties,
17
17
  } from "@fluidframework/core-interfaces";
18
- import { IsomorphicPerformance, performance } from "@fluidframework/common-utils";
18
+ import { IsomorphicPerformance, performance } from "@fluid-internal/client-utils";
19
19
  import { CachedConfigProvider, loggerIsMonitoringContext, mixinMonitoringContext } from "./config";
20
20
  import {
21
21
  isILoggingError,
@@ -24,13 +24,12 @@ import {
24
24
  isTaggedTelemetryPropertyValue,
25
25
  } from "./errorLogging";
26
26
  import {
27
- ITaggedTelemetryPropertyTypeExt,
28
27
  ITelemetryEventExt,
29
28
  ITelemetryGenericEventExt,
30
29
  ITelemetryLoggerExt,
31
30
  ITelemetryPerformanceEventExt,
32
- ITelemetryPropertiesExt,
33
31
  TelemetryEventPropertyTypeExt,
32
+ TelemetryEventCategory,
34
33
  } from "./telemetryTypes";
35
34
 
36
35
  export interface Memory {
@@ -55,7 +54,7 @@ export enum TelemetryDataTag {
55
54
  UserData = "UserData",
56
55
  }
57
56
 
58
- export type TelemetryEventPropertyTypes = TelemetryEventPropertyType | ITaggedTelemetryPropertyType;
57
+ export type TelemetryEventPropertyTypes = ITelemetryBaseProperties[string];
59
58
 
60
59
  export interface ITelemetryLoggerPropertyBag {
61
60
  [index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);
@@ -160,7 +159,7 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
160
159
  public sendTelemetryEvent(
161
160
  event: ITelemetryGenericEventExt,
162
161
  error?: unknown,
163
- logLevel: LogLevel.verbose | LogLevel.default = LogLevel.default,
162
+ logLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,
164
163
  ): void {
165
164
  this.sendTelemetryEventCore(
166
165
  { ...event, category: event.category ?? "generic" },
@@ -225,7 +224,7 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
225
224
  public sendPerformanceEvent(
226
225
  event: ITelemetryPerformanceEventExt,
227
226
  error?: unknown,
228
- logLevel: LogLevel.verbose | LogLevel.default = LogLevel.default,
227
+ logLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,
229
228
  ): void {
230
229
  const perfEvent = {
231
230
  ...event,
@@ -424,7 +423,11 @@ export class ChildLogger extends TelemetryLogger {
424
423
  }
425
424
  }
426
425
 
427
- private shouldFilterOutEvent(event: ITelemetryPropertiesExt, logLevel?: LogLevel): boolean {
426
+ public get minLogLevel(): LogLevel | undefined {
427
+ return this.baseLogger.minLogLevel;
428
+ }
429
+
430
+ private shouldFilterOutEvent(event: ITelemetryBaseEvent, logLevel?: LogLevel): boolean {
428
431
  const eventLogLevel = logLevel ?? LogLevel.default;
429
432
  const configLogLevel = this.baseLogger.minLogLevel ?? LogLevel.default;
430
433
  // Filter out in case event log level is below what is wanted in config.
@@ -469,6 +472,9 @@ export function createMultiSinkLogger(props: {
469
472
  */
470
473
  export class MultiSinkLogger extends TelemetryLogger {
471
474
  protected loggers: ITelemetryBaseLogger[];
475
+ // This is minimum of minLlogLevel of all loggers.
476
+ private _minLogLevelOfAllLoggers: LogLevel;
477
+
472
478
  /**
473
479
  * Create multiple sink logger (i.e. logger that sends events to multiple sinks)
474
480
  * @param namespace - Telemetry event name prefix to add to all events
@@ -500,6 +506,22 @@ export class MultiSinkLogger extends TelemetryLogger {
500
506
 
501
507
  super(namespace, realProperties);
502
508
  this.loggers = loggers;
509
+ this._minLogLevelOfAllLoggers = LogLevel.default;
510
+ this.calculateMinLogLevel();
511
+ }
512
+
513
+ public get minLogLevel(): LogLevel {
514
+ return this._minLogLevelOfAllLoggers;
515
+ }
516
+
517
+ private calculateMinLogLevel(): void {
518
+ if (this.loggers.length > 0) {
519
+ const logLevels: LogLevel[] = [];
520
+ for (const logger of this.loggers) {
521
+ logLevels.push(logger.minLogLevel ?? LogLevel.default);
522
+ }
523
+ this._minLogLevelOfAllLoggers = Math.min(...logLevels) as LogLevel;
524
+ }
503
525
  }
504
526
 
505
527
  /**
@@ -509,6 +531,8 @@ export class MultiSinkLogger extends TelemetryLogger {
509
531
  public addLogger(logger?: ITelemetryBaseLogger): void {
510
532
  if (logger !== undefined && logger !== null) {
511
533
  this.loggers.push(logger);
534
+ // Update in case the logLevel of added logger is less than the current.
535
+ this.calculateMinLogLevel();
512
536
  }
513
537
  }
514
538
 
@@ -720,15 +744,15 @@ function convertToBaseEvent({
720
744
  /**
721
745
  * Takes in value, and does one of 4 things.
722
746
  * if value is of primitive type - returns the original value.
723
- * If the value is an array of primitives - returns a stringified version of the array.
724
- * If the value is an object of type ITaggedTelemetryPropertyType - returns the object
747
+ * If the value is a flat array or object - returns a stringified version of the array/object.
748
+ * If the value is an object of type Tagged<TelemetryEventPropertyType> - returns the object
725
749
  * with its values recursively converted to base property Type.
726
750
  * If none of these cases are reached - returns an error string
727
751
  * @param x - value passed in to convert to a base property type
728
752
  */
729
753
  export function convertToBasePropertyType(
730
- x: TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,
731
- ): TelemetryEventPropertyType | ITaggedTelemetryPropertyType {
754
+ x: TelemetryEventPropertyTypeExt | Tagged<TelemetryEventPropertyTypeExt>,
755
+ ): TelemetryEventPropertyType | Tagged<TelemetryEventPropertyType> {
732
756
  return isTaggedTelemetryPropertyValue(x)
733
757
  ? {
734
758
  value: convertToBasePropertyTypeUntagged(x.value),
package/src/mockLogger.ts CHANGED
@@ -3,8 +3,12 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryBaseEvent, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
7
- import { assert } from "@fluidframework/common-utils";
6
+ import {
7
+ ITelemetryBaseEvent,
8
+ ITelemetryBaseLogger,
9
+ LogLevel,
10
+ } from "@fluidframework/core-interfaces";
11
+ import { assert } from "@fluidframework/core-utils";
8
12
  import { ITelemetryLoggerExt, ITelemetryPropertiesExt } from "./telemetryTypes";
9
13
  import { createChildLogger } from "./logger";
10
14
 
@@ -15,6 +19,8 @@ import { createChildLogger } from "./logger";
15
19
  export class MockLogger implements ITelemetryBaseLogger {
16
20
  events: ITelemetryBaseEvent[] = [];
17
21
 
22
+ constructor(public readonly minLogLevel?: LogLevel) {}
23
+
18
24
  clear(): void {
19
25
  this.events = [];
20
26
  }
@@ -9,7 +9,7 @@ import {
9
9
  ITelemetryProperties,
10
10
  IDisposable,
11
11
  } from "@fluidframework/core-interfaces";
12
- import { performance } from "@fluidframework/common-utils";
12
+ import { performance } from "@fluid-internal/client-utils";
13
13
  import { ITelemetryLoggerExt } from "./telemetryTypes";
14
14
 
15
15
  /**
@@ -3,15 +3,20 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import {
7
- ITelemetryBaseLogger,
8
- LogLevel,
9
- TelemetryEventCategory,
10
- } from "@fluidframework/core-interfaces";
6
+ import { ITelemetryBaseLogger, LogLevel, Tagged } from "@fluidframework/core-interfaces";
7
+
8
+ /**
9
+ * The categories FF uses when instrumenting the code.
10
+ *
11
+ * generic - Informational log event
12
+ * error - Error log event, ideally 0 of these are logged during a session
13
+ * performance - Includes duration, and often has _start, _end, or _cancel suffixes for activity tracking
14
+ */
15
+ export type TelemetryEventCategory = "generic" | "error" | "performance";
11
16
 
12
17
  /**
13
18
  * Property types that can be logged.
14
- * Includes extra types beyond TelemetryEventPropertyType (which will be deprecated in favor of this one)
19
+ * Includes extra types beyond TelemetryBaseEventPropertyType, which must be converted before sending to a base logger
15
20
  */
16
21
  export type TelemetryEventPropertyTypeExt =
17
22
  | string
@@ -28,6 +33,8 @@ export type TelemetryEventPropertyTypeExt =
28
33
  * A property to be logged to telemetry containing both the value and a tag. Tags are generic strings that can be used
29
34
  * to mark pieces of information that should be organized or handled differently by loggers in various first or third
30
35
  * party scenarios. For example, tags are used to mark personal information that should not be stored in logs.
36
+ *
37
+ * @deprecated Use Tagged<TelemetryEventPropertyTypeExt>
31
38
  */
32
39
  export interface ITaggedTelemetryPropertyTypeExt {
33
40
  value: TelemetryEventPropertyTypeExt;
@@ -38,7 +45,7 @@ export interface ITaggedTelemetryPropertyTypeExt {
38
45
  * JSON-serializable properties, which will be logged with telemetry.
39
46
  */
40
47
  export interface ITelemetryPropertiesExt {
41
- [index: string]: TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt;
48
+ [index: string]: TelemetryEventPropertyTypeExt | Tagged<TelemetryEventPropertyTypeExt>;
42
49
  }
43
50
 
44
51
  /**
@@ -92,7 +99,7 @@ export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
92
99
  sendTelemetryEvent(
93
100
  event: ITelemetryGenericEventExt,
94
101
  error?: unknown,
95
- logLevel?: LogLevel.verbose | LogLevel.default,
102
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.default,
96
103
  ): void;
97
104
 
98
105
  /**
@@ -111,6 +118,6 @@ export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
111
118
  sendPerformanceEvent(
112
119
  event: ITelemetryPerformanceEventExt,
113
120
  error?: unknown,
114
- logLevel?: LogLevel.verbose | LogLevel.default,
121
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.default,
115
122
  ): void;
116
123
  }