@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.
- package/CHANGELOG.md +26 -0
- package/DEV.md +33 -0
- package/api-extractor/api-extractor-lint-api-bundle.json +5 -0
- package/api-extractor/api-extractor-lint-bundle.json +1 -1
- package/api-extractor.json +2 -1
- package/api-report/telemetry-utils.legacy.beta.api.md +10 -7
- package/dist/api.d.ts +26 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +40 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +6 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/errorLogging.d.ts +2 -2
- package/dist/errorLogging.d.ts.map +1 -1
- package/dist/errorLogging.js.map +1 -1
- package/dist/events.d.ts +3 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/{index.d.ts → internal.d.ts} +16 -4
- package/dist/internal.d.ts.map +1 -0
- package/dist/{index.js → internal.js} +22 -5
- package/dist/internal.js.map +1 -0
- package/dist/legacy.d.ts +2 -2
- package/dist/logger.d.ts +61 -21
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +74 -29
- package/dist/logger.js.map +1 -1
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +13 -0
- package/dist/main.js.map +1 -0
- package/dist/mockLogger.d.ts +5 -4
- package/dist/mockLogger.d.ts.map +1 -1
- package/dist/mockLogger.js +2 -2
- package/dist/mockLogger.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/sampledTelemetryHelper.d.ts +5 -2
- package/dist/sampledTelemetryHelper.d.ts.map +1 -1
- package/dist/sampledTelemetryHelper.js +6 -1
- package/dist/sampledTelemetryHelper.js.map +1 -1
- package/dist/telemetryEventBatcher.d.ts +2 -2
- package/dist/telemetryEventBatcher.d.ts.map +1 -1
- package/dist/telemetryEventBatcher.js.map +1 -1
- package/dist/telemetryTypes.d.ts +65 -6
- package/dist/telemetryTypes.d.ts.map +1 -1
- package/dist/telemetryTypes.js.map +1 -1
- package/dist/telemetryTypesUndeprecated.d.ts +36 -0
- package/dist/telemetryTypesUndeprecated.d.ts.map +1 -0
- package/dist/telemetryTypesUndeprecated.js +7 -0
- package/dist/telemetryTypesUndeprecated.js.map +1 -0
- package/dist/thresholdCounter.d.ts +2 -2
- package/dist/thresholdCounter.d.ts.map +1 -1
- package/dist/thresholdCounter.js.map +1 -1
- package/dist/utils.d.ts +4 -4
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +9 -9
- package/dist/utils.js.map +1 -1
- package/internal.d.ts +2 -2
- package/legacy.d.ts +1 -1
- package/lib/api.d.ts +26 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +22 -0
- package/lib/api.js.map +1 -0
- package/lib/config.d.ts +6 -6
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +4 -1
- package/lib/config.js.map +1 -1
- package/lib/errorLogging.d.ts +2 -2
- package/lib/errorLogging.d.ts.map +1 -1
- package/lib/errorLogging.js.map +1 -1
- package/lib/events.d.ts +3 -3
- package/lib/events.d.ts.map +1 -1
- package/lib/events.js.map +1 -1
- package/lib/{index.d.ts → internal.d.ts} +16 -4
- package/lib/internal.d.ts.map +1 -0
- package/lib/{index.js → internal.js} +5 -3
- package/lib/internal.js.map +1 -0
- package/lib/legacy.d.ts +2 -2
- package/lib/logger.d.ts +61 -21
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js +71 -28
- package/lib/logger.js.map +1 -1
- package/lib/main.d.ts +8 -0
- package/lib/main.d.ts.map +1 -0
- package/lib/main.js +9 -0
- package/lib/main.js.map +1 -0
- package/lib/mockLogger.d.ts +5 -4
- package/lib/mockLogger.d.ts.map +1 -1
- package/lib/mockLogger.js +2 -2
- package/lib/mockLogger.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/sampledTelemetryHelper.d.ts +5 -2
- package/lib/sampledTelemetryHelper.d.ts.map +1 -1
- package/lib/sampledTelemetryHelper.js +6 -1
- package/lib/sampledTelemetryHelper.js.map +1 -1
- package/lib/telemetryEventBatcher.d.ts +2 -2
- package/lib/telemetryEventBatcher.d.ts.map +1 -1
- package/lib/telemetryEventBatcher.js.map +1 -1
- package/lib/telemetryTypes.d.ts +65 -6
- package/lib/telemetryTypes.d.ts.map +1 -1
- package/lib/telemetryTypes.js.map +1 -1
- package/lib/telemetryTypesUndeprecated.d.ts +36 -0
- package/lib/telemetryTypesUndeprecated.d.ts.map +1 -0
- package/lib/telemetryTypesUndeprecated.js +6 -0
- package/lib/telemetryTypesUndeprecated.js.map +1 -0
- package/lib/thresholdCounter.d.ts +2 -2
- package/lib/thresholdCounter.d.ts.map +1 -1
- package/lib/thresholdCounter.js.map +1 -1
- package/lib/utils.d.ts +4 -4
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +9 -9
- package/lib/utils.js.map +1 -1
- package/package.json +21 -19
- package/src/api.ts +44 -0
- package/src/config.ts +29 -19
- package/src/errorLogging.ts +2 -2
- package/src/events.ts +3 -3
- package/src/{index.ts → internal.ts} +23 -8
- package/src/logger.ts +114 -37
- package/src/main.ts +19 -0
- package/src/mockLogger.ts +6 -6
- package/src/sampledTelemetryHelper.ts +12 -4
- package/src/telemetryEventBatcher.ts +3 -3
- package/src/telemetryTypes.ts +76 -6
- package/src/telemetryTypesUndeprecated.ts +51 -0
- package/src/thresholdCounter.ts +2 -2
- package/src/utils.ts +24 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- 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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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 =
|
|
276
|
+
export interface MonitoringContext<L extends ITelemetryBaseLogger = TelemetryLoggerExt> {
|
|
273
277
|
config: IConfigProvider;
|
|
274
|
-
logger
|
|
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
|
|
285
|
-
|
|
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
|
|
297
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
package/src/errorLogging.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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 {
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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 "./
|
|
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
|
-
|
|
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
|
|
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.
|
|
185
|
-
*
|
|
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
|
|
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.
|
|
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 -
|
|
247
|
+
* @param logLevel - level of the log.
|
|
205
248
|
*/
|
|
206
|
-
|
|
249
|
+
private sendTelemetryEventCore(
|
|
207
250
|
event: ITelemetryGenericEventExt & { category: TelemetryEventCategory },
|
|
208
|
-
error
|
|
209
|
-
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.
|
|
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.
|
|
250
|
-
*
|
|
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
|
|
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.
|
|
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
|
-
* @
|
|
373
|
-
*
|
|
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
|
|
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.
|
|
463
|
-
const configLogLevel = this.baseLogger.minLogLevel ?? LogLevel.
|
|
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):
|
|
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.
|
|
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.
|
|
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(
|
|
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:
|
|
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
|
-
|
|
733
|
-
private readonly logger:
|
|
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
|
-
|
|
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.
|
|
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():
|
|
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.
|
|
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
|
|
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
|
|
366
|
+
export interface IMockLoggerExt extends TelemetryLoggerExt {
|
|
367
367
|
/**
|
|
368
368
|
* Gets the events that have been logged so far.
|
|
369
369
|
*/
|