@fluidframework/telemetry-utils 2.92.0 → 2.100.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 (132) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/DEV.md +33 -0
  3. package/README.md +1 -1
  4. package/api-extractor/api-extractor-lint-api-bundle.json +5 -0
  5. package/api-extractor/api-extractor-lint-bundle.json +1 -1
  6. package/api-extractor.json +2 -1
  7. package/api-report/telemetry-utils.legacy.beta.api.md +8 -5
  8. package/dist/api.d.ts +26 -0
  9. package/dist/api.d.ts.map +1 -0
  10. package/dist/api.js +40 -0
  11. package/dist/api.js.map +1 -0
  12. package/dist/config.d.ts +6 -6
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +2 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/errorLogging.d.ts +2 -2
  17. package/dist/errorLogging.d.ts.map +1 -1
  18. package/dist/errorLogging.js.map +1 -1
  19. package/dist/events.d.ts +3 -3
  20. package/dist/events.d.ts.map +1 -1
  21. package/dist/events.js.map +1 -1
  22. package/dist/{index.d.ts → internal.d.ts} +16 -4
  23. package/dist/internal.d.ts.map +1 -0
  24. package/dist/{index.js → internal.js} +22 -5
  25. package/dist/internal.js.map +1 -0
  26. package/dist/legacy.d.ts +2 -2
  27. package/dist/logger.d.ts +45 -10
  28. package/dist/logger.d.ts.map +1 -1
  29. package/dist/logger.js +43 -5
  30. package/dist/logger.js.map +1 -1
  31. package/dist/main.d.ts +8 -0
  32. package/dist/main.d.ts.map +1 -0
  33. package/dist/main.js +13 -0
  34. package/dist/main.js.map +1 -0
  35. package/dist/mockLogger.d.ts +5 -4
  36. package/dist/mockLogger.d.ts.map +1 -1
  37. package/dist/mockLogger.js.map +1 -1
  38. package/dist/public.d.ts +1 -1
  39. package/dist/sampledTelemetryHelper.d.ts +2 -2
  40. package/dist/sampledTelemetryHelper.d.ts.map +1 -1
  41. package/dist/sampledTelemetryHelper.js.map +1 -1
  42. package/dist/telemetryEventBatcher.d.ts +2 -2
  43. package/dist/telemetryEventBatcher.d.ts.map +1 -1
  44. package/dist/telemetryEventBatcher.js.map +1 -1
  45. package/dist/telemetryTypes.d.ts +58 -3
  46. package/dist/telemetryTypes.d.ts.map +1 -1
  47. package/dist/telemetryTypes.js.map +1 -1
  48. package/dist/telemetryTypesUndeprecated.d.ts +36 -0
  49. package/dist/telemetryTypesUndeprecated.d.ts.map +1 -0
  50. package/dist/telemetryTypesUndeprecated.js +7 -0
  51. package/dist/telemetryTypesUndeprecated.js.map +1 -0
  52. package/dist/thresholdCounter.d.ts +2 -2
  53. package/dist/thresholdCounter.d.ts.map +1 -1
  54. package/dist/thresholdCounter.js.map +1 -1
  55. package/dist/utils.d.ts +4 -4
  56. package/dist/utils.d.ts.map +1 -1
  57. package/dist/utils.js +1 -1
  58. package/dist/utils.js.map +1 -1
  59. package/eslint.config.mts +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 +2 -0
  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 +45 -10
  82. package/lib/logger.d.ts.map +1 -1
  83. package/lib/logger.js +40 -4
  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.map +1 -1
  92. package/lib/public.d.ts +1 -1
  93. package/lib/sampledTelemetryHelper.d.ts +2 -2
  94. package/lib/sampledTelemetryHelper.d.ts.map +1 -1
  95. package/lib/sampledTelemetryHelper.js.map +1 -1
  96. package/lib/telemetryEventBatcher.d.ts +2 -2
  97. package/lib/telemetryEventBatcher.d.ts.map +1 -1
  98. package/lib/telemetryEventBatcher.js.map +1 -1
  99. package/lib/telemetryTypes.d.ts +58 -3
  100. package/lib/telemetryTypes.d.ts.map +1 -1
  101. package/lib/telemetryTypes.js.map +1 -1
  102. package/lib/telemetryTypesUndeprecated.d.ts +36 -0
  103. package/lib/telemetryTypesUndeprecated.d.ts.map +1 -0
  104. package/lib/telemetryTypesUndeprecated.js +6 -0
  105. package/lib/telemetryTypesUndeprecated.js.map +1 -0
  106. package/lib/thresholdCounter.d.ts +2 -2
  107. package/lib/thresholdCounter.d.ts.map +1 -1
  108. package/lib/thresholdCounter.js.map +1 -1
  109. package/lib/tsdoc-metadata.json +1 -1
  110. package/lib/utils.d.ts +4 -4
  111. package/lib/utils.d.ts.map +1 -1
  112. package/lib/utils.js +1 -1
  113. package/lib/utils.js.map +1 -1
  114. package/package.json +25 -24
  115. package/src/api.ts +44 -0
  116. package/src/config.ts +17 -11
  117. package/src/errorLogging.ts +2 -2
  118. package/src/events.ts +3 -3
  119. package/src/{index.ts → internal.ts} +23 -8
  120. package/src/logger.ts +74 -15
  121. package/src/main.ts +19 -0
  122. package/src/mockLogger.ts +4 -4
  123. package/src/sampledTelemetryHelper.ts +3 -3
  124. package/src/telemetryEventBatcher.ts +3 -3
  125. package/src/telemetryTypes.ts +69 -3
  126. package/src/telemetryTypesUndeprecated.ts +51 -0
  127. package/src/thresholdCounter.ts +2 -2
  128. package/src/utils.ts +7 -4
  129. package/dist/index.d.ts.map +0 -1
  130. package/dist/index.js.map +0 -1
  131. package/lib/index.d.ts.map +0 -1
  132. package/lib/index.js.map +0 -1
