@fluidframework/telemetry-utils 2.0.0-dev-rc.5.0.0.271717 → 2.0.0-dev-rc.5.0.0.272251

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 (94) hide show
  1. package/.eslintrc.cjs +1 -1
  2. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  3. package/api-extractor/api-extractor-lint-legacy.cjs.json +5 -0
  4. package/api-extractor/api-extractor-lint-legacy.esm.json +5 -0
  5. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  6. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  7. package/api-report/telemetry-utils.alpha.api.md +13 -28
  8. package/api-report/telemetry-utils.beta.api.md +7 -7
  9. package/api-report/telemetry-utils.public.api.md +7 -7
  10. package/dist/config.d.ts +2 -2
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js.map +1 -1
  13. package/dist/error.d.ts +5 -5
  14. package/dist/error.d.ts.map +1 -1
  15. package/dist/error.js.map +1 -1
  16. package/dist/errorLogging.d.ts +1 -1
  17. package/dist/errorLogging.d.ts.map +1 -1
  18. package/dist/errorLogging.js +21 -8
  19. package/dist/errorLogging.js.map +1 -1
  20. package/dist/eventEmitterWithErrorHandling.d.ts +2 -2
  21. package/dist/eventEmitterWithErrorHandling.d.ts.map +1 -1
  22. package/dist/eventEmitterWithErrorHandling.js.map +1 -1
  23. package/dist/index.d.ts +6 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/logger.d.ts +3 -5
  27. package/dist/logger.d.ts.map +1 -1
  28. package/dist/logger.js.map +1 -1
  29. package/dist/mockLogger.d.ts +15 -7
  30. package/dist/mockLogger.d.ts.map +1 -1
  31. package/dist/mockLogger.js +16 -9
  32. package/dist/mockLogger.js.map +1 -1
  33. package/dist/sampledTelemetryHelper.d.ts +6 -2
  34. package/dist/sampledTelemetryHelper.d.ts.map +1 -1
  35. package/dist/sampledTelemetryHelper.js +10 -2
  36. package/dist/sampledTelemetryHelper.js.map +1 -1
  37. package/dist/telemetryTypes.d.ts +32 -18
  38. package/dist/telemetryTypes.d.ts.map +1 -1
  39. package/dist/telemetryTypes.js.map +1 -1
  40. package/dist/thresholdCounter.d.ts +1 -1
  41. package/dist/thresholdCounter.d.ts.map +1 -1
  42. package/dist/thresholdCounter.js.map +1 -1
  43. package/dist/utils.d.ts +1 -1
  44. package/dist/utils.d.ts.map +1 -1
  45. package/dist/utils.js.map +1 -1
  46. package/lib/config.d.ts +2 -2
  47. package/lib/config.d.ts.map +1 -1
  48. package/lib/config.js.map +1 -1
  49. package/lib/error.d.ts +5 -5
  50. package/lib/error.d.ts.map +1 -1
  51. package/lib/error.js.map +1 -1
  52. package/lib/errorLogging.d.ts +1 -1
  53. package/lib/errorLogging.d.ts.map +1 -1
  54. package/lib/errorLogging.js +21 -8
  55. package/lib/errorLogging.js.map +1 -1
  56. package/lib/eventEmitterWithErrorHandling.d.ts +2 -2
  57. package/lib/eventEmitterWithErrorHandling.d.ts.map +1 -1
  58. package/lib/eventEmitterWithErrorHandling.js.map +1 -1
  59. package/lib/index.d.ts +6 -6
  60. package/lib/index.d.ts.map +1 -1
  61. package/lib/index.js.map +1 -1
  62. package/lib/logger.d.ts +3 -5
  63. package/lib/logger.d.ts.map +1 -1
  64. package/lib/logger.js.map +1 -1
  65. package/lib/mockLogger.d.ts +15 -7
  66. package/lib/mockLogger.d.ts.map +1 -1
  67. package/lib/mockLogger.js +16 -9
  68. package/lib/mockLogger.js.map +1 -1
  69. package/lib/sampledTelemetryHelper.d.ts +6 -2
  70. package/lib/sampledTelemetryHelper.d.ts.map +1 -1
  71. package/lib/sampledTelemetryHelper.js +10 -2
  72. package/lib/sampledTelemetryHelper.js.map +1 -1
  73. package/lib/telemetryTypes.d.ts +32 -18
  74. package/lib/telemetryTypes.d.ts.map +1 -1
  75. package/lib/telemetryTypes.js.map +1 -1
  76. package/lib/thresholdCounter.d.ts +1 -1
  77. package/lib/thresholdCounter.d.ts.map +1 -1
  78. package/lib/thresholdCounter.js.map +1 -1
  79. package/lib/utils.d.ts +1 -1
  80. package/lib/utils.d.ts.map +1 -1
  81. package/lib/utils.js.map +1 -1
  82. package/package.json +16 -7
  83. package/src/config.ts +10 -10
  84. package/src/error.ts +13 -13
  85. package/src/errorLogging.ts +27 -14
  86. package/src/eventEmitterWithErrorHandling.ts +3 -3
  87. package/src/index.ts +11 -11
  88. package/src/logger.ts +11 -10
  89. package/src/mockLogger.ts +34 -20
  90. package/src/sampledTelemetryHelper.ts +15 -5
  91. package/src/telemetryTypes.ts +38 -19
  92. package/src/thresholdCounter.ts +1 -1
  93. package/src/utils.ts +2 -2
  94. package/tsdoc.json +4 -0
