@azure/msal-common 10.0.0 → 12.0.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/dist/_virtual/_tslib.js +1 -1
- package/dist/account/AuthToken.js +1 -1
- package/dist/account/CcsCredential.js +1 -1
- package/dist/account/ClientInfo.js +1 -1
- package/dist/account/TokenClaims.d.ts +5 -0
- package/dist/account/TokenClaims.d.ts.map +1 -1
- package/dist/authority/Authority.js +1 -1
- package/dist/authority/AuthorityFactory.js +1 -1
- package/dist/authority/AuthorityMetadata.js +1 -1
- package/dist/authority/AuthorityOptions.js +1 -1
- package/dist/authority/AuthorityType.js +1 -1
- package/dist/authority/CloudInstanceDiscoveryErrorResponse.js +1 -1
- package/dist/authority/CloudInstanceDiscoveryResponse.js +1 -1
- package/dist/authority/OpenIdConfigResponse.js +1 -1
- package/dist/authority/ProtocolMode.js +1 -1
- package/dist/authority/RegionDiscovery.js +1 -1
- package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +16 -0
- package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts.map +1 -0
- package/dist/cache/CacheManager.d.ts +102 -51
- package/dist/cache/CacheManager.d.ts.map +1 -1
- package/dist/cache/CacheManager.js +414 -245
- package/dist/cache/CacheManager.js.map +1 -1
- package/dist/cache/entities/AccessTokenEntity.js +1 -1
- package/dist/cache/entities/AccountEntity.js +1 -1
- package/dist/cache/entities/AppMetadataEntity.js +1 -1
- package/dist/cache/entities/AuthorityMetadataEntity.js +1 -1
- package/dist/cache/entities/CacheRecord.js +1 -1
- package/dist/cache/entities/CredentialEntity.d.ts +0 -11
- package/dist/cache/entities/CredentialEntity.d.ts.map +1 -1
- package/dist/cache/entities/CredentialEntity.js +3 -39
- package/dist/cache/entities/CredentialEntity.js.map +1 -1
- package/dist/cache/entities/IdTokenEntity.js +1 -1
- package/dist/cache/entities/RefreshTokenEntity.js +1 -1
- package/dist/cache/entities/ServerTelemetryEntity.js +1 -1
- package/dist/cache/entities/ThrottlingEntity.js +1 -1
- package/dist/cache/interface/ICacheManager.d.ts +26 -17
- package/dist/cache/interface/ICacheManager.d.ts.map +1 -1
- package/dist/cache/persistence/TokenCacheContext.js +1 -1
- package/dist/cache/utils/CacheTypes.d.ts +9 -6
- package/dist/cache/utils/CacheTypes.d.ts.map +1 -1
- package/dist/client/AuthorizationCodeClient.js +1 -1
- package/dist/client/BaseClient.js +1 -1
- package/dist/client/ClientCredentialClient.d.ts +0 -1
- package/dist/client/ClientCredentialClient.d.ts.map +1 -1
- package/dist/client/ClientCredentialClient.js +3 -5
- package/dist/client/ClientCredentialClient.js.map +1 -1
- package/dist/client/DeviceCodeClient.js +1 -1
- package/dist/client/OnBehalfOfClient.d.ts.map +1 -1
- package/dist/client/OnBehalfOfClient.js +6 -8
- package/dist/client/OnBehalfOfClient.js.map +1 -1
- package/dist/client/RefreshTokenClient.js +3 -3
- package/dist/client/RefreshTokenClient.js.map +1 -1
- package/dist/client/SilentFlowClient.js +2 -2
- package/dist/client/SilentFlowClient.js.map +1 -1
- package/dist/client/UsernamePasswordClient.js +1 -1
- package/dist/config/ClientConfiguration.d.ts.map +1 -1
- package/dist/config/ClientConfiguration.js +3 -3
- package/dist/config/ClientConfiguration.js.map +1 -1
- package/dist/crypto/ICrypto.js +1 -1
- package/dist/crypto/JoseHeader.js +3 -3
- package/dist/crypto/JoseHeader.js.map +1 -1
- package/dist/crypto/PopTokenGenerator.js +1 -1
- package/dist/error/AuthError.js +1 -1
- package/dist/error/ClientAuthError.d.ts +16 -0
- package/dist/error/ClientAuthError.d.ts.map +1 -1
- package/dist/error/ClientAuthError.js +21 -1
- package/dist/error/ClientAuthError.js.map +1 -1
- package/dist/error/ClientConfigurationError.js +1 -1
- package/dist/error/InteractionRequiredAuthError.js +1 -1
- package/dist/error/JoseHeaderError.js +1 -1
- package/dist/error/ServerError.js +1 -1
- package/dist/index.cjs.js +700 -627
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/logger/Logger.js +1 -1
- package/dist/network/INetworkModule.js +1 -1
- package/dist/network/NetworkManager.d.ts +11 -0
- package/dist/network/NetworkManager.d.ts.map +1 -1
- package/dist/network/NetworkManager.js +1 -1
- package/dist/network/NetworkManager.js.map +1 -1
- package/dist/network/ThrottlingUtils.d.ts +1 -1
- package/dist/network/ThrottlingUtils.d.ts.map +1 -1
- package/dist/network/ThrottlingUtils.js +4 -4
- package/dist/network/ThrottlingUtils.js.map +1 -1
- package/dist/packageMetadata.d.ts +1 -1
- package/dist/packageMetadata.js +2 -2
- package/dist/packageMetadata.js.map +1 -1
- package/dist/request/AuthenticationHeaderParser.js +1 -1
- package/dist/request/NativeRequest.d.ts +20 -0
- package/dist/request/NativeRequest.d.ts.map +1 -0
- package/dist/request/NativeSignOutRequest.d.ts +6 -0
- package/dist/request/NativeSignOutRequest.d.ts.map +1 -0
- package/dist/request/RequestParameterBuilder.js +1 -1
- package/dist/request/RequestValidator.js +1 -1
- package/dist/request/ScopeSet.d.ts +6 -0
- package/dist/request/ScopeSet.d.ts.map +1 -1
- package/dist/request/ScopeSet.js +17 -2
- package/dist/request/ScopeSet.js.map +1 -1
- package/dist/response/ResponseHandler.d.ts +1 -1
- package/dist/response/ResponseHandler.d.ts.map +1 -1
- package/dist/response/ResponseHandler.js +8 -4
- package/dist/response/ResponseHandler.js.map +1 -1
- package/dist/response/ServerAuthorizationTokenResponse.d.ts +1 -0
- package/dist/response/ServerAuthorizationTokenResponse.d.ts.map +1 -1
- package/dist/telemetry/performance/IPerformanceClient.d.ts +5 -3
- package/dist/telemetry/performance/IPerformanceClient.d.ts.map +1 -1
- package/dist/telemetry/performance/PerformanceClient.d.ts +18 -41
- package/dist/telemetry/performance/PerformanceClient.d.ts.map +1 -1
- package/dist/telemetry/performance/PerformanceClient.js +93 -175
- package/dist/telemetry/performance/PerformanceClient.js.map +1 -1
- package/dist/telemetry/performance/PerformanceEvent.d.ts +28 -5
- package/dist/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
- package/dist/telemetry/performance/PerformanceEvent.js +3 -1
- package/dist/telemetry/performance/PerformanceEvent.js.map +1 -1
- package/dist/telemetry/performance/StubPerformanceClient.js +1 -1
- package/dist/telemetry/server/ServerTelemetryManager.js +1 -1
- package/dist/url/UrlString.js +1 -1
- package/dist/utils/Constants.d.ts +2 -16
- package/dist/utils/Constants.d.ts.map +1 -1
- package/dist/utils/Constants.js +3 -18
- package/dist/utils/Constants.js.map +1 -1
- package/dist/utils/ProtocolUtils.js +1 -1
- package/dist/utils/StringUtils.js +1 -1
- package/dist/utils/TimeUtils.js +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-common
|
|
1
|
+
/*! @azure/msal-common v12.0.0 2023-04-03 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { __assign } from '../../_virtual/_tslib.js';
|
|
4
4
|
import { IntFields, PerformanceEventStatus } from './PerformanceEvent.js';
|
|
@@ -28,11 +28,8 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
28
28
|
this.logger = logger;
|
|
29
29
|
this.callbacks = new Map();
|
|
30
30
|
this.eventsByCorrelationId = new Map();
|
|
31
|
-
this.staticFieldsByCorrelationId = new Map();
|
|
32
|
-
this.measurementsById = new Map();
|
|
33
31
|
this.queueMeasurements = new Map();
|
|
34
32
|
this.preQueueTimeByCorrelationId = new Map();
|
|
35
|
-
this.countersByCorrelationId = new Map();
|
|
36
33
|
}
|
|
37
34
|
/**
|
|
38
35
|
* Starts and returns an platform-specific implementation of IPerformanceMeasurement.
|
|
@@ -73,16 +70,16 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
73
70
|
* @returns {number}
|
|
74
71
|
*/
|
|
75
72
|
PerformanceClient.prototype.getPreQueueTime = function (eventName, correlationId) {
|
|
76
|
-
var
|
|
77
|
-
if (!
|
|
73
|
+
var preQueueEvent = this.preQueueTimeByCorrelationId.get(correlationId);
|
|
74
|
+
if (!preQueueEvent) {
|
|
78
75
|
this.logger.trace("PerformanceClient.getPreQueueTime: no pre-queue times found for correlationId: " + correlationId + ", unable to add queue measurement");
|
|
79
76
|
return;
|
|
80
77
|
}
|
|
81
|
-
else if (
|
|
78
|
+
else if (preQueueEvent.name !== eventName) {
|
|
82
79
|
this.logger.trace("PerformanceClient.getPreQueueTime: no pre-queue time found for " + eventName + ", unable to add queue measurement");
|
|
83
80
|
return;
|
|
84
81
|
}
|
|
85
|
-
return
|
|
82
|
+
return preQueueEvent.time;
|
|
86
83
|
};
|
|
87
84
|
/**
|
|
88
85
|
* Calculates the difference between current time and time when function was queued.
|
|
@@ -110,12 +107,13 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
110
107
|
/**
|
|
111
108
|
* Adds queue measurement time to QueueMeasurements array for given correlation ID.
|
|
112
109
|
*
|
|
113
|
-
* @param {PerformanceEvents}
|
|
110
|
+
* @param {PerformanceEvents} eventName
|
|
114
111
|
* @param {?string} correlationId
|
|
115
|
-
* @param {?number}
|
|
112
|
+
* @param {?number} queueTime
|
|
113
|
+
* @param {?boolean} manuallyCompleted - indicator for manually completed queue measurements
|
|
116
114
|
* @returns
|
|
117
115
|
*/
|
|
118
|
-
PerformanceClient.prototype.addQueueMeasurement = function (eventName, correlationId, queueTime) {
|
|
116
|
+
PerformanceClient.prototype.addQueueMeasurement = function (eventName, correlationId, queueTime, manuallyCompleted) {
|
|
119
117
|
if (!correlationId) {
|
|
120
118
|
this.logger.trace("PerformanceClient.addQueueMeasurement: correlationId not provided for " + eventName + ", cannot add queue measurement");
|
|
121
119
|
return;
|
|
@@ -128,7 +126,7 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
128
126
|
this.logger.trace("PerformanceClient.addQueueMeasurement: no queue time provided for " + eventName);
|
|
129
127
|
return;
|
|
130
128
|
}
|
|
131
|
-
var queueMeasurement = { eventName: eventName, queueTime: queueTime };
|
|
129
|
+
var queueMeasurement = { eventName: eventName, queueTime: queueTime, manuallyCompleted: manuallyCompleted };
|
|
132
130
|
// Adds to existing correlation Id if present in queueMeasurements
|
|
133
131
|
var existingMeasurements = this.queueMeasurements.get(correlationId);
|
|
134
132
|
if (existingMeasurements) {
|
|
@@ -141,6 +139,8 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
141
139
|
var measurementArray = [queueMeasurement];
|
|
142
140
|
this.queueMeasurements.set(correlationId, measurementArray);
|
|
143
141
|
}
|
|
142
|
+
// Delete processed pre-queue event.
|
|
143
|
+
this.preQueueTimeByCorrelationId.delete(correlationId);
|
|
144
144
|
};
|
|
145
145
|
/**
|
|
146
146
|
* Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
|
|
@@ -159,17 +159,8 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
159
159
|
}
|
|
160
160
|
// Duplicate code to address spelling error will be removed at the next major version bump.
|
|
161
161
|
this.logger.trace("PerformanceClient: Performance measurement started for " + measureName, eventCorrelationId);
|
|
162
|
-
var
|
|
163
|
-
|
|
164
|
-
if (performanceMeasuremeant.startMeasurement) {
|
|
165
|
-
performanceMeasuremeant.startMeasurement();
|
|
166
|
-
validMeasurement = performanceMeasuremeant;
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
var performanceMeasurement = this.startPerformanceMeasurement(measureName, eventCorrelationId);
|
|
170
|
-
performanceMeasurement.startMeasurement();
|
|
171
|
-
validMeasurement = performanceMeasurement;
|
|
172
|
-
}
|
|
162
|
+
var performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);
|
|
163
|
+
performanceMeasurement.startMeasurement();
|
|
173
164
|
var inProgressEvent = {
|
|
174
165
|
eventId: this.generateId(),
|
|
175
166
|
status: PerformanceEventStatus.InProgress,
|
|
@@ -180,27 +171,15 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
180
171
|
name: measureName,
|
|
181
172
|
startTimeMs: Date.now(),
|
|
182
173
|
correlationId: eventCorrelationId,
|
|
183
|
-
};
|
|
184
|
-
// Store in progress events so they can be discarded if not ended properly
|
|
185
|
-
this.cacheEventByCorrelationId(inProgressEvent);
|
|
186
|
-
var staticFields = {
|
|
187
174
|
appName: (_a = this.applicationTelemetry) === null || _a === void 0 ? void 0 : _a.appName,
|
|
188
175
|
appVersion: (_b = this.applicationTelemetry) === null || _b === void 0 ? void 0 : _b.appVersion,
|
|
189
176
|
};
|
|
190
|
-
|
|
191
|
-
this.
|
|
177
|
+
// Store in progress events so they can be discarded if not ended properly
|
|
178
|
+
this.cacheEventByCorrelationId(inProgressEvent);
|
|
192
179
|
// Return the event and functions the caller can use to properly end/flush the measurement
|
|
193
180
|
return {
|
|
194
181
|
endMeasurement: function (event) {
|
|
195
|
-
|
|
196
|
-
if (completedEvent) {
|
|
197
|
-
// Cache event so that submeasurements can be added downstream
|
|
198
|
-
_this.cacheEventByCorrelationId(completedEvent);
|
|
199
|
-
}
|
|
200
|
-
return completedEvent;
|
|
201
|
-
},
|
|
202
|
-
flushMeasurement: function () {
|
|
203
|
-
return _this.flushMeasurements(inProgressEvent.name, inProgressEvent.correlationId);
|
|
182
|
+
return _this.endMeasurement(__assign(__assign({}, inProgressEvent), event), performanceMeasurement);
|
|
204
183
|
},
|
|
205
184
|
discardMeasurement: function () {
|
|
206
185
|
return _this.discardMeasurements(inProgressEvent.correlationId);
|
|
@@ -211,40 +190,66 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
211
190
|
increment: function (counters) {
|
|
212
191
|
return _this.increment(counters, inProgressEvent.correlationId);
|
|
213
192
|
},
|
|
214
|
-
measurement:
|
|
193
|
+
measurement: performanceMeasurement,
|
|
215
194
|
event: inProgressEvent
|
|
216
195
|
};
|
|
217
196
|
};
|
|
218
197
|
/**
|
|
219
198
|
* Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,
|
|
220
199
|
* as consumers should instead use the function returned by startMeasurement.
|
|
200
|
+
* Adds a new field named as "[event name]DurationMs" for sub-measurements, completes and emits an event
|
|
201
|
+
* otherwise.
|
|
221
202
|
*
|
|
222
203
|
* @param {PerformanceEvent} event
|
|
204
|
+
* @param {IPerformanceMeasurement} measurement
|
|
223
205
|
* @returns {(PerformanceEvent | null)}
|
|
224
206
|
*/
|
|
225
|
-
PerformanceClient.prototype.endMeasurement = function (event) {
|
|
226
|
-
var
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
207
|
+
PerformanceClient.prototype.endMeasurement = function (event, measurement) {
|
|
208
|
+
var _this = this;
|
|
209
|
+
var _a, _b;
|
|
210
|
+
var rootEvent = this.eventsByCorrelationId.get(event.correlationId);
|
|
211
|
+
if (!rootEvent) {
|
|
212
|
+
this.logger.trace("PerformanceClient: Measurement not found for " + event.eventId, event.correlationId);
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
var isRoot = event.eventId === rootEvent.eventId;
|
|
216
|
+
var queueInfo = {
|
|
217
|
+
totalQueueTime: 0,
|
|
218
|
+
totalQueueCount: 0,
|
|
219
|
+
manuallyCompletedCount: 0
|
|
220
|
+
};
|
|
221
|
+
if (isRoot) {
|
|
222
|
+
queueInfo = this.getQueueInfo(event.correlationId);
|
|
223
|
+
this.discardCache(rootEvent.correlationId);
|
|
243
224
|
}
|
|
244
225
|
else {
|
|
245
|
-
|
|
226
|
+
(_a = rootEvent.incompleteSubMeasurements) === null || _a === void 0 ? void 0 : _a.delete(event.eventId);
|
|
227
|
+
}
|
|
228
|
+
measurement === null || measurement === void 0 ? void 0 : measurement.endMeasurement();
|
|
229
|
+
var durationMs = measurement === null || measurement === void 0 ? void 0 : measurement.flushMeasurement();
|
|
230
|
+
// null indicates no measurement was taken (e.g. needed performance APIs not present)
|
|
231
|
+
if (!durationMs) {
|
|
232
|
+
this.logger.trace("PerformanceClient: Performance measurement not taken", rootEvent.correlationId);
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
this.logger.trace("PerformanceClient: Performance measurement ended for " + event.name + ": " + durationMs + " ms", event.correlationId);
|
|
236
|
+
// Add sub-measurement attribute to root event.
|
|
237
|
+
if (!isRoot) {
|
|
238
|
+
rootEvent[event.name + "DurationMs"] = Math.floor(durationMs);
|
|
239
|
+
return __assign({}, rootEvent);
|
|
246
240
|
}
|
|
247
|
-
|
|
241
|
+
var finalEvent = __assign(__assign({}, rootEvent), event);
|
|
242
|
+
var incompleteSubsCount = 0;
|
|
243
|
+
// Incomplete sub-measurements are discarded. They are likely an instrumentation bug that should be fixed.
|
|
244
|
+
(_b = finalEvent.incompleteSubMeasurements) === null || _b === void 0 ? void 0 : _b.forEach(function (subMeasurement) {
|
|
245
|
+
_this.logger.trace("PerformanceClient: Incomplete submeasurement " + subMeasurement.name + " found for " + event.name, finalEvent.correlationId);
|
|
246
|
+
incompleteSubsCount++;
|
|
247
|
+
});
|
|
248
|
+
finalEvent.incompleteSubMeasurements = undefined;
|
|
249
|
+
finalEvent = __assign(__assign({}, finalEvent), { durationMs: Math.round(durationMs), queuedTimeMs: queueInfo.totalQueueTime, queuedCount: queueInfo.totalQueueCount, queuedManuallyCompletedCount: queueInfo.manuallyCompletedCount, status: PerformanceEventStatus.Completed, incompleteSubsCount: incompleteSubsCount });
|
|
250
|
+
this.truncateIntegralFields(finalEvent, this.getIntFields());
|
|
251
|
+
this.emitEvents([finalEvent], event.correlationId);
|
|
252
|
+
return finalEvent;
|
|
248
253
|
};
|
|
249
254
|
/**
|
|
250
255
|
* Saves extra information to be emitted when the measurements are flushed
|
|
@@ -252,14 +257,13 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
252
257
|
* @param correlationId
|
|
253
258
|
*/
|
|
254
259
|
PerformanceClient.prototype.addStaticFields = function (fields, correlationId) {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
this.
|
|
260
|
+
this.logger.trace("PerformanceClient: Updating static fields");
|
|
261
|
+
var event = this.eventsByCorrelationId.get(correlationId);
|
|
262
|
+
if (event) {
|
|
263
|
+
this.eventsByCorrelationId.set(correlationId, __assign(__assign({}, event), fields));
|
|
259
264
|
}
|
|
260
265
|
else {
|
|
261
|
-
this.logger.trace("PerformanceClient:
|
|
262
|
-
this.staticFieldsByCorrelationId.set(correlationId, fields);
|
|
266
|
+
this.logger.trace("PerformanceClient: Event not found for", correlationId);
|
|
263
267
|
}
|
|
264
268
|
};
|
|
265
269
|
/**
|
|
@@ -268,18 +272,18 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
268
272
|
* @param correlationId {string} correlation identifier
|
|
269
273
|
*/
|
|
270
274
|
PerformanceClient.prototype.increment = function (counters, correlationId) {
|
|
271
|
-
var existing = this.countersByCorrelationId.get(correlationId);
|
|
272
|
-
if (!existing) {
|
|
273
|
-
this.logger.trace("PerformanceClient: Setting counters");
|
|
274
|
-
this.countersByCorrelationId.set(correlationId, __assign({}, counters));
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
275
|
this.logger.trace("PerformanceClient: Updating counters");
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
276
|
+
var event = this.eventsByCorrelationId.get(correlationId);
|
|
277
|
+
if (event) {
|
|
278
|
+
for (var counter in counters) {
|
|
279
|
+
if (!event.hasOwnProperty(counter)) {
|
|
280
|
+
event[counter] = 0;
|
|
281
|
+
}
|
|
282
|
+
event[counter] += counters[counter];
|
|
281
283
|
}
|
|
282
|
-
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
this.logger.trace("PerformanceClient: Event not found for", correlationId);
|
|
283
287
|
}
|
|
284
288
|
};
|
|
285
289
|
/**
|
|
@@ -292,117 +296,35 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
292
296
|
* @param {PerformanceEvent} event
|
|
293
297
|
*/
|
|
294
298
|
PerformanceClient.prototype.cacheEventByCorrelationId = function (event) {
|
|
295
|
-
var
|
|
296
|
-
if (
|
|
299
|
+
var rootEvent = this.eventsByCorrelationId.get(event.correlationId);
|
|
300
|
+
if (rootEvent) {
|
|
297
301
|
this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " added/updated", event.correlationId);
|
|
298
|
-
|
|
302
|
+
rootEvent.incompleteSubMeasurements = rootEvent.incompleteSubMeasurements || new Map();
|
|
303
|
+
rootEvent.incompleteSubMeasurements.set(event.eventId, { name: event.name, startTimeMs: event.startTimeMs });
|
|
299
304
|
}
|
|
300
305
|
else {
|
|
301
306
|
this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " started", event.correlationId);
|
|
302
|
-
this.eventsByCorrelationId.set(event.correlationId,
|
|
307
|
+
this.eventsByCorrelationId.set(event.correlationId, __assign({}, event));
|
|
303
308
|
}
|
|
304
309
|
};
|
|
305
|
-
|
|
306
|
-
* Cache measurements by their id.
|
|
307
|
-
*
|
|
308
|
-
* @private
|
|
309
|
-
* @param {PerformanceEvent} event
|
|
310
|
-
* @param {IPerformanceMeasurement} measurement
|
|
311
|
-
*/
|
|
312
|
-
PerformanceClient.prototype.cacheMeasurement = function (event, measurement) {
|
|
313
|
-
this.measurementsById.set(event.eventId, measurement);
|
|
314
|
-
};
|
|
315
|
-
/**
|
|
316
|
-
* Gathers and emits performance events for measurements taked for the given top-level API and correlation ID.
|
|
317
|
-
*
|
|
318
|
-
* @param {PerformanceEvents} measureName
|
|
319
|
-
* @param {string} correlationId
|
|
320
|
-
*/
|
|
321
|
-
PerformanceClient.prototype.flushMeasurements = function (measureName, correlationId) {
|
|
322
|
-
var _this = this;
|
|
323
|
-
this.logger.trace("PerformanceClient: Performance measurements flushed for " + measureName, correlationId);
|
|
324
|
-
/**
|
|
325
|
-
* Adds all queue time and count measurements for given correlation ID
|
|
326
|
-
* then deletes queue times for given correlation ID from queueMeasurements map.
|
|
327
|
-
*/
|
|
310
|
+
PerformanceClient.prototype.getQueueInfo = function (correlationId) {
|
|
328
311
|
var queueMeasurementForCorrelationId = this.queueMeasurements.get(correlationId);
|
|
329
312
|
if (!queueMeasurementForCorrelationId) {
|
|
330
313
|
this.logger.trace("PerformanceClient: no queue measurements found for for correlationId: " + correlationId);
|
|
331
314
|
}
|
|
332
315
|
var totalQueueTime = 0;
|
|
333
316
|
var totalQueueCount = 0;
|
|
317
|
+
var manuallyCompletedCount = 0;
|
|
334
318
|
queueMeasurementForCorrelationId === null || queueMeasurementForCorrelationId === void 0 ? void 0 : queueMeasurementForCorrelationId.forEach(function (measurement) {
|
|
335
319
|
totalQueueTime += measurement.queueTime;
|
|
336
320
|
totalQueueCount++;
|
|
321
|
+
manuallyCompletedCount += measurement.manuallyCompleted ? 1 : 0;
|
|
337
322
|
});
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
/*
|
|
344
|
-
* Manually end incomplete submeasurements to ensure there arent orphaned/never ending events.
|
|
345
|
-
* Incomplete submeasurements are likely an instrumentation bug that should be fixed.
|
|
346
|
-
* IE only supports Map.forEach.
|
|
347
|
-
*/
|
|
348
|
-
var completedEvents_1 = [];
|
|
349
|
-
var incompleteSubsCount_1 = 0;
|
|
350
|
-
eventsForCorrelationId.forEach(function (event) {
|
|
351
|
-
if (event.name !== measureName && event.status !== PerformanceEventStatus.Completed) {
|
|
352
|
-
_this.logger.trace("PerformanceClient: Incomplete submeasurement " + event.name + " found for " + measureName, correlationId);
|
|
353
|
-
incompleteSubsCount_1++;
|
|
354
|
-
var completedEvent = _this.endMeasurement(event);
|
|
355
|
-
if (completedEvent) {
|
|
356
|
-
completedEvents_1.push(completedEvent);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
completedEvents_1.push(event);
|
|
360
|
-
});
|
|
361
|
-
// Sort events by start time (earliest first)
|
|
362
|
-
var sortedCompletedEvents = completedEvents_1.sort(function (eventA, eventB) { return eventA.startTimeMs - eventB.startTimeMs; });
|
|
363
|
-
// Take completed top level event and add completed submeasurements durations as properties
|
|
364
|
-
var topLevelEvents = sortedCompletedEvents.filter(function (event) { return event.name === measureName && event.status === PerformanceEventStatus.Completed; });
|
|
365
|
-
if (topLevelEvents.length > 0) {
|
|
366
|
-
/*
|
|
367
|
-
* Only take the first top-level event if there are multiple events with the same correlation id.
|
|
368
|
-
* This greatly simplifies logic for submeasurements.
|
|
369
|
-
*/
|
|
370
|
-
if (topLevelEvents.length > 1) {
|
|
371
|
-
this.logger.verbose("PerformanceClient: Multiple distinct top-level performance events found, using the first", correlationId);
|
|
372
|
-
}
|
|
373
|
-
var topLevelEvent = topLevelEvents[0];
|
|
374
|
-
this.logger.verbose("PerformanceClient: Measurement found for " + measureName, correlationId);
|
|
375
|
-
// Build event object with top level and sub measurements
|
|
376
|
-
var eventToEmit = sortedCompletedEvents.reduce(function (previous, current) {
|
|
377
|
-
if (current.name !== measureName) {
|
|
378
|
-
_this.logger.trace("PerformanceClient: Complete submeasurement found for " + current.name, correlationId);
|
|
379
|
-
// TODO: Emit additional properties for each subMeasurement
|
|
380
|
-
var subMeasurementName = current.name + "DurationMs";
|
|
381
|
-
/*
|
|
382
|
-
* Some code paths, such as resolving an authority, can occur multiple times.
|
|
383
|
-
* Only take the first measurement, since the second could be read from the cache,
|
|
384
|
-
* or due to the same correlation id being used for two distinct requests.
|
|
385
|
-
*/
|
|
386
|
-
if (!previous[subMeasurementName]) {
|
|
387
|
-
previous[subMeasurementName] = current.durationMs;
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
_this.logger.verbose("PerformanceClient: Submeasurement for " + measureName + " already exists for " + current.name + ", ignoring", correlationId);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
return previous;
|
|
394
|
-
}, topLevelEvent);
|
|
395
|
-
var finalEvent = __assign(__assign(__assign(__assign({}, eventToEmit), staticFields), counters), { queuedTimeMs: totalQueueTime, queuedCount: totalQueueCount, incompleteSubsCount: incompleteSubsCount_1 });
|
|
396
|
-
this.truncateIntegralFields(finalEvent, this.getIntFields());
|
|
397
|
-
this.emitEvents([finalEvent], eventToEmit.correlationId);
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
this.logger.verbose("PerformanceClient: No completed top-level measurements found for " + measureName, correlationId);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
this.logger.verbose("PerformanceClient: No measurements found", correlationId);
|
|
405
|
-
}
|
|
323
|
+
return {
|
|
324
|
+
totalQueueTime: totalQueueTime,
|
|
325
|
+
totalQueueCount: totalQueueCount,
|
|
326
|
+
manuallyCompletedCount: manuallyCompletedCount
|
|
327
|
+
};
|
|
406
328
|
};
|
|
407
329
|
/**
|
|
408
330
|
* Removes measurements for a given correlation id.
|
|
@@ -416,14 +338,10 @@ var PerformanceClient = /** @class */ (function () {
|
|
|
416
338
|
/**
|
|
417
339
|
* Removes cache for a given correlation id.
|
|
418
340
|
*
|
|
419
|
-
* @param {string} correlation identifier
|
|
341
|
+
* @param {string} correlationId correlation identifier
|
|
420
342
|
*/
|
|
421
343
|
PerformanceClient.prototype.discardCache = function (correlationId) {
|
|
422
344
|
this.discardMeasurements(correlationId);
|
|
423
|
-
this.logger.trace("PerformanceClient: Static fields discarded", correlationId);
|
|
424
|
-
this.staticFieldsByCorrelationId.delete(correlationId);
|
|
425
|
-
this.logger.trace("PerformanceClient: Counters discarded", correlationId);
|
|
426
|
-
this.countersByCorrelationId.delete(correlationId);
|
|
427
345
|
this.logger.trace("PerformanceClient: QueueMeasurements discarded", correlationId);
|
|
428
346
|
this.queueMeasurements.delete(correlationId);
|
|
429
347
|
this.logger.trace("PerformanceClient: Pre-queue times discarded", correlationId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerformanceClient.js","sources":["../../../src/telemetry/performance/PerformanceClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ApplicationTelemetry } from \"../../config/ClientConfiguration\";\nimport { Logger } from \"../../logger/Logger\";\nimport { InProgressPerformanceEvent, IPerformanceClient, PerformanceCallbackFunction, QueueMeasurement } from \"./IPerformanceClient\";\nimport { IPerformanceMeasurement } from \"./IPerformanceMeasurement\";\nimport {\n Counters,\n PerformanceEvent,\n IntFields,\n PerformanceEvents,\n PerformanceEventStatus,\n StaticFields\n} from \"./PerformanceEvent\";\n\nexport abstract class PerformanceClient implements IPerformanceClient {\n protected authority: string;\n protected libraryName: string;\n protected libraryVersion: string;\n protected applicationTelemetry: ApplicationTelemetry;\n protected clientId: string;\n protected logger: Logger;\n protected callbacks: Map<string, PerformanceCallbackFunction>;\n\n /**\n * Multiple events with the same correlation id.\n * Double keyed by correlation id and event id.\n * @protected\n * @type {Map<string, Map<string, PerformanceEvent>>}\n */\n protected eventsByCorrelationId: Map<string, Map<string, PerformanceEvent>>;\n\n /**\n * Fields to be emitted which are scoped to the top level request and whose value will not change in submeasurements\n * For example: App name, version, etc.\n */\n protected staticFieldsByCorrelationId: Map<string, StaticFields>;\n\n /**\n * Counters to be emitted which are scoped to the top level request and whose value may change in sub-measurements\n */\n protected countersByCorrelationId: Map<string, Counters>;\n\n /**\n * Underlying performance measurements for each operation\n *\n * @protected\n * @type {Map<string, IPerformanceMeasurement>}\n */\n protected measurementsById: Map<string, IPerformanceMeasurement>;\n\n /**\n * Map of pre-queue times by correlation Id\n *\n * @protected\n * @type {Map<string, Map<string, number>>}\n */\n protected preQueueTimeByCorrelationId: Map<string, Map<string, number>>;\n\n /**\n * Map of queue measurements by correlation Id\n *\n * @protected\n * @type {Map<string, Array<QueueMeasurement>>}\n */\n protected queueMeasurements: Map<string, Array<QueueMeasurement>>;\n\n /**\n * Creates an instance of PerformanceClient,\n * an abstract class containing core performance telemetry logic.\n *\n * @constructor\n * @param {string} clientId Client ID of the application\n * @param {string} authority Authority used by the application\n * @param {Logger} logger Logger used by the application\n * @param {string} libraryName Name of the library\n * @param {string} libraryVersion Version of the library\n */\n constructor(clientId: string, authority: string, logger: Logger, libraryName: string, libraryVersion: string, applicationTelemetry: ApplicationTelemetry) {\n this.authority = authority;\n this.libraryName = libraryName;\n this.libraryVersion = libraryVersion;\n this.applicationTelemetry = applicationTelemetry;\n this.clientId = clientId;\n this.logger = logger;\n this.callbacks = new Map();\n this.eventsByCorrelationId = new Map();\n this.staticFieldsByCorrelationId = new Map();\n this.measurementsById = new Map();\n this.queueMeasurements = new Map();\n this.preQueueTimeByCorrelationId = new Map();\n this.countersByCorrelationId = new Map();\n }\n\n /**\n * Generates and returns a unique id, typically a guid.\n *\n * @abstract\n * @returns {string}\n */\n abstract generateId(): string;\n\n /**\n * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\n * Note: this function can be changed to abstract at the next major version bump.\n *\n * @param {string} measureName\n * @param {string} correlationId\n * @returns {IPerformanceMeasurement}\n */\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n startPerformanceMeasurement(measureName: string, correlationId: string): IPerformanceMeasurement {\n return {} as IPerformanceMeasurement;\n }\n\n /**\n * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\n * Note: this incorrectly-named function will be removed at the next major version bump.\n *\n * @param {string} measureName\n * @param {string} correlationId\n * @returns {IPerformanceMeasurement}\n */\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n startPerformanceMeasuremeant(measureName: string, correlationId: string): IPerformanceMeasurement {\n return {} as IPerformanceMeasurement;\n }\n\n /**\n * Sets pre-queue time by correlation Id\n *\n * @abstract\n * @param {PerformanceEvents} eventName\n * @param {string} correlationId\n * @returns\n */\n abstract setPreQueueTime(eventName: PerformanceEvents, correlationId?: string): void;\n\n /**\n * Get integral fields.\n * Override to change the set.\n */\n getIntFields(): ReadonlySet<string> {\n return IntFields;\n }\n\n /**\n * Gets map of pre-queue times by correlation Id\n *\n * @param {PerformanceEvents} eventName\n * @param {string} correlationId\n * @returns {number}\n */\n getPreQueueTime(eventName: PerformanceEvents, correlationId: string): number | void {\n const preQueueTimesByEvents = this.preQueueTimeByCorrelationId.get(correlationId);\n\n if (!preQueueTimesByEvents) {\n this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue times found for correlationId: ${correlationId}, unable to add queue measurement`);\n return;\n } else if (!preQueueTimesByEvents.get(eventName)) {\n this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue time found for ${eventName}, unable to add queue measurement`);\n return;\n }\n\n return preQueueTimesByEvents.get(eventName);\n }\n\n /**\n * Calculates the difference between current time and time when function was queued.\n * Note: It is possible to have 0 as the queue time if the current time and the queued time was the same.\n *\n * @param {number} preQueueTime\n * @param {number} currentTime\n * @returns {number}\n */\n calculateQueuedTime(preQueueTime: number, currentTime: number): number {\n if (preQueueTime < 1) {\n this.logger.trace(`PerformanceClient: preQueueTime should be a positive integer and not ${preQueueTime}`);\n return 0;\n }\n\n if (currentTime < 1) {\n this.logger.trace(`PerformanceClient: currentTime should be a positive integer and not ${currentTime}`);\n return 0;\n }\n\n if (currentTime < preQueueTime) {\n this.logger.trace(\"PerformanceClient: currentTime is less than preQueueTime, check how time is being retrieved\");\n return 0;\n }\n\n return currentTime-preQueueTime;\n }\n\n /**\n * Adds queue measurement time to QueueMeasurements array for given correlation ID.\n *\n * @param {PerformanceEvents} name\n * @param {?string} correlationId\n * @param {?number} time\n * @returns\n */\n addQueueMeasurement(eventName: PerformanceEvents, correlationId?: string, queueTime?: number): void {\n if (!correlationId) {\n this.logger.trace(`PerformanceClient.addQueueMeasurement: correlationId not provided for ${eventName}, cannot add queue measurement`);\n return;\n }\n\n if (queueTime === 0) {\n // Possible for there to be no queue time after calculation\n this.logger.trace(`PerformanceClient.addQueueMeasurement: queue time provided for ${eventName} is ${queueTime}`);\n } else if (!queueTime) {\n this.logger.trace(`PerformanceClient.addQueueMeasurement: no queue time provided for ${eventName}`);\n return;\n }\n\n const queueMeasurement = {eventName, queueTime} as QueueMeasurement;\n\n // Adds to existing correlation Id if present in queueMeasurements\n const existingMeasurements = this.queueMeasurements.get(correlationId);\n if (existingMeasurements) {\n existingMeasurements.push(queueMeasurement);\n this.queueMeasurements.set(correlationId, existingMeasurements);\n } else {\n // Sets new correlation Id if not present in queueMeasurements\n this.logger.trace(`PerformanceClient.addQueueMeasurement: adding correlationId ${correlationId} to queue measurements`);\n const measurementArray = [queueMeasurement];\n this.queueMeasurements.set(correlationId, measurementArray);\n }\n }\n\n /**\n * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.\n *\n * @param {PerformanceEvents} measureName\n * @param {?string} [correlationId]\n * @returns {InProgressPerformanceEvent}\n */\n startMeasurement(measureName: PerformanceEvents, correlationId?: string): InProgressPerformanceEvent {\n // Generate a placeholder correlation if the request does not provide one\n const eventCorrelationId = correlationId || this.generateId();\n if (!correlationId) {\n this.logger.info(`PerformanceClient: No correlation id provided for ${measureName}, generating`, eventCorrelationId);\n }\n\n // Duplicate code to address spelling error will be removed at the next major version bump.\n this.logger.trace(`PerformanceClient: Performance measurement started for ${measureName}`, eventCorrelationId);\n let validMeasurement: IPerformanceMeasurement;\n const performanceMeasuremeant = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);\n if (performanceMeasuremeant.startMeasurement) {\n performanceMeasuremeant.startMeasurement();\n validMeasurement = performanceMeasuremeant;\n } else {\n const performanceMeasurement = this.startPerformanceMeasurement(measureName, eventCorrelationId);\n performanceMeasurement.startMeasurement();\n validMeasurement = performanceMeasurement;\n }\n\n const inProgressEvent: PerformanceEvent = {\n eventId: this.generateId(),\n status: PerformanceEventStatus.InProgress,\n authority: this.authority,\n libraryName: this.libraryName,\n libraryVersion: this.libraryVersion,\n clientId: this.clientId,\n name: measureName,\n startTimeMs: Date.now(),\n correlationId: eventCorrelationId,\n };\n\n // Store in progress events so they can be discarded if not ended properly\n this.cacheEventByCorrelationId(inProgressEvent);\n\n const staticFields: StaticFields = {\n appName: this.applicationTelemetry?.appName,\n appVersion: this.applicationTelemetry?.appVersion,\n };\n this.addStaticFields(staticFields, eventCorrelationId);\n this.cacheMeasurement(inProgressEvent, validMeasurement);\n\n // Return the event and functions the caller can use to properly end/flush the measurement\n return {\n endMeasurement: (event?: Partial<PerformanceEvent>): PerformanceEvent | null => {\n const completedEvent = this.endMeasurement({\n // Initial set of event properties\n ...inProgressEvent,\n // Properties set when event ends\n ...event\n });\n\n if (completedEvent) {\n // Cache event so that submeasurements can be added downstream\n this.cacheEventByCorrelationId(completedEvent);\n }\n return completedEvent;\n },\n flushMeasurement: () => {\n return this.flushMeasurements(inProgressEvent.name, inProgressEvent.correlationId);\n },\n discardMeasurement: () => {\n return this.discardMeasurements(inProgressEvent.correlationId);\n },\n addStaticFields: (fields: StaticFields) => {\n return this.addStaticFields(fields, inProgressEvent.correlationId);\n },\n increment: (counters: Counters) => {\n return this.increment(counters, inProgressEvent.correlationId);\n },\n measurement: validMeasurement,\n event: inProgressEvent\n };\n\n }\n\n /**\n * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,\n * as consumers should instead use the function returned by startMeasurement.\n *\n * @param {PerformanceEvent} event\n * @returns {(PerformanceEvent | null)}\n */\n endMeasurement(event: PerformanceEvent): PerformanceEvent | null {\n const performanceMeasurement = this.measurementsById.get(event.eventId);\n if (performanceMeasurement) {\n // Immediately delete so that the same event isnt ended twice\n this.measurementsById.delete(event.eventId);\n performanceMeasurement.endMeasurement();\n const durationMs = performanceMeasurement.flushMeasurement();\n // null indicates no measurement was taken (e.g. needed performance APIs not present)\n if (durationMs !== null) {\n this.logger.trace(`PerformanceClient: Performance measurement ended for ${event.name}: ${durationMs} ms`, event.correlationId);\n const completedEvent: PerformanceEvent = {\n // Allow duration to be overwritten when event ends (e.g. testing), but not status\n durationMs: Math.round(durationMs),\n ...event,\n status: PerformanceEventStatus.Completed,\n };\n\n return completedEvent;\n } else {\n this.logger.trace(\"PerformanceClient: Performance measurement not taken\", event.correlationId);\n }\n } else {\n this.logger.trace(`PerformanceClient: Measurement not found for ${event.eventId}`, event.correlationId);\n }\n\n return null;\n }\n\n /**\n * Saves extra information to be emitted when the measurements are flushed\n * @param fields\n * @param correlationId\n */\n addStaticFields(fields: StaticFields, correlationId: string) : void{\n const existingStaticFields = this.staticFieldsByCorrelationId.get(correlationId);\n if (existingStaticFields) {\n this.logger.trace(\"PerformanceClient: Updating static fields\");\n this.staticFieldsByCorrelationId.set(correlationId, {...existingStaticFields, ...fields});\n } else {\n this.logger.trace(\"PerformanceClient: Adding static fields\");\n this.staticFieldsByCorrelationId.set(correlationId, fields);\n }\n }\n\n /**\n * Increment counters to be emitted when the measurements are flushed\n * @param counters {Counters}\n * @param correlationId {string} correlation identifier\n */\n increment(counters: Counters, correlationId: string): void {\n const existing: Counters | undefined = this.countersByCorrelationId.get(correlationId);\n if (!existing) {\n this.logger.trace(\"PerformanceClient: Setting counters\");\n this.countersByCorrelationId.set(correlationId, { ...counters });\n return;\n }\n\n this.logger.trace(\"PerformanceClient: Updating counters\");\n for (const counter in counters) {\n if (!existing.hasOwnProperty(counter)) {\n existing[counter] = 0;\n }\n existing[counter] += counters[counter];\n }\n }\n\n /**\n * Upserts event into event cache.\n * First key is the correlation id, second key is the event id.\n * Allows for events to be grouped by correlation id,\n * and to easily allow for properties on them to be updated.\n *\n * @private\n * @param {PerformanceEvent} event\n */\n private cacheEventByCorrelationId(event: PerformanceEvent) {\n const existingEvents = this.eventsByCorrelationId.get(event.correlationId);\n if (existingEvents) {\n this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} added/updated`, event.correlationId);\n existingEvents.set(event.eventId, event);\n } else {\n this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} started`, event.correlationId);\n this.eventsByCorrelationId.set(event.correlationId, new Map().set(event.eventId, event));\n }\n }\n\n /**\n * Cache measurements by their id.\n *\n * @private\n * @param {PerformanceEvent} event\n * @param {IPerformanceMeasurement} measurement\n */\n private cacheMeasurement(event: PerformanceEvent, measurement: IPerformanceMeasurement) {\n this.measurementsById.set(event.eventId, measurement);\n }\n\n /**\n * Gathers and emits performance events for measurements taked for the given top-level API and correlation ID.\n *\n * @param {PerformanceEvents} measureName\n * @param {string} correlationId\n */\n flushMeasurements(measureName: PerformanceEvents, correlationId: string): void {\n this.logger.trace(`PerformanceClient: Performance measurements flushed for ${measureName}`, correlationId);\n\n /**\n * Adds all queue time and count measurements for given correlation ID\n * then deletes queue times for given correlation ID from queueMeasurements map.\n */\n\n const queueMeasurementForCorrelationId = this.queueMeasurements.get(correlationId);\n if (!queueMeasurementForCorrelationId) {\n this.logger.trace(`PerformanceClient: no queue measurements found for for correlationId: ${correlationId}`);\n }\n\n let totalQueueTime = 0;\n let totalQueueCount = 0;\n queueMeasurementForCorrelationId?.forEach((measurement) => {\n totalQueueTime += measurement.queueTime;\n totalQueueCount++;\n });\n\n const eventsForCorrelationId = this.eventsByCorrelationId.get(correlationId);\n const staticFields = this.staticFieldsByCorrelationId.get(correlationId);\n const counters = this.countersByCorrelationId.get(correlationId);\n\n if (eventsForCorrelationId) {\n this.discardCache(correlationId);\n\n /*\n * Manually end incomplete submeasurements to ensure there arent orphaned/never ending events.\n * Incomplete submeasurements are likely an instrumentation bug that should be fixed.\n * IE only supports Map.forEach.\n */\n const completedEvents: PerformanceEvent[] = [];\n let incompleteSubsCount: number = 0;\n\n eventsForCorrelationId.forEach(event => {\n if (event.name !== measureName && event.status !== PerformanceEventStatus.Completed) {\n this.logger.trace(`PerformanceClient: Incomplete submeasurement ${event.name} found for ${measureName}`, correlationId);\n incompleteSubsCount++;\n\n const completedEvent = this.endMeasurement(event);\n if (completedEvent) {\n completedEvents.push(completedEvent);\n }\n }\n\n completedEvents.push(event);\n });\n\n // Sort events by start time (earliest first)\n const sortedCompletedEvents = completedEvents.sort((eventA, eventB) => eventA.startTimeMs - eventB.startTimeMs);\n\n // Take completed top level event and add completed submeasurements durations as properties\n const topLevelEvents = sortedCompletedEvents.filter(event => event.name === measureName && event.status === PerformanceEventStatus.Completed);\n if (topLevelEvents.length > 0) {\n /*\n * Only take the first top-level event if there are multiple events with the same correlation id.\n * This greatly simplifies logic for submeasurements.\n */\n if (topLevelEvents.length > 1) {\n this.logger.verbose(\"PerformanceClient: Multiple distinct top-level performance events found, using the first\", correlationId);\n }\n const topLevelEvent = topLevelEvents[0];\n this.logger.verbose(`PerformanceClient: Measurement found for ${measureName}`, correlationId);\n\n // Build event object with top level and sub measurements\n const eventToEmit = sortedCompletedEvents.reduce((previous, current) => {\n if (current.name !== measureName) {\n this.logger.trace(`PerformanceClient: Complete submeasurement found for ${current.name}`, correlationId);\n // TODO: Emit additional properties for each subMeasurement\n const subMeasurementName = `${current.name}DurationMs`;\n /*\n * Some code paths, such as resolving an authority, can occur multiple times.\n * Only take the first measurement, since the second could be read from the cache,\n * or due to the same correlation id being used for two distinct requests.\n */\n if (!previous[subMeasurementName]) {\n previous[subMeasurementName] = current.durationMs;\n } else {\n this.logger.verbose(`PerformanceClient: Submeasurement for ${measureName} already exists for ${current.name}, ignoring`, correlationId);\n }\n }\n\n return previous;\n }, topLevelEvent);\n\n const finalEvent: PerformanceEvent = {\n ...eventToEmit,\n ...staticFields,\n ...counters,\n queuedTimeMs: totalQueueTime,\n queuedCount: totalQueueCount,\n incompleteSubsCount\n };\n this.truncateIntegralFields(finalEvent, this.getIntFields());\n\n this.emitEvents([finalEvent], eventToEmit.correlationId);\n } else {\n this.logger.verbose(`PerformanceClient: No completed top-level measurements found for ${measureName}`, correlationId);\n }\n } else {\n this.logger.verbose(\"PerformanceClient: No measurements found\", correlationId);\n }\n }\n\n /**\n * Removes measurements for a given correlation id.\n *\n * @param {string} correlationId\n */\n discardMeasurements(correlationId: string): void {\n this.logger.trace(\"PerformanceClient: Performance measurements discarded\", correlationId);\n this.eventsByCorrelationId.delete(correlationId);\n }\n\n /**\n * Removes cache for a given correlation id.\n *\n * @param {string} correlation identifier\n */\n private discardCache(correlationId: string): void {\n this.discardMeasurements(correlationId);\n\n this.logger.trace(\"PerformanceClient: Static fields discarded\", correlationId);\n this.staticFieldsByCorrelationId.delete(correlationId);\n\n this.logger.trace(\"PerformanceClient: Counters discarded\", correlationId);\n this.countersByCorrelationId.delete(correlationId);\n\n this.logger.trace(\"PerformanceClient: QueueMeasurements discarded\", correlationId);\n this.queueMeasurements.delete(correlationId);\n\n this.logger.trace(\"PerformanceClient: Pre-queue times discarded\", correlationId);\n this.preQueueTimeByCorrelationId.delete(correlationId);\n }\n\n /**\n * Registers a callback function to receive performance events.\n *\n * @param {PerformanceCallbackFunction} callback\n * @returns {string}\n */\n addPerformanceCallback(callback: PerformanceCallbackFunction): string {\n const callbackId = this.generateId();\n this.callbacks.set(callbackId, callback);\n this.logger.verbose(`PerformanceClient: Performance callback registered with id: ${callbackId}`);\n\n return callbackId;\n }\n\n /**\n * Removes a callback registered with addPerformanceCallback.\n *\n * @param {string} callbackId\n * @returns {boolean}\n */\n removePerformanceCallback(callbackId: string): boolean {\n const result = this.callbacks.delete(callbackId);\n\n if (result) {\n this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} removed.`);\n } else {\n this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} not removed.`);\n }\n\n return result;\n }\n\n /**\n * Emits events to all registered callbacks.\n *\n * @param {PerformanceEvent[]} events\n * @param {?string} [correlationId]\n */\n emitEvents(events: PerformanceEvent[], correlationId: string): void {\n this.logger.verbose(\"PerformanceClient: Emitting performance events\", correlationId);\n\n this.callbacks.forEach((callback: PerformanceCallbackFunction, callbackId: string) => {\n this.logger.trace(`PerformanceClient: Emitting event to callback ${callbackId}`, correlationId);\n callback.apply(null, [events]);\n });\n }\n\n /**\n * Enforce truncation of integral fields in performance event.\n * @param {PerformanceEvent} event performance event to update.\n * @param {Set<string>} intFields integral fields.\n */\n private truncateIntegralFields(event: PerformanceEvent, intFields: ReadonlySet<string>): void {\n intFields.forEach((key) => {\n if (key in event && typeof event[key] === \"number\") {\n event[key] = Math.floor(event[key]);\n }\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PerformanceClient.js","sources":["../../../src/telemetry/performance/PerformanceClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ApplicationTelemetry } from \"../../config/ClientConfiguration\";\nimport { Logger } from \"../../logger/Logger\";\nimport {\n InProgressPerformanceEvent,\n IPerformanceClient,\n PerformanceCallbackFunction,\n QueueMeasurement\n} from \"./IPerformanceClient\";\nimport { IPerformanceMeasurement } from \"./IPerformanceMeasurement\";\nimport {\n Counters,\n IntFields,\n PerformanceEvent,\n PerformanceEvents,\n PerformanceEventStatus,\n StaticFields\n} from \"./PerformanceEvent\";\n\nexport interface PreQueueEvent {\n name: PerformanceEvents;\n time: number;\n}\n\nexport abstract class PerformanceClient implements IPerformanceClient {\n protected authority: string;\n protected libraryName: string;\n protected libraryVersion: string;\n protected applicationTelemetry: ApplicationTelemetry;\n protected clientId: string;\n protected logger: Logger;\n protected callbacks: Map<string, PerformanceCallbackFunction>;\n\n /**\n * Multiple events with the same correlation id.\n * @protected\n * @type {Map<string, PerformanceEvent>}\n */\n protected eventsByCorrelationId: Map<string, PerformanceEvent>;\n\n /**\n * Map of pre-queue times by correlation Id\n *\n * @protected\n * @type {Map<string, PreQueueEvent>}\n */\n protected preQueueTimeByCorrelationId: Map<string, PreQueueEvent>;\n\n /**\n * Map of queue measurements by correlation Id\n *\n * @protected\n * @type {Map<string, Array<QueueMeasurement>>}\n */\n protected queueMeasurements: Map<string, Array<QueueMeasurement>>;\n\n /**\n * Creates an instance of PerformanceClient,\n * an abstract class containing core performance telemetry logic.\n *\n * @constructor\n * @param {string} clientId Client ID of the application\n * @param {string} authority Authority used by the application\n * @param {Logger} logger Logger used by the application\n * @param {string} libraryName Name of the library\n * @param {string} libraryVersion Version of the library\n */\n constructor(clientId: string, authority: string, logger: Logger, libraryName: string, libraryVersion: string, applicationTelemetry: ApplicationTelemetry) {\n this.authority = authority;\n this.libraryName = libraryName;\n this.libraryVersion = libraryVersion;\n this.applicationTelemetry = applicationTelemetry;\n this.clientId = clientId;\n this.logger = logger;\n this.callbacks = new Map();\n this.eventsByCorrelationId = new Map();\n this.queueMeasurements = new Map();\n this.preQueueTimeByCorrelationId = new Map();\n }\n\n /**\n * Generates and returns a unique id, typically a guid.\n *\n * @abstract\n * @returns {string}\n */\n abstract generateId(): string;\n\n /**\n * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\n * Note: this function can be changed to abstract at the next major version bump.\n *\n * @param {string} measureName\n * @param {string} correlationId\n * @returns {IPerformanceMeasurement}\n */\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n startPerformanceMeasurement(measureName: string, correlationId: string): IPerformanceMeasurement {\n return {} as IPerformanceMeasurement;\n }\n\n /**\n * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\n * Note: this incorrectly-named function will be removed at the next major version bump.\n *\n * @param {string} measureName\n * @param {string} correlationId\n * @returns {IPerformanceMeasurement}\n */\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n startPerformanceMeasuremeant(measureName: string, correlationId: string): IPerformanceMeasurement {\n return {} as IPerformanceMeasurement;\n }\n\n /**\n * Sets pre-queue time by correlation Id\n *\n * @abstract\n * @param {PerformanceEvents} eventName\n * @param {string} correlationId\n * @returns\n */\n abstract setPreQueueTime(eventName: PerformanceEvents, correlationId?: string): void;\n\n /**\n * Get integral fields.\n * Override to change the set.\n */\n getIntFields(): ReadonlySet<string> {\n return IntFields;\n }\n\n /**\n * Gets map of pre-queue times by correlation Id\n *\n * @param {PerformanceEvents} eventName\n * @param {string} correlationId\n * @returns {number}\n */\n getPreQueueTime(eventName: PerformanceEvents, correlationId: string): number | void {\n const preQueueEvent: PreQueueEvent | undefined = this.preQueueTimeByCorrelationId.get(correlationId);\n\n if (!preQueueEvent) {\n this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue times found for correlationId: ${correlationId}, unable to add queue measurement`);\n return;\n } else if (preQueueEvent.name !== eventName) {\n this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue time found for ${eventName}, unable to add queue measurement`);\n return;\n }\n\n return preQueueEvent.time;\n }\n\n /**\n * Calculates the difference between current time and time when function was queued.\n * Note: It is possible to have 0 as the queue time if the current time and the queued time was the same.\n *\n * @param {number} preQueueTime\n * @param {number} currentTime\n * @returns {number}\n */\n calculateQueuedTime(preQueueTime: number, currentTime: number): number {\n if (preQueueTime < 1) {\n this.logger.trace(`PerformanceClient: preQueueTime should be a positive integer and not ${preQueueTime}`);\n return 0;\n }\n\n if (currentTime < 1) {\n this.logger.trace(`PerformanceClient: currentTime should be a positive integer and not ${currentTime}`);\n return 0;\n }\n\n if (currentTime < preQueueTime) {\n this.logger.trace(\"PerformanceClient: currentTime is less than preQueueTime, check how time is being retrieved\");\n return 0;\n }\n\n return currentTime-preQueueTime;\n }\n\n /**\n * Adds queue measurement time to QueueMeasurements array for given correlation ID.\n *\n * @param {PerformanceEvents} eventName\n * @param {?string} correlationId\n * @param {?number} queueTime\n * @param {?boolean} manuallyCompleted - indicator for manually completed queue measurements\n * @returns\n */\n addQueueMeasurement(eventName: PerformanceEvents, correlationId?: string, queueTime?: number, manuallyCompleted?: boolean): void {\n if (!correlationId) {\n this.logger.trace(`PerformanceClient.addQueueMeasurement: correlationId not provided for ${eventName}, cannot add queue measurement`);\n return;\n }\n\n if (queueTime === 0) {\n // Possible for there to be no queue time after calculation\n this.logger.trace(`PerformanceClient.addQueueMeasurement: queue time provided for ${eventName} is ${queueTime}`);\n } else if (!queueTime) {\n this.logger.trace(`PerformanceClient.addQueueMeasurement: no queue time provided for ${eventName}`);\n return;\n }\n\n const queueMeasurement: QueueMeasurement = {eventName, queueTime, manuallyCompleted};\n\n // Adds to existing correlation Id if present in queueMeasurements\n const existingMeasurements = this.queueMeasurements.get(correlationId);\n if (existingMeasurements) {\n existingMeasurements.push(queueMeasurement);\n this.queueMeasurements.set(correlationId, existingMeasurements);\n } else {\n // Sets new correlation Id if not present in queueMeasurements\n this.logger.trace(`PerformanceClient.addQueueMeasurement: adding correlationId ${correlationId} to queue measurements`);\n const measurementArray = [queueMeasurement];\n this.queueMeasurements.set(correlationId, measurementArray);\n }\n // Delete processed pre-queue event.\n this.preQueueTimeByCorrelationId.delete(correlationId);\n }\n\n /**\n * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.\n *\n * @param {PerformanceEvents} measureName\n * @param {?string} [correlationId]\n * @returns {InProgressPerformanceEvent}\n */\n startMeasurement(measureName: PerformanceEvents, correlationId?: string): InProgressPerformanceEvent {\n // Generate a placeholder correlation if the request does not provide one\n const eventCorrelationId = correlationId || this.generateId();\n if (!correlationId) {\n this.logger.info(`PerformanceClient: No correlation id provided for ${measureName}, generating`, eventCorrelationId);\n }\n\n // Duplicate code to address spelling error will be removed at the next major version bump.\n this.logger.trace(`PerformanceClient: Performance measurement started for ${measureName}`, eventCorrelationId);\n const performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);\n performanceMeasurement.startMeasurement();\n\n const inProgressEvent: PerformanceEvent = {\n eventId: this.generateId(),\n status: PerformanceEventStatus.InProgress,\n authority: this.authority,\n libraryName: this.libraryName,\n libraryVersion: this.libraryVersion,\n clientId: this.clientId,\n name: measureName,\n startTimeMs: Date.now(),\n correlationId: eventCorrelationId,\n appName: this.applicationTelemetry?.appName,\n appVersion: this.applicationTelemetry?.appVersion,\n };\n\n // Store in progress events so they can be discarded if not ended properly\n this.cacheEventByCorrelationId(inProgressEvent);\n\n // Return the event and functions the caller can use to properly end/flush the measurement\n return {\n endMeasurement: (event?: Partial<PerformanceEvent>): PerformanceEvent | null => {\n return this.endMeasurement({\n // Initial set of event properties\n ...inProgressEvent,\n // Properties set when event ends\n ...event\n },\n performanceMeasurement);\n },\n discardMeasurement: () => {\n return this.discardMeasurements(inProgressEvent.correlationId);\n },\n addStaticFields: (fields: StaticFields) => {\n return this.addStaticFields(fields, inProgressEvent.correlationId);\n },\n increment: (counters: Counters) => {\n return this.increment(counters, inProgressEvent.correlationId);\n },\n measurement: performanceMeasurement,\n event: inProgressEvent\n };\n\n }\n\n /**\n * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,\n * as consumers should instead use the function returned by startMeasurement.\n * Adds a new field named as \"[event name]DurationMs\" for sub-measurements, completes and emits an event\n * otherwise.\n *\n * @param {PerformanceEvent} event\n * @param {IPerformanceMeasurement} measurement\n * @returns {(PerformanceEvent | null)}\n */\n endMeasurement(event: PerformanceEvent, measurement?: IPerformanceMeasurement): PerformanceEvent | null {\n const rootEvent: PerformanceEvent | undefined = this.eventsByCorrelationId.get(event.correlationId);\n if (!rootEvent) {\n this.logger.trace(`PerformanceClient: Measurement not found for ${event.eventId}`, event.correlationId);\n return null;\n }\n\n const isRoot = event.eventId === rootEvent.eventId;\n let queueInfo = {\n totalQueueTime: 0,\n totalQueueCount: 0,\n manuallyCompletedCount: 0\n };\n if (isRoot) {\n queueInfo = this.getQueueInfo(event.correlationId);\n this.discardCache(rootEvent.correlationId);\n } else {\n rootEvent.incompleteSubMeasurements?.delete(event.eventId);\n }\n\n measurement?.endMeasurement();\n const durationMs = measurement?.flushMeasurement();\n // null indicates no measurement was taken (e.g. needed performance APIs not present)\n if (!durationMs) {\n this.logger.trace(\"PerformanceClient: Performance measurement not taken\", rootEvent.correlationId);\n return null;\n }\n\n this.logger.trace(`PerformanceClient: Performance measurement ended for ${event.name}: ${durationMs} ms`, event.correlationId);\n\n // Add sub-measurement attribute to root event.\n if (!isRoot) {\n rootEvent[event.name + \"DurationMs\"] = Math.floor(durationMs);\n return { ...rootEvent };\n }\n\n let finalEvent: PerformanceEvent = { ...rootEvent, ...event };\n let incompleteSubsCount: number = 0;\n // Incomplete sub-measurements are discarded. They are likely an instrumentation bug that should be fixed.\n finalEvent.incompleteSubMeasurements?.forEach(subMeasurement => {\n this.logger.trace(`PerformanceClient: Incomplete submeasurement ${subMeasurement.name} found for ${event.name}`, finalEvent.correlationId);\n incompleteSubsCount++;\n });\n finalEvent.incompleteSubMeasurements = undefined;\n\n finalEvent = {\n ...finalEvent,\n durationMs: Math.round(durationMs),\n queuedTimeMs: queueInfo.totalQueueTime,\n queuedCount: queueInfo.totalQueueCount,\n queuedManuallyCompletedCount: queueInfo.manuallyCompletedCount,\n status: PerformanceEventStatus.Completed,\n incompleteSubsCount\n };\n this.truncateIntegralFields(finalEvent, this.getIntFields());\n this.emitEvents([finalEvent], event.correlationId);\n\n return finalEvent;\n }\n\n /**\n * Saves extra information to be emitted when the measurements are flushed\n * @param fields\n * @param correlationId\n */\n addStaticFields(fields: StaticFields, correlationId: string) : void {\n this.logger.trace(\"PerformanceClient: Updating static fields\");\n const event = this.eventsByCorrelationId.get(correlationId);\n if (event) {\n this.eventsByCorrelationId.set(correlationId, {...event, ...fields});\n } else {\n this.logger.trace(\"PerformanceClient: Event not found for\", correlationId);\n }\n }\n\n /**\n * Increment counters to be emitted when the measurements are flushed\n * @param counters {Counters}\n * @param correlationId {string} correlation identifier\n */\n increment(counters: Counters, correlationId: string): void {\n this.logger.trace(\"PerformanceClient: Updating counters\");\n const event = this.eventsByCorrelationId.get(correlationId);\n if (event) {\n for (const counter in counters) {\n if (!event.hasOwnProperty(counter)) {\n event[counter] = 0;\n }\n event[counter] += counters[counter];\n }\n } else {\n this.logger.trace(\"PerformanceClient: Event not found for\", correlationId);\n }\n }\n\n /**\n * Upserts event into event cache.\n * First key is the correlation id, second key is the event id.\n * Allows for events to be grouped by correlation id,\n * and to easily allow for properties on them to be updated.\n *\n * @private\n * @param {PerformanceEvent} event\n */\n private cacheEventByCorrelationId(event: PerformanceEvent) {\n const rootEvent = this.eventsByCorrelationId.get(event.correlationId);\n if (rootEvent) {\n this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} added/updated`, event.correlationId);\n rootEvent.incompleteSubMeasurements = rootEvent.incompleteSubMeasurements || new Map();\n rootEvent.incompleteSubMeasurements.set(event.eventId, {name: event.name, startTimeMs: event.startTimeMs });\n } else {\n this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} started`, event.correlationId);\n this.eventsByCorrelationId.set(event.correlationId, { ...event });\n }\n }\n\n private getQueueInfo(correlationId: string): { totalQueueTime: number, totalQueueCount: number, manuallyCompletedCount: number } {\n const queueMeasurementForCorrelationId = this.queueMeasurements.get(correlationId);\n if (!queueMeasurementForCorrelationId) {\n this.logger.trace(`PerformanceClient: no queue measurements found for for correlationId: ${correlationId}`);\n }\n\n let totalQueueTime = 0;\n let totalQueueCount = 0;\n let manuallyCompletedCount = 0;\n queueMeasurementForCorrelationId?.forEach((measurement) => {\n totalQueueTime += measurement.queueTime;\n totalQueueCount++;\n manuallyCompletedCount += measurement.manuallyCompleted ? 1 : 0;\n });\n\n return {\n totalQueueTime,\n totalQueueCount,\n manuallyCompletedCount\n };\n }\n\n /**\n * Removes measurements for a given correlation id.\n *\n * @param {string} correlationId\n */\n discardMeasurements(correlationId: string): void {\n this.logger.trace(\"PerformanceClient: Performance measurements discarded\", correlationId);\n this.eventsByCorrelationId.delete(correlationId);\n }\n\n /**\n * Removes cache for a given correlation id.\n *\n * @param {string} correlationId correlation identifier\n */\n private discardCache(correlationId: string): void {\n this.discardMeasurements(correlationId);\n\n this.logger.trace(\"PerformanceClient: QueueMeasurements discarded\", correlationId);\n this.queueMeasurements.delete(correlationId);\n\n this.logger.trace(\"PerformanceClient: Pre-queue times discarded\", correlationId);\n this.preQueueTimeByCorrelationId.delete(correlationId);\n }\n\n /**\n * Registers a callback function to receive performance events.\n *\n * @param {PerformanceCallbackFunction} callback\n * @returns {string}\n */\n addPerformanceCallback(callback: PerformanceCallbackFunction): string {\n const callbackId = this.generateId();\n this.callbacks.set(callbackId, callback);\n this.logger.verbose(`PerformanceClient: Performance callback registered with id: ${callbackId}`);\n\n return callbackId;\n }\n\n /**\n * Removes a callback registered with addPerformanceCallback.\n *\n * @param {string} callbackId\n * @returns {boolean}\n */\n removePerformanceCallback(callbackId: string): boolean {\n const result = this.callbacks.delete(callbackId);\n\n if (result) {\n this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} removed.`);\n } else {\n this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} not removed.`);\n }\n\n return result;\n }\n\n /**\n * Emits events to all registered callbacks.\n *\n * @param {PerformanceEvent[]} events\n * @param {?string} [correlationId]\n */\n emitEvents(events: PerformanceEvent[], correlationId: string): void {\n this.logger.verbose(\"PerformanceClient: Emitting performance events\", correlationId);\n\n this.callbacks.forEach((callback: PerformanceCallbackFunction, callbackId: string) => {\n this.logger.trace(`PerformanceClient: Emitting event to callback ${callbackId}`, correlationId);\n callback.apply(null, [events]);\n });\n }\n\n /**\n * Enforce truncation of integral fields in performance event.\n * @param {PerformanceEvent} event performance event to update.\n * @param {Set<string>} intFields integral fields.\n */\n private truncateIntegralFields(event: PerformanceEvent, intFields: ReadonlySet<string>): void {\n intFields.forEach((key) => {\n if (key in event && typeof event[key] === \"number\") {\n event[key] = Math.floor(event[key]);\n }\n });\n }\n}\n"],"names":[],"mappings":"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"}
|