package/src/api.ts ADDED
@@ -0,0 +1,44 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ // eslint-disable-next-line no-restricted-syntax
7
+ export * from "./main.js";
8
+
9
+ // Additional APIs that are deprecated and thus left out of the common export set.
10
+ export type {
11
+ ITelemetryErrorEventExt,
12
+ ITelemetryGenericEventExt,
13
+ ITelemetryLoggerExt,
14
+ ITelemetryPerformanceEventExt,
15
+ TelemetryEventCategory,
16
+ } from "./telemetryTypes.js";
17
+
18
+ // ----------------------------------------------------------------------------
19
+ // Export `createChildLogger` helper without internal `TelemetryLoggerExt`
20
+
21
+ import type { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
22
+
23
+ import type { ITelemetryLoggerPropertyBags } from "./logger.js";
24
+ import { createChildLogger as createChildLoggerInternal } from "./logger.js";
25
+ import type { ITelemetryLoggerExt } from "./telemetryTypes.js";
26
+
27
+ /**
28
+ * Create a child logger based on the provided props object.
29
+ *
30
+ * @remarks
31
+ * Passing in no props object (i.e. undefined) will return a logger that is effectively a no-op.
32
+ *
33
+ * @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.
34
+ *
35
+ * @legacy
36
+ * @beta
37
+ */
38
+ export function createChildLogger(props?: {
39
+ logger?: ITelemetryBaseLogger;
40
+ namespace?: string;
41
+ properties?: ITelemetryLoggerPropertyBags;
42
+ }): ITelemetryLoggerExt {
43
+ return createChildLoggerInternal(props);
44
+ }
package/src/config.ts CHANGED
@@ -11,7 +11,7 @@ import type {
11
11
  import { Lazy } from "@fluidframework/core-utils/internal";
12
12
 
13
13
  import { createChildLogger, tagCodeArtifacts } from "./logger.js";
14
- import type { ITelemetryLoggerExt } from "./telemetryTypes.js";
14
+ import type { ITelemetryLoggerExt, TelemetryLoggerExt } from "./telemetryTypes.js";
15
15
 
16
16
  /**
17
17
  * Explicitly typed interface for reading configurations.
@@ -269,9 +269,13 @@ export class CachedConfigProvider implements IConfigProvider {
269
269
  *
270
270
  * @internal
271
271
  */
272
- export interface MonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLoggerExt> {
272
+ export interface MonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt> {
273
273
  config: IConfigProvider;
274
- logger: L;
274
+ // Since this is an internal context, assume that any external logger type
275
+ // (`ITelemetryLoggerExt`) is just the internal `TelemetryLoggerExt` type.
276
+ // `extractTelemetryLoggerExt` can be used to extract the internal type, but
277
+ // we'll just "cast" it here.
278
+ logger: L extends ITelemetryLoggerExt ? TelemetryLoggerExt : L;
275
279
  }
276
280
 
277
281
  /**
@@ -280,9 +284,9 @@ export interface MonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLo
280
284
  *
281
285
  * @internal
282
286
  */
283
- export function loggerIsMonitoringContext<
284
- L extends ITelemetryBaseLogger = ITelemetryLoggerExt,
285
- >(obj: L): obj is L & MonitoringContext<L> {
287
+ export function loggerIsMonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt>(
288
+ obj: L,
289
+ ): obj is L & MonitoringContext<L> {
286
290
  const maybeConfig = obj as Partial<MonitoringContext<L>> | undefined;
287
291
  return isConfigProviderBase(maybeConfig?.config) && maybeConfig?.logger !== undefined;
288
292
  }
@@ -292,9 +296,9 @@ export function loggerIsMonitoringContext<
292
296
  *
293
297
  * @internal
294
298
  */
295
- export function loggerToMonitoringContext<
296
- L extends ITelemetryBaseLogger = ITelemetryLoggerExt,
297
- >(logger: L): MonitoringContext<L> {
299
+ export function loggerToMonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt>(
300
+ logger: L,
301
+ ): MonitoringContext<L> {
298
302
  if (loggerIsMonitoringContext<L>(logger)) {
299
303
  return logger;
300
304
  }
@@ -312,7 +316,7 @@ export function loggerToMonitoringContext<
312
316
  *
313
317
  * @internal
314
318
  */
315
- export function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLoggerExt>(
319
+ export function mixinMonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt>(
316
320
  logger: L,
317
321
  ...configs: (IConfigProviderBase | undefined)[]
318
322
  ): MonitoringContext<L> {
@@ -329,7 +333,9 @@ export function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemet
329
333
  */
330
334
  const mc: L & Partial<MonitoringContext<L>> = logger;
331
335
  mc.config = new CachedConfigProvider(logger, ...configs);
332
- mc.logger = logger;
336
+ // Cast is similar to `extractTelemetryLoggerExt` but preserves other
337
+ // logger types rather than just returning `TelemetryLoggerExt`.
338
+ mc.logger = logger as L extends ITelemetryLoggerExt ? TelemetryLoggerExt : L;
333
339
  return mc as MonitoringContext<L>;
334
340
  }
335
341
 
@@ -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
  */
@@ -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
  /**
@@ -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,
@@ -636,12 +695,12 @@ export class PerformanceEvent {
636
695
  * @returns An instance of {@link PerformanceEvent}
637
696
  */
638
697
  public static start(
639
- logger: ITelemetryLoggerExt,
698
+ logger: TelemetryLoggerExt | ITelemetryLoggerExt,
640
699
  event: ITelemetryGenericEventExt,
641
700
  markers?: IPerformanceEventMarkers,
642
701
  emitLogs: boolean = true,
643
702
  ): PerformanceEvent {
644
- return new PerformanceEvent(logger, event, markers, emitLogs);
703
+ return new PerformanceEvent(extractTelemetryLoggerExt(logger), event, markers, emitLogs);
645
704
  }
646
705
 
647
706
  /**
@@ -660,7 +719,7 @@ export class PerformanceEvent {
660
719
  * effectively "share" the sampling rate for the event.
661
720
  */
662
721
  public static timedExec<T>(
663
- logger: ITelemetryLoggerExt,
722
+ logger: TelemetryLoggerExt,
664
723
  event: ITelemetryGenericEventExt,
665
724
  callback: (event: PerformanceEvent) => T,
666
725
  markers?: IPerformanceEventMarkers,
@@ -699,7 +758,7 @@ export class PerformanceEvent {
699
758
  * effectively "share" the sampling rate for the event.
700
759
  */
701
760
  public static async timedExecAsync<T>(
702
- logger: ITelemetryLoggerExt,
761
+ logger: TelemetryLoggerExt | ITelemetryLoggerExt,
703
762
  event: ITelemetryGenericEventExt,
704
763
  callback: (event: PerformanceEvent) => Promise<T>,
705
764
  markers?: IPerformanceEventMarkers,
@@ -730,7 +789,7 @@ export class PerformanceEvent {
730
789
  private startMark?: string;
731
790
 
732
791
  protected constructor(
733
- private readonly logger: ITelemetryLoggerExt,
792
+ private readonly logger: TelemetryLoggerExt,
734
793
  event: ITelemetryGenericEventExt,
735
794
  private readonly markers: IPerformanceEventMarkers = { end: true, cancel: "generic" },
736
795
  private readonly emitLogs: boolean = true,
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
 
@@ -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
 
@@ -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
  */
@@ -10,9 +10,9 @@ import { assert } from "@fluidframework/core-utils/internal";
10
10
  import { roundToDecimalPlaces } from "./mathTools.js";
11
11
  import type {
12
12
  ITelemetryGenericEventExt,
13
- ITelemetryLoggerExt,
13
+ TelemetryLoggerExt,
14
14
  ITelemetryPerformanceEventExt,
15
- } from "./telemetryTypes.js";
15
+ } from "./telemetryTypesUndeprecated.js";
16
16
 
17
17
  /**
18
18
  * @privateRemarks
@@ -163,7 +163,7 @@ export class SampledTelemetryHelper<
163
163
  */
164
164
  public constructor(
165
165
  private readonly eventBase: ITelemetryGenericEventExt,
166
- private readonly logger: ITelemetryLoggerExt,
166
+ private readonly logger: TelemetryLoggerExt,
167
167
  private readonly sampleThreshold: number,
168
168
  private readonly includeAggregateMetrics: boolean = false,
169
169
  private readonly perBucketProperties = new Map<string, ITelemetryBaseProperties>(),
@@ -6,9 +6,9 @@
6
6
  import { roundToDecimalPlaces } from "./mathTools.js";
7
7
  import type {
8
8
  ITelemetryGenericEventExt,
9
- ITelemetryLoggerExt,
9
+ TelemetryLoggerExt,
10
10
  ITelemetryPerformanceEventExt,
11
- } from "./telemetryTypes.js";
11
+ } from "./telemetryTypesUndeprecated.js";
12
12
 
13
13
  /**
14
14
  * Telemetry class that accumulates measurements which are eventually logged in a telemetry event through the provided
@@ -46,7 +46,7 @@ export class TelemetryEventBatcher<TMetrics extends string> {
46
46
  /**
47
47
  * The logger to use to write the telemetry performance event.
48
48
  */
49
- private readonly logger: ITelemetryLoggerExt,
49
+ private readonly logger: TelemetryLoggerExt,
50
50
 
51
51
  /**
52
52
  * The number of logs to accumulate before sending the data to the logger.
@@ -13,6 +13,8 @@ import type { ITelemetryBaseLogger, LogLevel, Tagged } from "@fluidframework/cor
13
13
  * error - Error log event, ideally 0 of these are logged during a session
14
14
  *
15
15
  * performance - Includes duration, and often has _start, _end, or _cancel suffixes for activity tracking
16
+ * @deprecated This type is being removed without a replacement.
17
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
16
18
  * @legacy @beta
17
19
  */
18
20
  export type TelemetryEventCategory = "generic" | "error" | "performance";
@@ -65,6 +67,8 @@ export interface ITelemetryEventExt extends ITelemetryPropertiesExt {
65
67
  /**
66
68
  * Informational (non-error) telemetry event
67
69
  * @remarks Maps to category = "generic"
70
+ * @deprecated This type is being removed without a replacement.
71
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
68
72
  * @legacy @beta
69
73
  */
70
74
  export interface ITelemetryGenericEventExt extends ITelemetryPropertiesExt {
@@ -83,6 +87,8 @@ export interface ITelemetryGenericEventExt extends ITelemetryPropertiesExt {
83
87
  /**
84
88
  * Error telemetry event.
85
89
  * @remarks Maps to category = "error"
90
+ * @deprecated This type is being removed without a replacement.
91
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
86
92
  * @legacy @beta
87
93
  */
88
94
  export interface ITelemetryErrorEventExt extends ITelemetryPropertiesExt {
@@ -95,6 +101,8 @@ export interface ITelemetryErrorEventExt extends ITelemetryPropertiesExt {
95
101
  /**
96
102
  * Performance telemetry event.
97
103
  * @remarks Maps to category = "performance"
104
+ * @deprecated This type is being removed without a replacement.
105
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
98
106
  * @legacy @beta
99
107
  */
100
108
  export interface ITelemetryPerformanceEventExt extends ITelemetryGenericEventExt {
@@ -104,15 +112,73 @@ export interface ITelemetryPerformanceEventExt extends ITelemetryGenericEventExt
104
112
  duration?: number;
105
113
  }
106
114
 
115
+ /**
116
+ * This is the externally facing type for a FluidFramework internal telemetry logger wrapper.
117
+ *
118
+ * @remarks
119
+ * The methods if this interface are not to be used directly by consumers and are all
120
+ * deprecated to removed without replacement. This type is not deprecated and will
121
+ * transition to an erased type to handle cases where "internal" `ITelemetryLoggerExt`
122
+ * previously leaked out.
123
+ *
124
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for deprecation and breaking change details.
125
+ *
126
+ * @privateRemarks
127
+ * External APIs taking in an `ITelemetryLoggerExt` ideally should be updated to
128
+ * accept `ITelemetryBaseLogger` instead.
129
+ *
130
+ * @sealed
131
+ * @legacy
132
+ * @beta
133
+ */
134
+ export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
135
+ /**
136
+ * Send an information telemetry event.
137
+ * @param event - Event to send.
138
+ * @param error - Optional error object to log.
139
+ * @param logLevel - Optional level of the log. Default: {@link @fluidframework/core-interfaces#LogLevel.essential}.
140
+ * @deprecated This method is being removed without a replacement.
141
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
142
+ */
143
+ sendTelemetryEvent(
144
+ event: ITelemetryGenericEventExt,
145
+ error?: unknown,
146
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.default,
147
+ ): void;
148
+
149
+ /**
150
+ * Send an error telemetry event.
151
+ * @param event - Event to send.
152
+ * @param error - Optional error object to log.
153
+ * @deprecated This method is being removed without a replacement.
154
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
155
+ */
156
+ sendErrorEvent(event: ITelemetryErrorEventExt, error?: unknown): void;
157
+
158
+ /**
159
+ * Send a performance telemetry event.
160
+ * @param event - Event to send
161
+ * @param error - Optional error object to log.
162
+ * @param logLevel - Optional level of the log. Default: {@link @fluidframework/core-interfaces#LogLevel.essential}.
163
+ * @deprecated This method is being removed without a replacement.
164
+ * @see {@link https://github.com/microsoft/FluidFramework/issues/26910 | Issue #26910} for details.
165
+ */
166
+ sendPerformanceEvent(
167
+ event: ITelemetryPerformanceEventExt,
168
+ error?: unknown,
169
+ logLevel?: typeof LogLevel.verbose | typeof LogLevel.default,
170
+ ): void;
171
+ }
172
+
107
173
  /**
108
174
  * An extended {@link @fluidframework/core-interfaces#ITelemetryBaseLogger} which allows for more lenient event types.
109
175
  *
110
176
  * @remarks
111
177
  * This interface is meant to be used internally within the Fluid Framework,
112
178
  * and `ITelemetryBaseLogger` should be used when loggers are passed between layers.
113
- * @legacy @beta
179
+ * @internal
114
180
  */
115
- export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
181
+ export interface TelemetryLoggerExt extends ITelemetryBaseLogger {
116
182
  /**
117
183
  * Send an information telemetry event.
118
184
  * @param event - Event to send.
@@ -136,7 +202,7 @@ export interface ITelemetryLoggerExt extends ITelemetryBaseLogger {
136
202
  * Send a performance telemetry event.
137
203
  * @param event - Event to send
138
204
  * @param error - Optional error object to log.
139
- * @param logLevel - Optional level of the log. Default: {@link @fluidframework/core-interfaces#LogLevel.default}.
205
+ * @param logLevel - Optional level of the log. Default: {@link @fluidframework/core-interfaces#LogLevelConst.default | LogLevel.default}.
140
206
  */
141
207
  sendPerformanceEvent(
142
208
  event: ITelemetryPerformanceEventExt,
@@ -0,0 +1,51 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ /* eslint-disable import-x/no-deprecated -- This file specifically works with deprecated types to undeprecate them for internal use */
7
+
8
+ // This file contains exports that "un-deprecate" certain types that we want to
9
+ // continue using internally while exposing deprecated version that will be
10
+ // removed in a future release.
11
+
12
+ // For internal maintenance convenience, we re-export some non-deprecated types
13
+ // from telemetryTypes.ts too.
14
+ export type { TelemetryLoggerExt } from "./telemetryTypes.js";
15
+
16
+ import type {
17
+ ITelemetryGenericEventExt as ExposedITelemetryGenericEventExt,
18
+ ITelemetryErrorEventExt as ExposedITelemetryErrorEventExt,
19
+ ITelemetryPerformanceEventExt as ExposedITelemetryPerformanceEventExt,
20
+ TelemetryEventCategory as ExposedTelemetryEventCategory,
21
+ } from "./telemetryTypes.js";
22
+
23
+ /**
24
+ * Informational (non-error) telemetry event
25
+ * @remarks Maps to category = "generic"
26
+ * @internal
27
+ */
28
+ export type ITelemetryGenericEventExt = ExposedITelemetryGenericEventExt;
29
+ /**
30
+ * Error telemetry event.
31
+ * @remarks Maps to category = "error"
32
+ * @internal
33
+ */
34
+ export type ITelemetryErrorEventExt = ExposedITelemetryErrorEventExt;
35
+ /**
36
+ * Performance telemetry event.
37
+ * @remarks Maps to category = "performance"
38
+ * @internal
39
+ */
40
+ export type ITelemetryPerformanceEventExt = ExposedITelemetryPerformanceEventExt;
41
+ /**
42
+ * The categories FF uses when instrumenting the code.
43
+ *
44
+ * generic - Informational log event
45
+ *
46
+ * error - Error log event, ideally 0 of these are logged during a session
47
+ *
48
+ * performance - Includes duration, and often has _start, _end, or _cancel suffixes for activity tracking
49
+ * @internal
50
+ */
51
+ export type TelemetryEventCategory = ExposedTelemetryEventCategory;