@fluidframework/telemetry-utils 2.93.0 → 2.101.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.
Files changed (133) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/DEV.md +33 -0
  3. package/api-extractor/api-extractor-lint-api-bundle.json +5 -0
  4. package/api-extractor/api-extractor-lint-bundle.json +1 -1
  5. package/api-extractor.json +2 -1
  6. package/api-report/telemetry-utils.legacy.beta.api.md +10 -7
  7. package/dist/api.d.ts +26 -0
  8. package/dist/api.d.ts.map +1 -0
  9. package/dist/api.js +40 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/config.d.ts +6 -6
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +4 -1
  14. package/dist/config.js.map +1 -1
  15. package/dist/errorLogging.d.ts +2 -2
  16. package/dist/errorLogging.d.ts.map +1 -1
  17. package/dist/errorLogging.js.map +1 -1
  18. package/dist/events.d.ts +3 -3
  19. package/dist/events.d.ts.map +1 -1
  20. package/dist/events.js.map +1 -1
  21. package/dist/{index.d.ts → internal.d.ts} +16 -4
  22. package/dist/internal.d.ts.map +1 -0
  23. package/dist/{index.js → internal.js} +22 -5
  24. package/dist/internal.js.map +1 -0
  25. package/dist/legacy.d.ts +2 -2
  26. package/dist/logger.d.ts +61 -21
  27. package/dist/logger.d.ts.map +1 -1
  28. package/dist/logger.js +74 -29
  29. package/dist/logger.js.map +1 -1
  30. package/dist/main.d.ts +8 -0
  31. package/dist/main.d.ts.map +1 -0
  32. package/dist/main.js +13 -0
  33. package/dist/main.js.map +1 -0
  34. package/dist/mockLogger.d.ts +5 -4
  35. package/dist/mockLogger.d.ts.map +1 -1
  36. package/dist/mockLogger.js +2 -2
  37. package/dist/mockLogger.js.map +1 -1
  38. package/dist/public.d.ts +1 -1
  39. package/dist/sampledTelemetryHelper.d.ts +5 -2
  40. package/dist/sampledTelemetryHelper.d.ts.map +1 -1
  41. package/dist/sampledTelemetryHelper.js +6 -1
  42. package/dist/sampledTelemetryHelper.js.map +1 -1
  43. package/dist/telemetryEventBatcher.d.ts +2 -2
  44. package/dist/telemetryEventBatcher.d.ts.map +1 -1
  45. package/dist/telemetryEventBatcher.js.map +1 -1
  46. package/dist/telemetryTypes.d.ts +65 -6
  47. package/dist/telemetryTypes.d.ts.map +1 -1
  48. package/dist/telemetryTypes.js.map +1 -1
  49. package/dist/telemetryTypesUndeprecated.d.ts +36 -0
  50. package/dist/telemetryTypesUndeprecated.d.ts.map +1 -0
  51. package/dist/telemetryTypesUndeprecated.js +7 -0
  52. package/dist/telemetryTypesUndeprecated.js.map +1 -0
  53. package/dist/thresholdCounter.d.ts +2 -2
  54. package/dist/thresholdCounter.d.ts.map +1 -1
  55. package/dist/thresholdCounter.js.map +1 -1
  56. package/dist/utils.d.ts +4 -4
  57. package/dist/utils.d.ts.map +1 -1
  58. package/dist/utils.js +9 -9
  59. package/dist/utils.js.map +1 -1
  60. package/internal.d.ts +2 -2
  61. package/legacy.d.ts +1 -1
  62. package/lib/api.d.ts +26 -0
  63. package/lib/api.d.ts.map +1 -0
  64. package/lib/api.js +22 -0
  65. package/lib/api.js.map +1 -0
  66. package/lib/config.d.ts +6 -6
  67. package/lib/config.d.ts.map +1 -1
  68. package/lib/config.js +4 -1
  69. package/lib/config.js.map +1 -1
  70. package/lib/errorLogging.d.ts +2 -2
  71. package/lib/errorLogging.d.ts.map +1 -1
  72. package/lib/errorLogging.js.map +1 -1
  73. package/lib/events.d.ts +3 -3
  74. package/lib/events.d.ts.map +1 -1
  75. package/lib/events.js.map +1 -1
  76. package/lib/{index.d.ts → internal.d.ts} +16 -4
  77. package/lib/internal.d.ts.map +1 -0
  78. package/lib/{index.js → internal.js} +5 -3
  79. package/lib/internal.js.map +1 -0
  80. package/lib/legacy.d.ts +2 -2
  81. package/lib/logger.d.ts +61 -21
  82. package/lib/logger.d.ts.map +1 -1
  83. package/lib/logger.js +71 -28
  84. package/lib/logger.js.map +1 -1
  85. package/lib/main.d.ts +8 -0
  86. package/lib/main.d.ts.map +1 -0
  87. package/lib/main.js +9 -0
  88. package/lib/main.js.map +1 -0
  89. package/lib/mockLogger.d.ts +5 -4
  90. package/lib/mockLogger.d.ts.map +1 -1
  91. package/lib/mockLogger.js +2 -2
  92. package/lib/mockLogger.js.map +1 -1
  93. package/lib/public.d.ts +1 -1
  94. package/lib/sampledTelemetryHelper.d.ts +5 -2
  95. package/lib/sampledTelemetryHelper.d.ts.map +1 -1
  96. package/lib/sampledTelemetryHelper.js +6 -1
  97. package/lib/sampledTelemetryHelper.js.map +1 -1
  98. package/lib/telemetryEventBatcher.d.ts +2 -2
  99. package/lib/telemetryEventBatcher.d.ts.map +1 -1
  100. package/lib/telemetryEventBatcher.js.map +1 -1
  101. package/lib/telemetryTypes.d.ts +65 -6
  102. package/lib/telemetryTypes.d.ts.map +1 -1
  103. package/lib/telemetryTypes.js.map +1 -1
  104. package/lib/telemetryTypesUndeprecated.d.ts +36 -0
  105. package/lib/telemetryTypesUndeprecated.d.ts.map +1 -0
  106. package/lib/telemetryTypesUndeprecated.js +6 -0
  107. package/lib/telemetryTypesUndeprecated.js.map +1 -0
  108. package/lib/thresholdCounter.d.ts +2 -2
  109. package/lib/thresholdCounter.d.ts.map +1 -1
  110. package/lib/thresholdCounter.js.map +1 -1
  111. package/lib/utils.d.ts +4 -4
  112. package/lib/utils.d.ts.map +1 -1
  113. package/lib/utils.js +9 -9
  114. package/lib/utils.js.map +1 -1
  115. package/package.json +21 -19
  116. package/src/api.ts +44 -0
  117. package/src/config.ts +29 -19
  118. package/src/errorLogging.ts +2 -2
  119. package/src/events.ts +3 -3
  120. package/src/{index.ts → internal.ts} +23 -8
  121. package/src/logger.ts +114 -37
  122. package/src/main.ts +19 -0
  123. package/src/mockLogger.ts +6 -6
  124. package/src/sampledTelemetryHelper.ts +12 -4
  125. package/src/telemetryEventBatcher.ts +3 -3
  126. package/src/telemetryTypes.ts +76 -6
  127. package/src/telemetryTypesUndeprecated.ts +51 -0
  128. package/src/thresholdCounter.ts +2 -2
  129. package/src/utils.ts +24 -13
  130. package/dist/index.d.ts.map +0 -1
  131. package/dist/index.js.map +0 -1
  132. package/lib/index.d.ts.map +0 -1
  133. package/lib/index.js.map +0 -1
