Skip to content

Commit f6d5897

Browse files
authored
feat(internal-plugin-metrics): support new jmt values with delay (#4352)
1 parent d8e35ff commit f6d5897

File tree

10 files changed

+267
-9
lines changed

10 files changed

+267
-9
lines changed

packages/@webex/internal-plugin-metrics/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"dependencies": {
3838
"@webex/common": "workspace:*",
3939
"@webex/common-timers": "workspace:*",
40-
"@webex/event-dictionary-ts": "^1.0.1753",
40+
"@webex/event-dictionary-ts": "^1.0.1819",
4141
"@webex/internal-plugin-metrics": "workspace:*",
4242
"@webex/test-helper-chai": "workspace:*",
4343
"@webex/test-helper-mock-webex": "workspace:*",

packages/@webex/internal-plugin-metrics/src/call-diagnostic/call-diagnostic-metrics-latencies.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,30 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
336336
return undefined;
337337
}
338338

339+
/**
340+
* Click To Interstitial With User Delay
341+
* @returns - latency
342+
*/
343+
public getClickToInterstitialWithUserDelay() {
344+
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
345+
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
346+
return this.getDiffBetweenTimestamps(
347+
'internal.client.meeting.click.joinbutton',
348+
'internal.client.meeting.interstitial-window.showed'
349+
);
350+
}
351+
352+
const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(
353+
'internal.click.to.interstitial.with.user.delay'
354+
);
355+
356+
if (typeof clickToInterstitialWithUserDelayLatency === 'number') {
357+
return clickToInterstitialWithUserDelayLatency;
358+
}
359+
360+
return undefined;
361+
}
362+
339363
/**
340364
* Interstitial To Join Ok
341365
* @returns - latency
@@ -395,6 +419,24 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
395419
return undefined;
396420
}
397421

422+
/**
423+
* Total JMT With User Delay
424+
* @returns - latency
425+
*/
426+
public getTotalJMTWithUserDelay() {
427+
const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
428+
const interstitialToJoinOk = this.getInterstitialToJoinOK();
429+
430+
if (
431+
typeof clickToInterstitialWithUserDelay === 'number' &&
432+
typeof interstitialToJoinOk === 'number'
433+
) {
434+
return clickToInterstitialWithUserDelay + interstitialToJoinOk;
435+
}
436+
437+
return undefined;
438+
}
439+
398440
/**
399441
* Join Conf JMT
400442
* @returns - latency
@@ -432,6 +474,22 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
432474
return undefined;
433475
}
434476

477+
/**
478+
* Total Media JMT With User Delay
479+
* @returns - latency
480+
*/
481+
public getTotalMediaJMTWithUserDelay() {
482+
const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
483+
const interstitialToJoinOk = this.getInterstitialToJoinOK();
484+
const joinConfJMT = this.getJoinConfJMT();
485+
486+
if (clickToInterstitialWithUserDelay && interstitialToJoinOk && joinConfJMT) {
487+
return clickToInterstitialWithUserDelay + interstitialToJoinOk + joinConfJMT;
488+
}
489+
490+
return undefined;
491+
}
492+
435493
/**
436494
* Client JMT
437495
* @returns - latency

packages/@webex/internal-plugin-metrics/src/call-diagnostic/call-diagnostic-metrics.util.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
257257
switch (eventName) {
258258
case 'client.webexapp.launched':
259259
joinTimes.downloadTime = cdl.getDownloadTimeJMT();
260+
joinTimes.pageJmt = cdl.getPageJMT();
260261
break;
261262
case 'client.login.end':
262263
joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();
@@ -267,6 +268,7 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
267268
joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
268269
joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();
269270
joinTimes.downloadIntelligenceModelsReqResp = cdl.getDownloadIntelligenceModelsReqResp();
271+
joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();
270272
break;
271273

272274
case 'client.call.initiated':
@@ -287,6 +289,8 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
287289
joinTimes.totalJmt = cdl.getTotalJMT();
288290
joinTimes.clientJmt = cdl.getClientJMT();
289291
joinTimes.downloadTime = cdl.getDownloadTimeJMT();
292+
joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();
293+
joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();
290294
break;
291295

292296
case 'client.ice.end':
@@ -307,6 +311,8 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
307311
joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();
308312
joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();
309313
joinTimes.stayLobbyTime = cdl.getStayLobbyTime();
314+
joinTimes.totalMediaJMTWithUserDelay = cdl.getTotalMediaJMTWithUserDelay();
315+
joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();
310316
break;
311317

312318
case 'client.media.tx.start':

packages/@webex/internal-plugin-metrics/src/metrics.types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ export type PreComputedLatencies =
311311
| 'internal.download.time'
312312
| 'internal.get.cluster.time'
313313
| 'internal.click.to.interstitial'
314+
| 'internal.click.to.interstitial.with.user.delay'
314315
| 'internal.refresh.captcha.time'
315316
| 'internal.exchange.ci.token.time'
316317
| 'internal.get.u2c.time'

packages/@webex/internal-plugin-metrics/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ describe('plugin-metrics', () => {
108108
.returns(10);
109109
webex.internal.newMetrics.callDiagnosticLatencies.getDownloadIntelligenceModelsReqResp =
110110
sinon.stub().returns(42);
111+
webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitialWithUserDelay =
112+
sinon.stub().returns(12);
111113

112114
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
113115
//@ts-ignore
@@ -127,6 +129,7 @@ describe('plugin-metrics', () => {
127129
meetingInfoReqResp: 10,
128130
refreshCaptchaServiceReqResp: 10,
129131
downloadIntelligenceModelsReqResp: 42,
132+
clickToInterstitialWithUserDelay: 12,
130133
},
131134
});
132135
assert.lengthOf(
@@ -183,9 +186,15 @@ describe('plugin-metrics', () => {
183186
webex.internal.newMetrics.callDiagnosticLatencies.getCallInitJoinReq = sinon
184187
.stub()
185188
.returns(10);
186-
webex.internal.newMetrics.callDiagnosticLatencies.getDownloadTimeJMT = sinon
189+
webex.internal.newMetrics.callDiagnosticLatencies.getDownloadTimeJMT = sinon
187190
.stub()
188191
.returns(100);
192+
webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitialWithUserDelay = sinon
193+
.stub()
194+
.returns(43);
195+
webex.internal.newMetrics.callDiagnosticLatencies.getTotalJMTWithUserDelay = sinon
196+
.stub()
197+
.returns(64);
189198
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
190199
//@ts-ignore
191200
{event: {name: 'client.locus.join.response'}}
@@ -209,6 +218,8 @@ describe('plugin-metrics', () => {
209218
totalJmt: 20,
210219
clientJmt: 5,
211220
downloadTime: 100,
221+
clickToInterstitialWithUserDelay: 43,
222+
totalJMTWithUserDelay: 64,
212223
},
213224
});
214225
assert.lengthOf(
@@ -338,6 +349,12 @@ describe('plugin-metrics', () => {
338349
webex.internal.newMetrics.callDiagnosticLatencies.getStayLobbyTime = sinon
339350
.stub()
340351
.returns(1);
352+
webex.internal.newMetrics.callDiagnosticLatencies.getTotalMediaJMTWithUserDelay = sinon
353+
.stub()
354+
.returns(43);
355+
webex.internal.newMetrics.callDiagnosticLatencies.getTotalJMTWithUserDelay = sinon
356+
.stub()
357+
.returns(64);
341358
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
342359
//@ts-ignore
343360
{event: {name: 'client.media-engine.ready'}}
@@ -356,6 +373,8 @@ describe('plugin-metrics', () => {
356373
interstitialToMediaOKJMT: 22,
357374
callInitMediaEngineReady: 10,
358375
stayLobbyTime: 1,
376+
totalMediaJMTWithUserDelay: 43,
377+
totalJMTWithUserDelay: 64,
359378
},
360379
});
361380
assert.lengthOf(

packages/@webex/internal-plugin-metrics/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,36 @@ describe('internal-plugin-metrics', () => {
446446
assert.deepEqual(cdl.getClickToInterstitial(), 0);
447447
});
448448

449+
it('calculates getClickToInterstitialWithUserDelay correctly', () => {
450+
cdl.saveTimestamp({
451+
key: 'internal.client.meeting.click.joinbutton',
452+
value: 10,
453+
});
454+
cdl.saveTimestamp({
455+
key: 'internal.client.meeting.interstitial-window.showed',
456+
value: 20,
457+
});
458+
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 10);
459+
});
460+
461+
it('calculates getClickToInterstitialWithUserDelay without join button timestamp', () => {
462+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 5);
463+
cdl.saveTimestamp({
464+
key: 'internal.client.meeting.interstitial-window.showed',
465+
value: 20,
466+
});
467+
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 5);
468+
});
469+
470+
it('calculates getClickToInterstitialWithUserDelay without join button timestamp when it is 0', () => {
471+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
472+
cdl.saveTimestamp({
473+
key: 'internal.client.meeting.interstitial-window.showed',
474+
value: 20,
475+
});
476+
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 0);
477+
});
478+
449479
it('calculates getInterstitialToJoinOK correctly', () => {
450480
cdl.saveTimestamp({
451481
key: 'internal.client.interstitial-window.click.joinbutton',
@@ -554,6 +584,78 @@ describe('internal-plugin-metrics', () => {
554584
assert.deepEqual(cdl.getTotalJMT(), undefined);
555585
});
556586

587+
it('calculates getTotalJMTWithUserDelay correctly', () => {
588+
cdl.saveTimestamp({
589+
key: 'internal.client.interstitial-window.click.joinbutton',
590+
value: 5,
591+
});
592+
cdl.saveTimestamp({
593+
key: 'internal.client.meeting.click.joinbutton',
594+
value: 10,
595+
});
596+
cdl.saveTimestamp({
597+
key: 'internal.client.meeting.interstitial-window.showed',
598+
value: 20,
599+
});
600+
cdl.saveTimestamp({
601+
key: 'client.locus.join.response',
602+
value: 40,
603+
});
604+
assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 45);
605+
});
606+
607+
it('calculates getTotalJMTWithUserDelay correctly when clickToInterstitialWithUserDelay is 0', () => {
608+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
609+
cdl.saveTimestamp({
610+
key: 'internal.client.interstitial-window.click.joinbutton',
611+
value: 20,
612+
});
613+
cdl.saveTimestamp({
614+
key: 'client.locus.join.response',
615+
value: 40,
616+
});
617+
assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 20);
618+
});
619+
620+
it('calculates getTotalJMTWithUserDelay correctly when interstitialToJoinOk is 0', () => {
621+
cdl.saveTimestamp({
622+
key: 'internal.client.interstitial-window.click.joinbutton',
623+
value: 40,
624+
});
625+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 12);
626+
cdl.saveTimestamp({
627+
key: 'client.locus.join.response',
628+
value: 40,
629+
});
630+
assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 12);
631+
});
632+
633+
it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay and interstitialToJoinOk are 0', () => {
634+
cdl.saveTimestamp({
635+
key: 'internal.client.interstitial-window.click.joinbutton',
636+
value: 40,
637+
});
638+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
639+
cdl.saveTimestamp({
640+
key: 'client.locus.join.response',
641+
value: 40,
642+
});
643+
assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 0);
644+
});
645+
646+
it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay is not a number', () => {
647+
cdl.saveTimestamp({
648+
key: 'internal.client.interstitial-window.click.joinbutton',
649+
value: 40,
650+
});
651+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 'eleven' as unknown as number);
652+
cdl.saveTimestamp({
653+
key: 'client.locus.join.response',
654+
value: 40,
655+
});
656+
assert.deepEqual(cdl.getTotalJMTWithUserDelay(), undefined);
657+
});
658+
557659
it('calculates getTotalMediaJMT correctly', () => {
558660
cdl.saveTimestamp({
559661
key: 'internal.client.meeting.click.joinbutton',
@@ -627,6 +729,71 @@ describe('internal-plugin-metrics', () => {
627729
assert.deepEqual(cdl.getTotalMediaJMT(), 31);
628730
});
629731

732+
it('calculates getTotalMediaJMTWithUserDelay correctly', () => {
733+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 7);
734+
cdl.saveTimestamp({
735+
key: 'internal.client.interstitial-window.click.joinbutton',
736+
value: 10,
737+
});
738+
cdl.saveTimestamp({
739+
key: 'client.locus.join.request',
740+
value: 12,
741+
});
742+
cdl.saveTimestamp({
743+
key: 'client.locus.join.response',
744+
value: 20,
745+
});
746+
cdl.saveTimestamp({
747+
key: 'internal.host.meeting.participant.admitted',
748+
value: 24,
749+
});
750+
cdl.saveTimestamp({
751+
key: 'client.ice.start',
752+
value: 30,
753+
});
754+
cdl.saveTimestamp({
755+
key: 'client.ice.end',
756+
value: 40,
757+
});
758+
assert.deepEqual(cdl.getTotalMediaJMTWithUserDelay(), 35);
759+
});
760+
761+
it('calculates getTotalMediaJMTWithUserDelay correctly for guest join', () => {
762+
cdl.saveTimestamp({
763+
key: 'internal.client.meeting.click.joinbutton',
764+
value: 5,
765+
});
766+
cdl.saveTimestamp({
767+
key: 'internal.client.meeting.interstitial-window.showed',
768+
value: 8,
769+
});
770+
cdl.saveTimestamp({
771+
key: 'internal.client.interstitial-window.click.joinbutton',
772+
value: 10,
773+
});
774+
cdl.saveTimestamp({
775+
key: 'client.locus.join.request',
776+
value: 12,
777+
});
778+
cdl.saveTimestamp({
779+
key: 'client.locus.join.response',
780+
value: 20,
781+
});
782+
cdl.saveTimestamp({
783+
key: 'internal.host.meeting.participant.admitted',
784+
value: 24,
785+
});
786+
cdl.saveTimestamp({
787+
key: 'client.ice.start',
788+
value: 30,
789+
});
790+
cdl.saveTimestamp({
791+
key: 'client.ice.end',
792+
value: 40,
793+
});
794+
assert.deepEqual(cdl.getTotalMediaJMTWithUserDelay(), 31);
795+
});
796+
630797
it('calculates getJoinConfJMT correctly', () => {
631798
cdl.saveTimestamp({
632799
key: 'client.locus.join.request',

0 commit comments

Comments
 (0)