package/src/logger.ts CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  import { performance } from "@fluid-internal/client-utils";
7
7
  import {
8
- ITelemetryBaseEvent,
9
- ITelemetryBaseLogger,
8
+ type ITelemetryBaseEvent,
9
+ type ITelemetryBaseLogger,
10
10
  LogLevel,
11
- Tagged,
12
- TelemetryBaseEventPropertyType,
11
+ type Tagged,
12
+ type TelemetryBaseEventPropertyType,
13
13
  } from "@fluidframework/core-interfaces";
14
14
 
15
15
  import {
@@ -23,8 +23,8 @@ import {
23
23
  isILoggingError,
24
24
  isTaggedTelemetryPropertyValue,
25
25
  } from "./errorLogging.js";
26
- import {
27
- type ITelemetryErrorEventExt,
26
+ import type {
27
+ ITelemetryErrorEventExt,
28
28
  ITelemetryEventExt,
29
29
  ITelemetryGenericEventExt,
30
30
  ITelemetryLoggerExt,
@@ -60,9 +60,10 @@ export type TelemetryEventPropertyTypes = ITelemetryPropertiesExt[string];
60
60
  /**
61
61
  * @alpha
62
62
  */
63
- export interface ITelemetryLoggerPropertyBag {
64
- [index: string]: TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes);
65
- }
63
+ export type ITelemetryLoggerPropertyBag = Record<
64
+ string,
65
+ TelemetryEventPropertyTypes | (() => TelemetryEventPropertyTypes)
66
+ >;
66
67
 
67
68
  /**
68
69
  * @alpha
@@ -533,7 +534,7 @@ export class MultiSinkLogger extends TelemetryLogger {
533
534
  * @param loggers - The list of loggers to use as sinks
534
535
  * @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
535
536
  */
536
- constructor(
537
+ public constructor(
537
538
  namespace?: string,
538
539
  properties?: ITelemetryLoggerPropertyBags,
539
540
  loggers: ITelemetryBaseLogger[] = [],
package/src/mockLogger.ts CHANGED
@@ -4,36 +4,51 @@
4
4
  */
5
5
 
6
6
  import {
7
- ITelemetryBaseEvent,
8
- ITelemetryBaseLogger,
7
+ type ITelemetryBaseEvent,
8
+ type ITelemetryBaseLogger,
9
9
  LogLevel,
10
10
  } from "@fluidframework/core-interfaces";
11
11
  import { assert } from "@fluidframework/core-utils/internal";
12
12
 
13
13
  import { createChildLogger } from "./logger.js";
14
- import { ITelemetryLoggerExt, ITelemetryPropertiesExt } from "./telemetryTypes.js";
14
+ import type { ITelemetryLoggerExt, ITelemetryPropertiesExt } from "./telemetryTypes.js";
15
15
 
16
16
  /**
17
- * The MockLogger records events sent to it, and then can walk back over those events
18
- * searching for a set of expected events to match against the logged events.
17
+ * Mock {@link @fluidframework/core-interfaces#ITelemetryBaseLogger} implementation.
18
+ *
19
+ * Records events sent to it, and then can walk back over those events, searching for a set of expected events to
20
+ * match against the logged events.
19
21
  *
20
22
  * @alpha
21
23
  */
22
24
  export class MockLogger implements ITelemetryBaseLogger {
23
- events: ITelemetryBaseEvent[] = [];
25
+ // TODO: don't expose mutability to external consumers
26
+ public events: ITelemetryBaseEvent[] = [];
24
27
 
25
- constructor(public readonly minLogLevel?: LogLevel) {}
28
+ /**
29
+ * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseLogger.minLogLevel}
30
+ */
31
+ public readonly minLogLevel: LogLevel;
32
+
33
+ public constructor(minLogLevel?: LogLevel) {
34
+ this.minLogLevel = minLogLevel ?? LogLevel.default;
35
+ }
26
36
 
27
- clear(): void {
37
+ public clear(): void {
28
38
  this.events = [];
29
39
  }
30
40
 
31
- toTelemetryLogger(): ITelemetryLoggerExt {
41
+ public toTelemetryLogger(): ITelemetryLoggerExt {
32
42
  return createChildLogger({ logger: this });
33
43
  }
34
44
 
35
- send(event: ITelemetryBaseEvent): void {
36
- this.events.push(event);
45
+ /**
46
+ * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseLogger.send}
47
+ */
48
+ public send(event: ITelemetryBaseEvent, logLevel?: LogLevel): void {
49
+ if (logLevel ?? LogLevel.default >= this.minLogLevel) {
50
+ this.events.push(event);
51
+ }
37
52
  }
38
53
 
39
54
  /**
@@ -44,7 +59,7 @@ export class MockLogger implements ITelemetryBaseLogger {
44
59
  * These event objects may be subsets of the logged events.
45
60
  * Note: category is omitted from the type because it's usually uninteresting and tedious to type.
46
61
  */
47
- matchEvents(
62
+ public matchEvents(
48
63
  expectedEvents: Omit<ITelemetryBaseEvent, "category">[],
49
64
  inlineDetailsProp: boolean = false,
50
65
  ): boolean {
@@ -60,7 +75,7 @@ export class MockLogger implements ITelemetryBaseLogger {
60
75
  /**
61
76
  * Asserts that matchEvents is true, and prints the actual/expected output if not.
62
77
  */
63
- assertMatch(
78
+ public assertMatch(
64
79
  expectedEvents: Omit<ITelemetryBaseEvent, "category">[],
65
80
  message?: string,
66
81
  inlineDetailsProp: boolean = false,
@@ -85,7 +100,7 @@ ${JSON.stringify(actualEvents)}`);
85
100
  * Note: category is omitted from the type because it's usually uninteresting and tedious to type.
86
101
  * @returns if any of the expected events is found.
87
102
  */
88
- matchAnyEvent(
103
+ public matchAnyEvent(
89
104
  expectedEvents: Omit<ITelemetryBaseEvent, "category">[],
90
105
  inlineDetailsProp: boolean = false,
91
106
  ): boolean {
@@ -99,7 +114,7 @@ ${JSON.stringify(actualEvents)}`);
99
114
  /**
100
115
  * Asserts that matchAnyEvent is true, and prints the actual/expected output if not.
101
116
  */
102
- assertMatchAny(
117
+ public assertMatchAny(
103
118
  expectedEvents: Omit<ITelemetryBaseEvent, "category">[],
104
119
  message?: string,
105
120
  inlineDetailsProp: boolean = false,
@@ -123,7 +138,7 @@ ${JSON.stringify(actualEvents)}`);
123
138
  * These event objects may be subsets of the logged events.
124
139
  * Note: category is omitted from the type because it's usually uninteresting and tedious to type.
125
140
  */
126
- matchEventStrict(
141
+ public matchEventStrict(
127
142
  expectedEvents: Omit<ITelemetryBaseEvent, "category">[],
128
143
  inlineDetailsProp: boolean = false,
129
144
  ): boolean {
@@ -136,7 +151,7 @@ ${JSON.stringify(actualEvents)}`);
136
151
  /**
137
152
  * Asserts that matchEvents is true, and prints the actual/expected output if not
138
153
  */
139
- assertMatchStrict(
154
+ public assertMatchStrict(
140
155
  expectedEvents: Omit<ITelemetryBaseEvent, "category">[],
141
156
  message?: string,
142
157
  inlineDetailsProp: boolean = false,
@@ -155,7 +170,7 @@ ${JSON.stringify(actualEvents)}`);
155
170
  /**
156
171
  * Asserts that matchAnyEvent is false for the given events, and prints the actual/expected output if not
157
172
  */
158
- assertMatchNone(
173
+ public assertMatchNone(
159
174
  disallowedEvents: Omit<ITelemetryBaseEvent, "category">[],
160
175
  message?: string,
161
176
  inlineDetailsProp: boolean = false,
@@ -187,7 +202,7 @@ ${JSON.stringify(actualEvents)}`);
187
202
  }
188
203
 
189
204
  // Remove the events so far; next call will just compare subsequent events from here
190
- this.events = [];
205
+ this.clear();
191
206
 
192
207
  // Return the count of matched events.
193
208
  return iExpectedEvent;
@@ -208,7 +223,6 @@ ${JSON.stringify(actualEvents)}`);
208
223
  if (inlineDetailsProp && details !== undefined) {
209
224
  assert(
210
225
  typeof details === "string",
211
- // eslint-disable-next-line unicorn/numeric-separators-style
212
226
  0x6c9 /* Details should a JSON stringified string if inlineDetailsProp is true */,
213
227
  );
214
228
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
@@ -6,10 +6,10 @@
6
6
  import { performance } from "@fluid-internal/client-utils";
7
7
  import type { IDisposable, ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
8
8
 
9
- import {
10
- type ITelemetryGenericEventExt,
9
+ import type {
10
+ ITelemetryGenericEventExt,
11
11
  ITelemetryLoggerExt,
12
- type ITelemetryPerformanceEventExt,
12
+ ITelemetryPerformanceEventExt,
13
13
  } from "./telemetryTypes.js";
14
14
 
15
15
  /**
@@ -58,7 +58,14 @@ interface Measurements {
58
58
  * @internal
59
59
  */
60
60
  export class SampledTelemetryHelper implements IDisposable {
61
- disposed: boolean = false;
61
+ private _disposed: boolean = false;
62
+
63
+ /**
64
+ * {@inheritDoc @fluidframework/core-interfaces#IDisposable.disposed}
65
+ */
66
+ public get disposed(): boolean {
67
+ return this._disposed;
68
+ }
62
69
 
63
70
  private readonly measurementsMap = new Map<string, Measurements>();
64
71
 
@@ -145,6 +152,9 @@ export class SampledTelemetryHelper implements IDisposable {
145
152
  }
146
153
 
147
154
  public dispose(error?: Error | undefined): void {
148
- for (const [k] of this.measurementsMap.entries()) this.flushBucket(k);
155
+ for (const [k] of this.measurementsMap.entries()) {
156
+ this.flushBucket(k);
157
+ }
158
+ this._disposed = true;
149
159
  }
150
160
  }
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryBaseLogger, LogLevel, Tagged } from "@fluidframework/core-interfaces";
6
+ import type { ITelemetryBaseLogger, LogLevel, Tagged } from "@fluidframework/core-interfaces";
7
7
 
8
8
  /**
9
9
  * The categories FF uses when instrumenting the code.
@@ -31,10 +31,7 @@ export type TelemetryEventPropertyTypeExt =
31
31
  | boolean
32
32
  | undefined
33
33
  | (string | number | boolean)[]
34
- | {
35
- [key: string]: // Flat objects can have the same properties as the event itself
36
- string | number | boolean | undefined | (string | number | boolean)[];
37
- };
34
+ | Record<string, string | number | boolean | undefined | (string | number | boolean)[]>;
38
35
 
39
36
  /**
40
37
  * A property to be logged to telemetry containing both the value and a tag. Tags are generic strings that can be used
@@ -53,9 +50,10 @@ export interface ITaggedTelemetryPropertyTypeExt {
53
50
  * JSON-serializable properties, which will be logged with telemetry.
54
51
  * @alpha
55
52
  */
56
- export interface ITelemetryPropertiesExt {
57
- [index: string]: TelemetryEventPropertyTypeExt | Tagged<TelemetryEventPropertyTypeExt>;
58
- }
53
+ export type ITelemetryPropertiesExt = Record<
54
+ string,
55
+ TelemetryEventPropertyTypeExt | Tagged<TelemetryEventPropertyTypeExt>
56
+ >;
59
57
 
60
58
  /**
61
59
  * Interface for logging telemetry statements.
@@ -66,7 +64,14 @@ export interface ITelemetryPropertiesExt {
66
64
  * @internal
67
65
  */
68
66
  export interface ITelemetryEventExt extends ITelemetryPropertiesExt {
67
+ /**
68
+ * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseEvent.category}
69
+ */
69
70
  category: string;
71
+
72
+ /**
73
+ * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseEvent.eventName}
74
+ */
70
75
  eventName: string;
71
76
  }
72
77
 
@@ -76,7 +81,15 @@ export interface ITelemetryEventExt extends ITelemetryPropertiesExt {
76
81
  * @alpha
77
82
  */
78
83
  export interface ITelemetryGenericEventExt extends ITelemetryPropertiesExt {
84
+ /**
85
+ * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseEvent.eventName}
86
+ */
79
87
  eventName: string;
88
+
89
+ /**
90
+ * Optional event {@link @fluidframework/core-interfaces#ITelemetryBaseEvent.category}.
91
+ * @defaultValue "generic"
92
+ */
80
93
  category?: TelemetryEventCategory;
81
94
  }
82
95
 
@@ -86,6 +99,9 @@ export interface ITelemetryGenericEventExt extends ITelemetryPropertiesExt {
86
99
  * @alpha
87
100
  */
88
101
  export interface ITelemetryErrorEventExt extends ITelemetryPropertiesExt {
102
+ /**
103
+ * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseEvent.eventName}
104
+ */
89
105
  eventName: string;
90
106
  }
91
107
 
@@ -95,7 +111,10 @@ export interface ITelemetryErrorEventExt extends ITelemetryPropertiesExt {
95
111
  * @alpha
96
112
  */
97
113
  export interface ITelemetryPerformanceEventExt extends ITelemetryGenericEventExt {
98
- duration?: number; // Duration of event (optional)
114
+ /**
115
+ * Duration of event (optional)
116
+ */
117
+ duration?: number;
99
118
  }
100
119
 
101
120
  /**
@@ -108,10 +127,10 @@ export interface ITelemetryPerformanceEventExt extends ITelemetryGenericEventExt
108
127
  */
109
128
  export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
110
129
  /**
111
- * Send information telemetry event
112
- * @param event - Event to send
113
- * @param error - optional error object to log
114
- * @param logLevel - optional level of the log.
130
+ * Send an information telemetry event.
131
+ * @param event - Event to send.
132
+ * @param error - Optional error object to log.
133
+ * @param logLevel - Optional level of the log. Default: {@link @fluidframework/core-interfaces#LogLevel.default}.
115
134
  */
116
135
  sendTelemetryEvent(
117
136
  event: ITelemetryGenericEventExt,
@@ -120,17 +139,17 @@ export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
120
139
  ): void;
121
140
 
122
141
  /**
123
- * Send error telemetry event
124
- * @param event - Event to send
125
- * @param error - optional error object to log
142
+ * Send an error telemetry event.
143
+ * @param event - Event to send.
144
+ * @param error - Optional error object to log.
126
145
  */
127
146
  sendErrorEvent(event: ITelemetryErrorEventExt, error?: unknown): void;
128
147
 
129
148
  /**
130
- * Send performance telemetry event
149
+ * Send a performance telemetry event.
131
150
  * @param event - Event to send
132
- * @param error - optional error object to log
133
- * @param logLevel - optional level of the log.
151
+ * @param error - Optional error object to log.
152
+ * @param logLevel - Optional level of the log. Default: {@link @fluidframework/core-interfaces#LogLevel.default}.
134
153
  */
135
154
  sendPerformanceEvent(
136
155
  event: ITelemetryPerformanceEventExt,
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryLoggerExt } from "./telemetryTypes.js";
6
+ import type { ITelemetryLoggerExt } from "./telemetryTypes.js";
7
7
 
8
8
  /**
9
9
  * Utility counter which will send event only if the provided value is above a configured threshold.
package/src/utils.ts CHANGED
@@ -3,10 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryBaseEvent } from "@fluidframework/core-interfaces";
6
+ import type { ITelemetryBaseEvent } from "@fluidframework/core-interfaces";
7
7
 
8
8
  import { loggerToMonitoringContext } from "./config.js";
9
- import { ITelemetryGenericEventExt, ITelemetryLoggerExt } from "./telemetryTypes.js";
9
+ import type { ITelemetryGenericEventExt, ITelemetryLoggerExt } from "./telemetryTypes.js";
10
10
 
11
11
  /**
12
12
  * An object that contains a callback used in conjunction with the {@link createSampledLogger} utility function to provide custom logic for sampling events.
package/tsdoc.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json",
3
+ "extends": ["../../../common/build/build-common/tsdoc-base.json"]
4
+ }