package/src/config.ts CHANGED
@@ -8,10 +8,11 @@ import type {
8
8
  IConfigProviderBase,
9
9
  ITelemetryBaseLogger,
10
10
  } from "@fluidframework/core-interfaces";
11
+ import { LogLevel } from "@fluidframework/core-interfaces";
11
12
  import { Lazy } from "@fluidframework/core-utils/internal";
12
13
 
13
14
  import { createChildLogger, tagCodeArtifacts } from "./logger.js";
14
- import type { ITelemetryLoggerExt } from "./telemetryTypes.js";
15
+ import type { ITelemetryLoggerExt, TelemetryLoggerExt } from "./telemetryTypes.js";
15
16
 
16
17
  /**
17
18
  * Explicitly typed interface for reading configurations.
@@ -246,14 +247,17 @@ export class CachedConfigProvider implements IConfigProvider {
246
247
  const parsed = stronglyTypedParse(provider?.getRawConfig(name));
247
248
  if (parsed !== undefined) {
248
249
  this.configCache.set(name, parsed);
249
- this.logger?.send({
250
- category: "generic",
251
- eventName: "ConfigRead",
252
- ...tagCodeArtifacts({
253
- configName: name,
254
- configValue: JSON.stringify(parsed),
255
- }),
256
- });
250
+ this.logger?.send(
251
+ {
252
+ category: "generic",
253
+ eventName: "ConfigRead",
254
+ ...tagCodeArtifacts({
255
+ configName: name,
256
+ configValue: JSON.stringify(parsed),
257
+ }),
258
+ },
259
+ LogLevel.info,
260
+ );
257
261
  return parsed;
258
262
  }
259
263
  }
@@ -269,9 +273,13 @@ export class CachedConfigProvider implements IConfigProvider {
269
273
  *
270
274
  * @internal
271
275
  */
