@webex/internal-plugin-metrics 3.12.0-next.1 → 3.12.0-next.10
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/call-diagnostic/call-diagnostic-metrics-latencies.js +52 -39
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +4 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +2 -2
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
- package/dist/call-diagnostic/config.js +2 -1
- package/dist/call-diagnostic/config.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +9 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +22 -13
- package/dist/types/metrics.types.d.ts +1 -1
- package/package.json +3 -3
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +114 -47
- package/src/call-diagnostic/call-diagnostic-metrics.ts +5 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +2 -1
- package/src/call-diagnostic/config.ts +1 -0
- package/src/metrics.types.ts +1 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +5 -2
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +179 -227
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +9 -0
|
@@ -137,11 +137,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
137
137
|
architecture: "unknown" | "intel32" | "intel64" | "amd32" | "amd64" | "arm32" | "arm64" | "armv9" | "armv8" | "armv7" | "armv6" | "x86_64" | "x86_32";
|
|
138
138
|
staticPerformance?: string;
|
|
139
139
|
clockSpeedGigaHertz?: number;
|
|
140
|
-
additionalProperties?:
|
|
140
|
+
additionalProperties?: never;
|
|
141
141
|
};
|
|
142
142
|
shareType?: "cb-normal-share" | "ce-airplay-share" | "ce-direct-share" | "ce-gui-loopback-share" | "ce-input-source-share" | "ce-input-source-share-hdmi" | "ce-input-source-share-usbc" | "ce-jpg-share" | "ce-miracast-share" | "mcs-normal-share" | "mcs-normal-audio-share" | "mcs-hfps-share" | "mcs-hfps-audio-share";
|
|
143
143
|
videoDisplayMode?: "grid-view" | "active-speaker-view";
|
|
144
|
-
videoLayoutType?: "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery";
|
|
144
|
+
videoLayoutType?: "auto" | "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery" | "autoWithShare";
|
|
145
145
|
videoRenderType?: "wme" | "client_d3d" | "client_gdi";
|
|
146
146
|
vdiInfo?: {};
|
|
147
147
|
is64BitsClient?: boolean;
|
|
@@ -153,13 +153,16 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
153
153
|
vendorId?: string;
|
|
154
154
|
staticPerformanceLevel?: string;
|
|
155
155
|
staticPerformanceScore?: number;
|
|
156
|
-
|
|
156
|
+
preInstalledTime?: string;
|
|
157
|
+
preInstalledType?: "installer" | "launcher" | "app";
|
|
158
|
+
preInstalledVersion?: string;
|
|
159
|
+
additionalProperties?: never;
|
|
157
160
|
};
|
|
158
161
|
emmVendorId?: string;
|
|
159
162
|
isHybridMedia?: boolean;
|
|
160
163
|
originData?: {};
|
|
161
164
|
serviceVersion?: string;
|
|
162
|
-
additionalProperties?:
|
|
165
|
+
additionalProperties?: never;
|
|
163
166
|
};
|
|
164
167
|
/**
|
|
165
168
|
* Gather identifier details for call diagnostic payload.
|
|
@@ -183,7 +186,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
183
186
|
imiAppId: string;
|
|
184
187
|
sessionId: string;
|
|
185
188
|
sessionInstanceId: string;
|
|
186
|
-
additionalProperties?:
|
|
189
|
+
additionalProperties?: never;
|
|
187
190
|
};
|
|
188
191
|
csdmDeviceUrl?: string;
|
|
189
192
|
destinationBreakoutSessionId?: string;
|
|
@@ -199,6 +202,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
199
202
|
ivrId?: string;
|
|
200
203
|
callId?: string;
|
|
201
204
|
pairCallId?: string;
|
|
205
|
+
llmWebsocketUrl?: string;
|
|
202
206
|
locusId?: string;
|
|
203
207
|
locusJoinUrl?: string;
|
|
204
208
|
locusSessionId?: string;
|
|
@@ -212,6 +216,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
212
216
|
meetingLookupUrl?: string;
|
|
213
217
|
meetingOrgId?: string;
|
|
214
218
|
metricServiceUrl?: string;
|
|
219
|
+
mercuryWebsocketUrl?: string;
|
|
215
220
|
msteamsTenantGuid?: string;
|
|
216
221
|
msteamsConferenceId?: string;
|
|
217
222
|
msteamsMeetingId?: string;
|
|
@@ -225,7 +230,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
225
230
|
sipSessionId?: {
|
|
226
231
|
local?: string;
|
|
227
232
|
remote?: string;
|
|
228
|
-
additionalProperties?:
|
|
233
|
+
additionalProperties?: never;
|
|
229
234
|
};
|
|
230
235
|
sipUri?: string;
|
|
231
236
|
subConfId?: string;
|
|
@@ -253,7 +258,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
253
258
|
idForEndpointAB?: string;
|
|
254
259
|
customerOrgId?: string;
|
|
255
260
|
correlationId: string;
|
|
256
|
-
additionalProperties?:
|
|
261
|
+
additionalProperties?: never;
|
|
257
262
|
} | {
|
|
258
263
|
aggregatedBreakoutMoveId?: string;
|
|
259
264
|
attendeeId?: string;
|
|
@@ -271,7 +276,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
271
276
|
imiAppId: string;
|
|
272
277
|
sessionId: string;
|
|
273
278
|
sessionInstanceId: string;
|
|
274
|
-
additionalProperties?:
|
|
279
|
+
additionalProperties?: never;
|
|
275
280
|
};
|
|
276
281
|
csdmDeviceUrl?: string;
|
|
277
282
|
destinationBreakoutSessionId?: string;
|
|
@@ -287,6 +292,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
287
292
|
ivrId?: string;
|
|
288
293
|
callId?: string;
|
|
289
294
|
pairCallId?: string;
|
|
295
|
+
llmWebsocketUrl?: string;
|
|
290
296
|
locusId?: string;
|
|
291
297
|
locusJoinUrl?: string;
|
|
292
298
|
locusSessionId?: string;
|
|
@@ -300,6 +306,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
300
306
|
meetingLookupUrl?: string;
|
|
301
307
|
meetingOrgId?: string;
|
|
302
308
|
metricServiceUrl?: string;
|
|
309
|
+
mercuryWebsocketUrl?: string;
|
|
303
310
|
msteamsTenantGuid?: string;
|
|
304
311
|
msteamsConferenceId?: string;
|
|
305
312
|
msteamsMeetingId?: string;
|
|
@@ -313,7 +320,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
313
320
|
sipSessionId?: {
|
|
314
321
|
local?: string;
|
|
315
322
|
remote?: string;
|
|
316
|
-
additionalProperties?:
|
|
323
|
+
additionalProperties?: never;
|
|
317
324
|
};
|
|
318
325
|
sipUri?: string;
|
|
319
326
|
subConfId?: string;
|
|
@@ -341,7 +348,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
341
348
|
idForEndpointAB?: string;
|
|
342
349
|
customerOrgId?: string;
|
|
343
350
|
correlationId: string;
|
|
344
|
-
additionalProperties?:
|
|
351
|
+
additionalProperties?: never;
|
|
345
352
|
} | {
|
|
346
353
|
aggregatedBreakoutMoveId?: string;
|
|
347
354
|
attendeeId?: string;
|
|
@@ -359,7 +366,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
359
366
|
imiAppId: string;
|
|
360
367
|
sessionId: string;
|
|
361
368
|
sessionInstanceId: string;
|
|
362
|
-
additionalProperties?:
|
|
369
|
+
additionalProperties?: never;
|
|
363
370
|
};
|
|
364
371
|
csdmDeviceUrl?: string;
|
|
365
372
|
destinationBreakoutSessionId?: string;
|
|
@@ -375,6 +382,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
375
382
|
ivrId?: string;
|
|
376
383
|
callId?: string;
|
|
377
384
|
pairCallId?: string;
|
|
385
|
+
llmWebsocketUrl?: string;
|
|
378
386
|
locusId?: string;
|
|
379
387
|
locusJoinUrl?: string;
|
|
380
388
|
locusSessionId?: string;
|
|
@@ -388,6 +396,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
388
396
|
meetingLookupUrl?: string;
|
|
389
397
|
meetingOrgId?: string;
|
|
390
398
|
metricServiceUrl?: string;
|
|
399
|
+
mercuryWebsocketUrl?: string;
|
|
391
400
|
msteamsTenantGuid?: string;
|
|
392
401
|
msteamsConferenceId?: string;
|
|
393
402
|
msteamsMeetingId?: string;
|
|
@@ -401,7 +410,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
401
410
|
sipSessionId?: {
|
|
402
411
|
local?: string;
|
|
403
412
|
remote?: string;
|
|
404
|
-
additionalProperties?:
|
|
413
|
+
additionalProperties?: never;
|
|
405
414
|
};
|
|
406
415
|
sipUri?: string;
|
|
407
416
|
subConfId?: string;
|
|
@@ -429,7 +438,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
429
438
|
idForEndpointAB?: string;
|
|
430
439
|
customerOrgId?: string;
|
|
431
440
|
correlationId: string;
|
|
432
|
-
additionalProperties?:
|
|
441
|
+
additionalProperties?: never;
|
|
433
442
|
};
|
|
434
443
|
/**
|
|
435
444
|
* Create diagnostic event, which can hold client event, feature event or MQE event data.
|
|
@@ -154,7 +154,7 @@ export type BuildClientEventFetchRequestOptions = (args: {
|
|
|
154
154
|
payload?: RecursivePartial<ClientEvent['payload']>;
|
|
155
155
|
options?: SubmitClientEventOptions;
|
|
156
156
|
}) => Promise<any>;
|
|
157
|
-
export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.click.to.interstitial.with.user.delay' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
|
|
157
|
+
export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.click.to.interstitial.with.user.delay' | 'internal.click.to.interstitial.for.client.jmt' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
|
|
158
158
|
export interface IdType {
|
|
159
159
|
meetingId?: string;
|
|
160
160
|
callId?: string;
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@sinonjs/fake-timers": "^6.0.1",
|
|
25
25
|
"@webex/babel-config-legacy": "0.0.0",
|
|
26
26
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
27
|
-
"@webex/event-dictionary-ts": "^1.0.
|
|
27
|
+
"@webex/event-dictionary-ts": "^1.0.2138",
|
|
28
28
|
"@webex/jest-config-legacy": "0.0.0",
|
|
29
29
|
"@webex/legacy-tools": "0.0.0",
|
|
30
30
|
"@webex/test-helper-chai": "3.11.0-next.1",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@webex/common-timers": "3.11.0-next.1",
|
|
41
41
|
"@webex/test-helper-chai": "3.11.0-next.1",
|
|
42
42
|
"@webex/test-helper-mock-webex": "3.11.0-next.1",
|
|
43
|
-
"@webex/webex-core": "3.12.0-next.
|
|
43
|
+
"@webex/webex-core": "3.12.0-next.10",
|
|
44
44
|
"ip-anonymize": "^0.1.0",
|
|
45
45
|
"lodash": "^4.17.21",
|
|
46
46
|
"uuid": "^3.3.2"
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"test:style": "eslint ./src/**/*.*",
|
|
54
54
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
55
55
|
},
|
|
56
|
-
"version": "3.12.0-next.
|
|
56
|
+
"version": "3.12.0-next.10"
|
|
57
57
|
}
|
|
@@ -193,7 +193,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
193
193
|
*/
|
|
194
194
|
public getShowInterstitialTime() {
|
|
195
195
|
return this.getDiffBetweenTimestamps(
|
|
196
|
-
'client.interstitial-window.
|
|
196
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
197
197
|
'internal.client.interstitial-window.click.joinbutton'
|
|
198
198
|
);
|
|
199
199
|
}
|
|
@@ -303,7 +303,39 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
303
303
|
* @returns - latency
|
|
304
304
|
*/
|
|
305
305
|
public getStayLobbyTime() {
|
|
306
|
-
return this.getDiffBetweenTimestamps('client.
|
|
306
|
+
return this.getDiffBetweenTimestamps('client.lobby.entered', 'client.lobby.exited');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Stay lobby time capped by a certain timestamp.
|
|
311
|
+
* This is to handle the case where the target end timestamp could happen before the lobby is exited,
|
|
312
|
+
* for example media-engine.ready or client.ice.end
|
|
313
|
+
* This is supposed to be called AFTER the end timestamp happens
|
|
314
|
+
* @param endTimestampKey name of the target end event
|
|
315
|
+
* @returns - latency
|
|
316
|
+
*/
|
|
317
|
+
public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {
|
|
318
|
+
const lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)
|
|
319
|
+
|
|
320
|
+
if (typeof lobbyStartTimestamp !== 'number') {
|
|
321
|
+
// no lobby in the meeting, stayLobbyTime is 0
|
|
322
|
+
return 0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)
|
|
326
|
+
const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist
|
|
327
|
+
|
|
328
|
+
if (typeof maximumEndTimestamp !== 'number') {
|
|
329
|
+
// the provided timestamp to be used as a cap should exist, return undefined if it doesn't
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const endTimestamp =
|
|
334
|
+
typeof lobbyEndTimestamp === 'number'
|
|
335
|
+
? Math.min(lobbyEndTimestamp, maximumEndTimestamp)
|
|
336
|
+
: maximumEndTimestamp;
|
|
337
|
+
|
|
338
|
+
return clamp(endTimestamp - lobbyStartTimestamp, 0, this.MAX_INTEGER);
|
|
307
339
|
}
|
|
308
340
|
|
|
309
341
|
/**
|
|
@@ -390,11 +422,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
390
422
|
* @returns - latency
|
|
391
423
|
*/
|
|
392
424
|
public getCallInitMediaEngineReady() {
|
|
393
|
-
return this.
|
|
394
|
-
'internal.client.interstitial-window.click.joinbutton',
|
|
395
|
-
'client.media-engine.ready',
|
|
396
|
-
{maximum: 1200000}
|
|
397
|
-
);
|
|
425
|
+
return this.getInterstitialToMediaOKJMT();
|
|
398
426
|
}
|
|
399
427
|
|
|
400
428
|
/**
|
|
@@ -402,20 +430,21 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
402
430
|
* @returns - latency
|
|
403
431
|
*/
|
|
404
432
|
public getInterstitialToMediaOKJMT() {
|
|
405
|
-
const
|
|
406
|
-
'internal.client.interstitial-window.click.joinbutton'
|
|
433
|
+
const interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps(
|
|
434
|
+
'internal.client.interstitial-window.click.joinbutton',
|
|
435
|
+
'client.ice.end'
|
|
407
436
|
);
|
|
437
|
+
const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');
|
|
408
438
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
return clamp(interstitialToMediaOKJmt, 0, this.MAX_INTEGER);
|
|
439
|
+
if (
|
|
440
|
+
typeof interstitialClickJoinToIceEnd === 'number' &&
|
|
441
|
+
typeof stayLobbyTimeCappedByIceEnd === 'number'
|
|
442
|
+
) {
|
|
443
|
+
return clamp(
|
|
444
|
+
interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd,
|
|
445
|
+
0,
|
|
446
|
+
this.MAX_INTEGER
|
|
447
|
+
);
|
|
419
448
|
}
|
|
420
449
|
|
|
421
450
|
return undefined;
|
|
@@ -427,10 +456,20 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
427
456
|
*/
|
|
428
457
|
public getTotalJMT() {
|
|
429
458
|
const clickToInterstitial = this.getClickToInterstitial();
|
|
430
|
-
const
|
|
459
|
+
const interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps(
|
|
460
|
+
'internal.client.interstitial-window.click.joinbutton',
|
|
461
|
+
'client.locus.join.response'
|
|
462
|
+
);
|
|
431
463
|
|
|
432
|
-
if (
|
|
433
|
-
|
|
464
|
+
if (
|
|
465
|
+
typeof clickToInterstitial === 'number' &&
|
|
466
|
+
typeof interstitialClickJoinToJoinLocusResponse === 'number'
|
|
467
|
+
) {
|
|
468
|
+
return clamp(
|
|
469
|
+
clickToInterstitial + interstitialClickJoinToJoinLocusResponse,
|
|
470
|
+
0,
|
|
471
|
+
this.MAX_INTEGER
|
|
472
|
+
);
|
|
434
473
|
}
|
|
435
474
|
|
|
436
475
|
return undefined;
|
|
@@ -442,13 +481,20 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
442
481
|
*/
|
|
443
482
|
public getTotalJMTWithUserDelay() {
|
|
444
483
|
const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
|
|
445
|
-
const
|
|
484
|
+
const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(
|
|
485
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
486
|
+
'client.locus.join.response'
|
|
487
|
+
);
|
|
446
488
|
|
|
447
489
|
if (
|
|
448
490
|
typeof clickToInterstitialWithUserDelay === 'number' &&
|
|
449
|
-
typeof
|
|
491
|
+
typeof interstitialShowedToJoinLocusResponse === 'number'
|
|
450
492
|
) {
|
|
451
|
-
return clamp(
|
|
493
|
+
return clamp(
|
|
494
|
+
clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse,
|
|
495
|
+
0,
|
|
496
|
+
this.MAX_INTEGER
|
|
497
|
+
);
|
|
452
498
|
}
|
|
453
499
|
|
|
454
500
|
return undefined;
|
|
@@ -475,22 +521,26 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
475
521
|
*/
|
|
476
522
|
public getTotalMediaJMT() {
|
|
477
523
|
const clickToInterstitial = this.getClickToInterstitial();
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
524
|
+
const interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps(
|
|
525
|
+
'internal.client.interstitial-window.click.joinbutton',
|
|
526
|
+
'client.media-engine.ready'
|
|
527
|
+
);
|
|
528
|
+
const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(
|
|
529
|
+
'client.media-engine.ready'
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
if (
|
|
533
|
+
typeof clickToInterstitial === 'number' &&
|
|
534
|
+
typeof interstitialClickJoinToMediaEngineReady === 'number' &&
|
|
535
|
+
typeof stayLobbyTimeCappedByMediaEngineReady === 'number'
|
|
536
|
+
) {
|
|
537
|
+
return clamp(
|
|
538
|
+
clickToInterstitial +
|
|
539
|
+
interstitialClickJoinToMediaEngineReady -
|
|
540
|
+
stayLobbyTimeCappedByMediaEngineReady,
|
|
486
541
|
0,
|
|
487
|
-
|
|
542
|
+
this.MAX_INTEGER
|
|
488
543
|
);
|
|
489
|
-
if (this.getMeeting()?.allowMediaInLobby) {
|
|
490
|
-
return clamp(totalMediaJMT, 0, this.MAX_INTEGER);
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
return clamp(totalMediaJMT - lobbyTime, 0, this.MAX_INTEGER);
|
|
494
544
|
}
|
|
495
545
|
|
|
496
546
|
return undefined;
|
|
@@ -502,12 +552,17 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
502
552
|
*/
|
|
503
553
|
public getTotalMediaJMTWithUserDelay() {
|
|
504
554
|
const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
|
|
505
|
-
const
|
|
506
|
-
|
|
555
|
+
const interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(
|
|
556
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
557
|
+
'client.media-engine.ready'
|
|
558
|
+
);
|
|
507
559
|
|
|
508
|
-
if (
|
|
560
|
+
if (
|
|
561
|
+
typeof clickToInterstitialWithUserDelay === 'number' &&
|
|
562
|
+
typeof interstitialShowedToMediaEngineReady === 'number'
|
|
563
|
+
) {
|
|
509
564
|
return clamp(
|
|
510
|
-
clickToInterstitialWithUserDelay +
|
|
565
|
+
clickToInterstitialWithUserDelay + interstitialShowedToMediaEngineReady,
|
|
511
566
|
0,
|
|
512
567
|
this.MAX_INTEGER
|
|
513
568
|
);
|
|
@@ -521,11 +576,23 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
521
576
|
* @returns - latency
|
|
522
577
|
*/
|
|
523
578
|
public getClientJMT() {
|
|
524
|
-
const
|
|
525
|
-
|
|
579
|
+
const clickToInterstitialForClientJmt = this.precomputedLatencies.get(
|
|
580
|
+
'internal.click.to.interstitial.for.client.jmt'
|
|
581
|
+
);
|
|
582
|
+
const interstitialJoinToLocusJoinRequest = this.getDiffBetweenTimestamps(
|
|
583
|
+
'internal.client.interstitial-window.click.joinbutton',
|
|
584
|
+
'client.locus.join.request'
|
|
585
|
+
);
|
|
526
586
|
|
|
527
|
-
if (
|
|
528
|
-
|
|
587
|
+
if (
|
|
588
|
+
typeof clickToInterstitialForClientJmt === 'number' &&
|
|
589
|
+
typeof interstitialJoinToLocusJoinRequest === 'number'
|
|
590
|
+
) {
|
|
591
|
+
return clamp(
|
|
592
|
+
clickToInterstitialForClientJmt + interstitialJoinToLocusJoinRequest,
|
|
593
|
+
0,
|
|
594
|
+
this.MAX_INTEGER
|
|
595
|
+
);
|
|
529
596
|
}
|
|
530
597
|
|
|
531
598
|
return undefined;
|
|
@@ -190,6 +190,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
190
190
|
|
|
191
191
|
// if ConvergedArchitecture enable and isConvergedWebinarWebcast -- then webcast
|
|
192
192
|
if (meetingInfo?.enableConvergedArchitecture && meetingInfo?.enableEvent) {
|
|
193
|
+
// if enableConvergedWebinarLargeScale - then large scale webinar
|
|
194
|
+
if (meetingInfo?.enableConvergedWebinarLargeScale) {
|
|
195
|
+
return WEBEX_SUB_SERVICE_TYPES.LARGE_SCALE_WEBINAR;
|
|
196
|
+
}
|
|
197
|
+
|
|
193
198
|
return meetingInfo?.isConvergedWebinarWebcast
|
|
194
199
|
? WEBEX_SUB_SERVICE_TYPES.WEBCAST
|
|
195
200
|
: WEBEX_SUB_SERVICE_TYPES.WEBINAR;
|
|
@@ -284,7 +284,8 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
|
|
|
284
284
|
devicePairingType: webex.devicemanager.getPairedMethod(),
|
|
285
285
|
deviceURL: pairedDevice.url,
|
|
286
286
|
isPersonalDevice: pairedDevice.mode === 'personal',
|
|
287
|
-
productName:
|
|
287
|
+
productName:
|
|
288
|
+
pairedDevice.devices?.length > 0 ? pairedDevice.devices[0]?.productName : undefined,
|
|
288
289
|
};
|
|
289
290
|
item.eventPayload.event.pairingState = 'paired';
|
|
290
291
|
item.eventPayload.event.pairedDevice = devicePayload;
|
|
@@ -26,6 +26,7 @@ export const WEBEX_SUB_SERVICE_TYPES: Record<string, ClientSubServiceType> = {
|
|
|
26
26
|
SCHEDULED_MEETING: 'ScheduledMeeting',
|
|
27
27
|
WEBINAR: 'Webinar',
|
|
28
28
|
WEBCAST: 'Webcast',
|
|
29
|
+
LARGE_SCALE_WEBINAR: 'LargeScaleWebinar',
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
// Found in https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
|
package/src/metrics.types.ts
CHANGED
|
@@ -319,6 +319,7 @@ export type PreComputedLatencies =
|
|
|
319
319
|
| 'internal.get.cluster.time'
|
|
320
320
|
| 'internal.click.to.interstitial'
|
|
321
321
|
| 'internal.click.to.interstitial.with.user.delay'
|
|
322
|
+
| 'internal.click.to.interstitial.for.client.jmt'
|
|
322
323
|
| 'internal.refresh.captcha.time'
|
|
323
324
|
| 'internal.exchange.ci.token.time'
|
|
324
325
|
| 'internal.get.u2c.time'
|
|
@@ -346,6 +346,9 @@ describe('plugin-metrics', () => {
|
|
|
346
346
|
webex.internal.newMetrics.callDiagnosticLatencies.getStayLobbyTime = sinon
|
|
347
347
|
.stub()
|
|
348
348
|
.returns(1);
|
|
349
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getStayLobbyTimeCappedBy = sinon
|
|
350
|
+
.stub()
|
|
351
|
+
.returns(1);
|
|
349
352
|
webex.internal.newMetrics.callDiagnosticLatencies.getTotalMediaJMTWithUserDelay = sinon
|
|
350
353
|
.stub()
|
|
351
354
|
.returns(43);
|
|
@@ -366,9 +369,9 @@ describe('plugin-metrics', () => {
|
|
|
366
369
|
assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
|
|
367
370
|
name: 'client.media-engine.ready',
|
|
368
371
|
joinTimes: {
|
|
369
|
-
totalMediaJMT:
|
|
372
|
+
totalMediaJMT: 44,
|
|
370
373
|
interstitialToMediaOKJMT: 22,
|
|
371
|
-
callInitMediaEngineReady:
|
|
374
|
+
callInitMediaEngineReady: 22,
|
|
372
375
|
totalMediaJMTWithUserDelay: 43,
|
|
373
376
|
totalJMTWithUserDelay: 64,
|
|
374
377
|
},
|