272
- export interface MonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLoggerExt> {
276
+ export interface MonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt> {
273
277
  config: IConfigProvider;
274
- logger: L;
278
+ // Since this is an internal context, assume that any external logger type
279
+ // (`ITelemetryLoggerExt`) is just the internal `TelemetryLoggerExt` type.
280
+ // `extractTelemetryLoggerExt` can be used to extract the internal type, but
281
+ // we'll just "cast" it here.
282
+ logger: L extends ITelemetryLoggerExt ? TelemetryLoggerExt : L;
275
283
  }
276
284
 
277
285
  /**
@@ -280,9 +288,9 @@ export interface MonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLo
280
288
  *
281
289
  * @internal
282
290
  */
283
- export function loggerIsMonitoringContext<
284
- L extends ITelemetryBaseLogger = ITelemetryLoggerExt,
285
- >(obj: L): obj is L & MonitoringContext<L> {
291
+ export function loggerIsMonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt>(
292
+ obj: L,
293
+ ): obj is L & MonitoringContext<L> {
286
294
  const maybeConfig = obj as Partial<MonitoringContext<L>> | undefined;
287
295
  return isConfigProviderBase(maybeConfig?.config) && maybeConfig?.logger !== undefined;
288
296
  }
@@ -292,9 +300,9 @@ export function loggerIsMonitoringContext<
292
300
  *
293
301
  * @internal
294
302
  */
295
- export function loggerToMonitoringContext<
296
- L extends ITelemetryBaseLogger = ITelemetryLoggerExt,
297
- >(logger: L): MonitoringContext<L> {
303
+ export function loggerToMonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt>(
304
+ logger: L,
305
+ ): MonitoringContext<L> {
298
306
  if (loggerIsMonitoringContext<L>(logger)) {
299
307
  return logger;
300
308
  }
@@ -312,7 +320,7 @@ export function loggerToMonitoringContext<
312
320
  *
313
321
  * @internal
314
322
  */
315
- export function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLoggerExt>(
323
+ export function mixinMonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt>(
316
324
  logger: L,
317
325
  ...configs: (IConfigProviderBase | undefined)[]
318
326
  ): MonitoringContext<L> {
@@ -329,7 +337,9 @@ export function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemet
329
337
  */
330
338
  const mc: L & Partial<MonitoringContext<L>> = logger;
331
339
  mc.config = new CachedConfigProvider(logger, ...configs);
332
- mc.logger = logger;
340
+ // Cast is similar to `extractTelemetryLoggerExt` but preserves other
341
+ // logger types rather than just returning `TelemetryLoggerExt`.
342
+ mc.logger = logger as L extends ITelemetryLoggerExt ? TelemetryLoggerExt : L;
333
343
  return mc as MonitoringContext<L>;
334
344
  }
335
345
 
@@ -10,7 +10,7 @@ import { v4 as uuid } from "uuid";
10
10
  import { type IFluidErrorBase, hasErrorInstanceId, isFluidError } from "./fluidErrorBase.js";
11
11
  import { convertToBasePropertyType } from "./logger.js";
12
12
  import type {
13
- ITelemetryLoggerExt,
13
+ TelemetryLoggerExt,
14
14
  ITelemetryPropertiesExt,
15
15
  TelemetryEventPropertyTypeExt,
16
16
  } from "./telemetryTypes.js";
@@ -286,7 +286,7 @@ export function wrapError<T extends LoggingError>(
286
286
  export function wrapErrorAndLog<T extends LoggingError>(
287
287
  innerError: unknown,
288
288
  newErrorFn: (message: string) => T,
289
- logger: ITelemetryLoggerExt,
289
+ logger: TelemetryLoggerExt,
290
290
  ): T {
291
291
  const newError = wrapError(innerError, newErrorFn);
292
292
 
package/src/events.ts CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  import type { EventEmitter } from "@fluid-internal/client-utils";
7
7
 
8
- import type { ITelemetryLoggerExt } from "./telemetryTypes.js";
8
+ import type { TelemetryLoggerExt } from "./telemetryTypes.js";
9
9
 
10
10
  /**
11
11
  * Note: The contents of this file really don't belong in this package, as they are only intended for internal use.
@@ -28,7 +28,7 @@ export const disconnectedEventName = "disconnected";
28
28
  */
29
29
  export function safeRaiseEvent(
30
30
  emitter: EventEmitter,
31
- logger: ITelemetryLoggerExt,
31
+ logger: TelemetryLoggerExt,
32
32
  event: string,
33
33
  ...args: unknown[]
34
34
  ): void {
@@ -50,7 +50,7 @@ export function safeRaiseEvent(
50
50
  * @internal
51
51
  */
52
52
  export function raiseConnectedEvent(
53
- logger: ITelemetryLoggerExt,
53
+ logger: TelemetryLoggerExt,
54
54
  emitter: EventEmitter,
55
55
  connected: boolean,
56
56
  clientId?: string,
@@ -3,6 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ // The "internal" exports are a superset of the standard ones. So, we want to export everything from the standard barrel file.
7
+ // eslint-disable-next-line no-restricted-syntax
8
+ export * from "./main.js";
9
+
6
10
  export {
7
11
  createChildMonitoringContext,
8
12
  type MonitoringContext,
@@ -40,7 +44,6 @@ export {
40
44
  wrapError,
41
45
  wrapErrorAndLog,
42
46
  } from "./errorLogging.js";
43
- export { EventEmitterWithErrorHandling } from "./eventEmitterWithErrorHandling.js";
44
47
  export {
45
48
  connectedEventName,
46
49
  disconnectedEventName,
@@ -57,10 +60,9 @@ export {
57
60
  eventNamespaceSeparator,
58
61
  createChildLogger,
59
62
  createMultiSinkLogger,
63
+ extractTelemetryLoggerExt,
60
64
  formatTick,
61
65
  type IPerformanceEventMarkers,
62
- type ITelemetryLoggerPropertyBag,
63
- type ITelemetryLoggerPropertyBags,
64
66
  type MultiSinkLoggerProperties,
65
67
  numberFromString,
66
68
  PerformanceEvent,
@@ -68,7 +70,7 @@ export {
68
70
  tagData,
69
71
  tagCodeArtifacts,
70
72
  TelemetryDataTag,
71
- type TelemetryEventPropertyTypes,
73
+ toITelemetryLoggerExt,
72
74
  } from "./logger.js";
73
75
  export {
74
76
  createMockLoggerExt,
@@ -89,14 +91,27 @@ export {
89
91
  measure,
90
92
  } from "./utils.js";
91
93
  export type {
92
- TelemetryEventPropertyTypeExt,
93
94
  ITelemetryEventExt,
95
+ TelemetryLoggerExt,
96
+ } from "./telemetryTypes.js";
97
+ export type {
94
98
  ITelemetryGenericEventExt,
95
99
  ITelemetryErrorEventExt,
96
100
  ITelemetryPerformanceEventExt,
97
- ITelemetryLoggerExt,
98
- ITelemetryPropertiesExt,
99
101
  TelemetryEventCategory,
100
- } from "./telemetryTypes.js";
102
+ } from "./telemetryTypesUndeprecated.js";
101
103
  export { TelemetryEventBatcher } from "./telemetryEventBatcher.js";
102
104
  export { allowIncompatibleLayersKey, validateLayerCompatibility } from "./layerCompatError.js";
105
+
106
+ import type { TelemetryLoggerExt } from "./telemetryTypes.js";
107
+
108
+ /**
109
+ * Renamed version of TelemetryLoggerExt for convenience of internal use.
110
+ * Where "`ITelemetryLoggerExt`" is exposed in customer API surface, true
111
+ * `ITelemetryLoggerExt` (that is an erased type) must be used. To access
112
+ * use `@fluidframework/telemetry-utils/legacy` import spec. All internal
113
+ * usages should be promoted to `TelemetryLoggerExt` naming.
114
+ *
115
+ * @internal
116
+ */
117
+ export type ITelemetryLoggerExt = TelemetryLoggerExt;
package/src/logger.ts CHANGED
@@ -24,15 +24,55 @@ import {
24
24
  isTaggedTelemetryPropertyValue,
25
25
  } from "./errorLogging.js";
26
26
  import type {
27
- ITelemetryErrorEventExt,
28
27
  ITelemetryEventExt,
29
- ITelemetryGenericEventExt,
30
28
  ITelemetryLoggerExt,
31
- ITelemetryPerformanceEventExt,
32
29
  ITelemetryPropertiesExt,
33
- TelemetryEventCategory,
30
+ TelemetryLoggerExt,
34
31
  TelemetryEventPropertyTypeExt,
35
32
  } from "./telemetryTypes.js";
33
+ import type {
34
+ ITelemetryErrorEventExt,
35
+ ITelemetryGenericEventExt,
36
+ ITelemetryPerformanceEventExt,
37
+ TelemetryEventCategory,
38
+ } from "./telemetryTypesUndeprecated.js";
39
+
40
+ /**
41
+ * Type erase a {@link TelemetryLoggerExt} to an {@link ITelemetryLoggerExt}.
42
+ * @internal
43
+ */
44
+ export function toITelemetryLoggerExt(logger: TelemetryLoggerExt): ITelemetryLoggerExt {
45
+ return logger as unknown as ITelemetryLoggerExt;
46
+ }
47
+
48
+ /**
49
+ * Un-type-erase the {@link ITelemetryLoggerExt}.
50
+ * @remarks
51
+ * This is the extraction helper as documented by {@link @fluidframework/core-interfaces#BrandedType}.
52
+ *
53
+ * @typeParam options - options for the extraction, currently only supports making
54
+ * the output possibly undefined (when `PossiblyUndefined: true`), which is useful
55
+ * for cases where we want to allow passing `undefined` through.
56
+ *
57
+ * @privateRemarks `ITelemetryLoggerExt` is not currently a branded type, but will
58
+ * be when the breaking change is made. At that time, use of this helper will be
59
+ * required.
60
+ *
61
+ * @internal
62
+ */
63
+ export function extractTelemetryLoggerExt<
64
+ options extends {
65
+ PossiblyUndefined?: true;
66
+ } = // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- empty object without PossiblyUndefined is the correct type
67
+ {},
68
+ >(
69
+ input:
70
+ | ITelemetryLoggerExt
71
+ | TelemetryLoggerExt
72
+ | (options["PossiblyUndefined"] extends true ? undefined : never),
73
+ ): TelemetryLoggerExt | (options["PossiblyUndefined"] extends true ? undefined : never) {
74
+ return input as unknown as TelemetryLoggerExt;
75
+ }
36
76
 
37
77
  /**
38
78
  * Broad classifications to be applied to individual properties as they're prepared to be logged to telemetry.
@@ -70,6 +110,9 @@ export type ITelemetryLoggerPropertyBag = Record<
70
110
  /**
71
111
  * @legacy
72
112
  * @beta
113
+ *
114
+ * @privateRemarks
115
+ * This is exposed to support {@link createChildLogger} properties parameter.
73
116
  */
74
117
  export interface ITelemetryLoggerPropertyBags {
75
118
  all?: ITelemetryLoggerPropertyBag;
@@ -115,7 +158,7 @@ export const eventNamespaceSeparator = ":";
115
158
  * encoding in one place schemas for various types of Fluid telemetry events.
116
159
  * Creates sub-logger that appends properties to all events
117
160
  */
118
- export abstract class TelemetryLogger implements ITelemetryLoggerExt {
161
+ export abstract class TelemetryLogger implements TelemetryLoggerExt {
119
162
  /**
120
163
  * {@inheritDoc eventNamespaceSeparator}
121
164
  */
@@ -181,18 +224,18 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
181
224
  *
182
225
  * @param event - the event to send
183
226
  * @param error - optional error object to log
184
- * @param logLevel - optional level of the log. It category of event is set as error,
185
- * then the logLevel will be upgraded to be an error.
227
+ * @param logLevel - optional level of the log. If the event's category is `error`,
228
+ * the logLevel will be upgraded to {@link @fluidframework/core-interfaces#LogLevelConst.essential | LogLevel.essential}.
186
229
  */
187
230
  public sendTelemetryEvent(
188
231
  event: ITelemetryGenericEventExt,
189
232
  error?: unknown,
190
- logLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,
233
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.info,
191
234
  ): void {
192
235
  this.sendTelemetryEventCore(
193
236
  { ...event, category: event.category ?? "generic" },
194
237
  error,
195
- event.category === "error" ? LogLevel.error : logLevel,
238
+ event.category === "error" ? LogLevel.essential : (logLevel ?? LogLevel.essential),
196
239
  );
197
240
  }
198
241
 
@@ -201,12 +244,12 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
201
244
  *
202
245
  * @param event - the event to send
203
246
  * @param error - optional error object to log
204
- * @param logLevel - optional level of the log.
247
+ * @param logLevel - level of the log.
205
248
  */
206
- protected sendTelemetryEventCore(
249
+ private sendTelemetryEventCore(
207
250
  event: ITelemetryGenericEventExt & { category: TelemetryEventCategory },
208
- error?: unknown,
209
- logLevel?: LogLevel,
251
+ error: unknown,
252
+ logLevel: LogLevel,
210
253
  ): void {
211
254
  const newEvent = convertToBaseEvent(event);
212
255
  if (error !== undefined) {
@@ -237,7 +280,7 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
237
280
  category: "error",
238
281
  },
239
282
  error,
240
- LogLevel.error,
283
+ LogLevel.essential,
241
284
  );
242
285
  }
243
286
 
@@ -246,13 +289,13 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
246
289
  *
247
290
  * @param event - Event to send
248
291
  * @param error - optional error object to log
249
- * @param logLevel - optional level of the log. It category of event is set as error,
250
- * then the logLevel will be upgraded to be an error.
292
+ * @param logLevel - optional level of the log. If the event's category is `error`,
293
+ * the logLevel will be upgraded to {@link @fluidframework/core-interfaces#LogLevelConst.essential | LogLevel.essential}.
251
294
  */
252
295
  public sendPerformanceEvent(
253
296
  event: ITelemetryPerformanceEventExt,
254
297
  error?: unknown,
255
- logLevel: typeof LogLevel.verbose | typeof LogLevel.default = LogLevel.default,
298
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.info,
256
299
  ): void {
257
300
  const perfEvent = {
258
301
  ...event,
@@ -262,7 +305,7 @@ export abstract class TelemetryLogger implements ITelemetryLoggerExt {
262
305
  this.sendTelemetryEventCore(
263
306
  perfEvent,
264
307
  error,
265
- perfEvent.category === "error" ? LogLevel.error : logLevel,
308
+ perfEvent.category === "error" ? LogLevel.essential : (logLevel ?? LogLevel.essential),
266
309
  );
267
310
  }
268
311
 
@@ -361,6 +404,12 @@ export class TaggedLoggerAdapter implements ITelemetryBaseLogger {
361
404
  }
362
405
  }
363
406
 
407
+ function toEitherTelemetryLoggerExt(
408
+ logger: TelemetryLoggerExt,
409
+ ): TelemetryLoggerExt & ITelemetryLoggerExt {
410
+ return logger as TelemetryLoggerExt & ITelemetryLoggerExt;
411
+ }
412
+
364
413
  /**
365
414
  * Create a child logger based on the provided props object.
366
415
  *
@@ -369,15 +418,25 @@ export class TaggedLoggerAdapter implements ITelemetryBaseLogger {
369
418
  *
370
419
  * @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.
371
420
  *
372
- * @legacy
373
- * @beta
421
+ * @internal
422
+ *
423
+ * @privateRemarks
424
+ * Return type is both TelemetryLoggerExt and ITelemetryLoggerExt to allow for
425
+ * easier internal usage without needing to type erase or un-type-erase the
426
+ * logger.
427
+ *
428
+ * If always creating a child logger for direct external exposure, consider
429
+ * using {@link createChildLogger} from /legacy API instead, which returns
430
+ * exactly an {@link ITelemetryLoggerExt}.
374
431
  */
375
432
  export function createChildLogger(props?: {
376
433
  logger?: ITelemetryBaseLogger;
377
434
  namespace?: string;
378
435
  properties?: ITelemetryLoggerPropertyBags;
379
- }): ITelemetryLoggerExt {
380
- return ChildLogger.create(props?.logger, props?.namespace, props?.properties);
436
+ }): TelemetryLoggerExt & ITelemetryLoggerExt {
437
+ return toEitherTelemetryLoggerExt(
438
+ ChildLogger.create(props?.logger, props?.namespace, props?.properties),
439
+ );
381
440
  }
382
441
 
383
442
  /**
@@ -459,8 +518,8 @@ export class ChildLogger extends TelemetryLogger {
459
518
  }
460
519
 
461
520
  private shouldFilterOutEvent(event: ITelemetryBaseEvent, logLevel?: LogLevel): boolean {
462
- const eventLogLevel = logLevel ?? LogLevel.default;
463
- const configLogLevel = this.baseLogger.minLogLevel ?? LogLevel.default;
521
+ const eventLogLevel = logLevel ?? LogLevel.essential;
522
+ const configLogLevel = this.baseLogger.minLogLevel ?? LogLevel.info;
464
523
  // Filter out in case event log level is below what is wanted in config.
465
524
  return eventLogLevel < configLogLevel;
466
525
  }
@@ -474,7 +533,7 @@ export class ChildLogger extends TelemetryLogger {
474
533
  if (this.shouldFilterOutEvent(event, logLevel)) {
475
534
  return;
476
535
  }
477
- this.baseLogger.send(this.prepareEvent(event), logLevel);
536
+ this.baseLogger.send(this.prepareEvent(event), logLevel ?? LogLevel.essential);
478
537
  }
479
538
  }
480
539
 
@@ -510,7 +569,7 @@ export interface MultiSinkLoggerProperties {
510
569
  *
511
570
  * @internal
512
571
  */
513
- export function createMultiSinkLogger(props: MultiSinkLoggerProperties): ITelemetryLoggerExt {
572
+ export function createMultiSinkLogger(props: MultiSinkLoggerProperties): TelemetryLoggerExt {
514
573
  return new MultiSinkLogger(
515
574
  props.namespace,
516
575
  props.properties,
@@ -559,7 +618,7 @@ export class MultiSinkLogger extends TelemetryLogger {
559
618
 
560
619
  super(namespace, realProperties);
561
620
  this.loggers = loggers;
562
- this._minLogLevelOfAllLoggers = LogLevel.default;
621
+ this._minLogLevelOfAllLoggers = LogLevel.info;
563
622
  this.calculateMinLogLevel();
564
623
  }
565
624
 
@@ -571,7 +630,7 @@ export class MultiSinkLogger extends TelemetryLogger {
571
630
  if (this.loggers.length > 0) {
572
631
  const logLevels: LogLevel[] = [];
573
632
  for (const logger of this.loggers) {
574
- logLevels.push(logger.minLogLevel ?? LogLevel.default);
633
+ logLevels.push(logger.minLogLevel ?? LogLevel.info);
575
634
  }
576
635
  this._minLogLevelOfAllLoggers = Math.min(...logLevels) as LogLevel;
577
636
  }
@@ -594,10 +653,10 @@ export class MultiSinkLogger extends TelemetryLogger {
594
653
  *
595
654
  * @param event - the event to send to all the registered logger
596
655
  */
597
- public send(event: ITelemetryBaseEvent): void {
656
+ public send(event: ITelemetryBaseEvent, logLevel?: LogLevel): void {
598
657
  const newEvent = this.prepareEvent(event);
599
658
  for (const logger of this.loggers) {
600
- logger.send(newEvent);
659
+ logger.send(newEvent, logLevel ?? LogLevel.essential);
601
660
  }
602
661
  }
603
662
  }
@@ -633,15 +692,24 @@ export class PerformanceEvent {
633
692
  * @param recordHeapSize - whether or not to also record memory performance
634
693
  * @param emitLogs - should this instance emit logs. If set to false, logs will not be emitted to the logger,
635
694
  * but measurements will still be performed and any specified markers will be generated.
695
+ * @param logLevel - optional {@link LogLevel} for events emitted by this performance event.
696
+ * If unspecified, {@link @fluidframework/core-interfaces#LogLevelConst.essential | LogLevel.essential} will be used.
636
697
  * @returns An instance of {@link PerformanceEvent}
637
698
  */
638
699
  public static start(
639
- logger: ITelemetryLoggerExt,
700
+ logger: TelemetryLoggerExt | ITelemetryLoggerExt,
640
701
  event: ITelemetryGenericEventExt,
641
702
  markers?: IPerformanceEventMarkers,
642
703
  emitLogs: boolean = true,
704
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.info,
643
705
  ): PerformanceEvent {
644
- return new PerformanceEvent(logger, event, markers, emitLogs);
706
+ return new PerformanceEvent(
707
+ extractTelemetryLoggerExt(logger),
708
+ event,
709
+ markers,
710
+ emitLogs,
711
+ logLevel,
712
+ );
645
713
  }
646
714
 
647
715
  /**
@@ -652,6 +720,8 @@ export class PerformanceEvent {
652
720
  * @param markers - See {@link IPerformanceEventMarkers}
653
721
  * @param sampleThreshold - events with the same name and category will be sent to the logger
654
722
  * only when we hit this many executions of the task. If unspecified, all events will be sent.
723
+ * @param logLevel - optional {@link LogLevel} for events emitted by this performance event.
724
+ * If unspecified, {@link @fluidframework/core-interfaces#LogLevelConst.essential | LogLevel.essential} will be used.
655
725
  * @returns The results of the executed task
656
726
  *
657
727
  * @remarks Note that if the "same" event (category + eventName) would be emitted by different
@@ -660,17 +730,19 @@ export class PerformanceEvent {
660
730
  * effectively "share" the sampling rate for the event.
661
731
  */
662
732
  public static timedExec<T>(
663
- logger: ITelemetryLoggerExt,
733
+ logger: TelemetryLoggerExt,
664
734
  event: ITelemetryGenericEventExt,
665
735
  callback: (event: PerformanceEvent) => T,
666
736
  markers?: IPerformanceEventMarkers,
667
737
  sampleThreshold: number = 1,
738
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.info,
668
739
  ): T {
669
740
  const perfEvent = PerformanceEvent.start(
670
741
  logger,
671
742
  event,
672
743
  markers,
673
744
  PerformanceEvent.shouldReport(event, sampleThreshold),
745
+ logLevel,
674
746
  );
675
747
  try {
676
748
  const ret = callback(perfEvent);
@@ -691,6 +763,8 @@ export class PerformanceEvent {
691
763
  * @param recordHeapSize - whether or not to also record memory performance
692
764
  * @param sampleThreshold - events with the same name and category will be sent to the logger
693
765
  * only when we hit this many executions of the task. If unspecified, all events will be sent.
766
+ * @param logLevel - optional {@link LogLevel} for events emitted by this performance event.
767
+ * If unspecified, {@link @fluidframework/core-interfaces#LogLevelConst.essential | LogLevel.essential} will be used.
694
768
  * @returns The results of the executed task
695
769
  *
696
770
  * @remarks Note that if the "same" event (category + eventName) would be emitted by different
@@ -699,17 +773,19 @@ export class PerformanceEvent {
699
773
  * effectively "share" the sampling rate for the event.
700
774
  */
701
775
  public static async timedExecAsync<T>(
702
- logger: ITelemetryLoggerExt,
776
+ logger: TelemetryLoggerExt | ITelemetryLoggerExt,
703
777
  event: ITelemetryGenericEventExt,
704
778
  callback: (event: PerformanceEvent) => Promise<T>,
705
779
  markers?: IPerformanceEventMarkers,
706
780
  sampleThreshold: number = 1,
781
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.info,
707
782
  ): Promise<T> {
708
783
  const perfEvent = PerformanceEvent.start(
709
784
  logger,
710
785
  event,
711
786
  markers,
712
787
  PerformanceEvent.shouldReport(event, sampleThreshold),
788
+ logLevel,
713
789
  );
714
790
  try {
715
791
  const ret = await callback(perfEvent);
@@ -729,11 +805,12 @@ export class PerformanceEvent {
729
805
  private readonly startTime = performanceNow();
730
806
  private startMark?: string;
731
807
 
732
- protected constructor(
733
- private readonly logger: ITelemetryLoggerExt,
808
+ private constructor(
809
+ private readonly logger: TelemetryLoggerExt,
734
810
  event: ITelemetryGenericEventExt,
735
811
  private readonly markers: IPerformanceEventMarkers = { end: true, cancel: "generic" },
736
812
  private readonly emitLogs: boolean = true,
813
+ private readonly logLevel: typeof LogLevel.verbose | typeof LogLevel.info | undefined,
737
814
  ) {
738
815
  this.event = { ...event };
739
816
  if (this.markers.start) {
@@ -818,7 +895,7 @@ export class PerformanceEvent {
818
895
  event.duration = this.duration;
819
896
  }
820
897
 
821
- this.logger.sendPerformanceEvent(event, error);
898
+ this.logger.sendPerformanceEvent(event, error, this.logLevel);
822
899
  }
823
900
 
824
901
  private static readonly eventHits = new Map<string, number>();
package/src/main.ts ADDED
@@ -0,0 +1,19 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ // This export set contains public APIs that don't have any special treatment
7
+ // when exposed internally. APIs deprecated for external use but still needed
8
+ // internally are re-exported from /internal with alternate tagging.
9
+
10
+ export { EventEmitterWithErrorHandling } from "./eventEmitterWithErrorHandling.js";
11
+ export type {
12
+ ITelemetryLoggerPropertyBag,
13
+ ITelemetryLoggerPropertyBags,
14
+ TelemetryEventPropertyTypes,
15
+ } from "./logger.js";
16
+ export type {
17
+ ITelemetryPropertiesExt,
18
+ TelemetryEventPropertyTypeExt,
19
+ } from "./telemetryTypes.js";
package/src/mockLogger.ts CHANGED
@@ -13,7 +13,7 @@ import { assert } from "@fluidframework/core-utils/internal";
13
13
  import { createChildLogger } from "./logger.js";
14
14
  import type {
15
15
  ITelemetryEventExt,
16
- ITelemetryLoggerExt,
16
+ TelemetryLoggerExt,
17
17
  ITelemetryPropertiesExt,
18
18
  } from "./telemetryTypes.js";
19
19
 
@@ -41,7 +41,7 @@ export class MockLogger implements ITelemetryBaseLogger {
41
41
  public readonly minLogLevel: LogLevel;
42
42
 
43
43
  public constructor(minLogLevel?: LogLevel) {
44
- this.minLogLevel = minLogLevel ?? LogLevel.default;
44
+ this.minLogLevel = minLogLevel ?? LogLevel.info;
45
45
  }
46
46
 
47
47
  /**
@@ -51,7 +51,7 @@ export class MockLogger implements ITelemetryBaseLogger {
51
51
  this._events = [];
52
52
  }
53
53
 
54
- public toTelemetryLogger(): ITelemetryLoggerExt {
54
+ public toTelemetryLogger(): ReturnType<typeof createChildLogger> {
55
55
  return createChildLogger({ logger: this });
56
56
  }
57
57
 
@@ -59,7 +59,7 @@ export class MockLogger implements ITelemetryBaseLogger {
59
59
  * {@inheritDoc @fluidframework/core-interfaces#ITelemetryBaseLogger.send}
60
60
  */
61
61
  public send(event: ITelemetryBaseEvent, logLevel?: LogLevel): void {
62
- if ((logLevel ?? LogLevel.default) >= this.minLogLevel) {
62
+ if ((logLevel ?? LogLevel.essential) >= this.minLogLevel) {
63
63
  this._events.push(event);
64
64
  }
65
65
  }
@@ -357,13 +357,13 @@ function matchObjects(
357
357
  }
358
358
 
359
359
  /**
360
- * Mock {@link ITelemetryLoggerExt} implementation.
360
+ * Mock {@link TelemetryLoggerExt} implementation.
361
361
  *
362
362
  * @remarks Can be created via {@link createMockLoggerExt}.
363
363
  *
364
364
  * @internal
365
365
  */
366
- export interface IMockLoggerExt extends ITelemetryLoggerExt {
366
+ export interface IMockLoggerExt extends TelemetryLoggerExt {
367
367
  /**
368
368
  * Gets the events that have been logged so far.
369
369
  */