@webex/internal-plugin-metrics 3.0.0-next.4 → 3.0.0-next.6
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 +55 -13
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +34 -29
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +5 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/new-metrics.js +5 -4
- package/dist/new-metrics.js.map +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +25 -7
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +6 -9
- package/dist/types/index.d.ts +2 -2
- package/dist/types/metrics.types.d.ts +1 -1
- package/package.json +13 -13
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +53 -12
- package/src/call-diagnostic/call-diagnostic-metrics.ts +6 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +5 -1
- package/src/index.ts +2 -0
- package/src/metrics.types.ts +4 -1
- package/src/new-metrics.ts +2 -2
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +8 -4
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +156 -1
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +6 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +7 -1
- package/test/unit/spec/new-metrics.ts +29 -31
- package/test/unit/spec/prelogin-metrics-batcher.ts +1 -0
|
@@ -41,11 +41,41 @@ describe('internal-plugin-metrics', () => {
|
|
|
41
41
|
assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), now.getTime());
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
it('should save latency correctly', () => {
|
|
44
|
+
it('should save latency correctly by default and overwrites', () => {
|
|
45
45
|
assert.deepEqual(cdl.precomputedLatencies.size, 0);
|
|
46
46
|
cdl.saveLatency('internal.client.pageJMT', 10);
|
|
47
47
|
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
48
48
|
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
|
|
49
|
+
cdl.saveLatency('internal.client.pageJMT', 20);
|
|
50
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
51
|
+
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 20);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should overwrite latency when overwrite is true', () => {
|
|
55
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 0);
|
|
56
|
+
cdl.saveLatency('internal.client.pageJMT', 10, true);
|
|
57
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
58
|
+
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
|
|
59
|
+
cdl.saveLatency('internal.client.pageJMT', 20, true);
|
|
60
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
61
|
+
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 20);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should save latency correctly when overwrite is false', () => {
|
|
65
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 0);
|
|
66
|
+
cdl.saveLatency('internal.client.pageJMT', 10, false);
|
|
67
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
68
|
+
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should save latency correctly when overwrite is false and there is existing value', () => {
|
|
72
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 0);
|
|
73
|
+
cdl.saveLatency('internal.client.pageJMT', 10);
|
|
74
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
75
|
+
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
|
|
76
|
+
cdl.saveLatency('internal.client.pageJMT', 10, false);
|
|
77
|
+
assert.deepEqual(cdl.precomputedLatencies.size, 1);
|
|
78
|
+
assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 20);
|
|
49
79
|
});
|
|
50
80
|
|
|
51
81
|
it('should save only first timestamp correctly', () => {
|
|
@@ -111,6 +141,89 @@ describe('internal-plugin-metrics', () => {
|
|
|
111
141
|
assert.deepEqual(cdl.getMeetingInfoReqResp(), 10);
|
|
112
142
|
});
|
|
113
143
|
|
|
144
|
+
describe('measureLatency', () => {
|
|
145
|
+
let clock;
|
|
146
|
+
let saveLatencySpy;
|
|
147
|
+
|
|
148
|
+
beforeEach(() => {
|
|
149
|
+
clock = sinon.useFakeTimers();
|
|
150
|
+
|
|
151
|
+
saveLatencySpy = sinon.stub(cdl, 'saveLatency');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
afterEach(() => {
|
|
155
|
+
clock.restore();
|
|
156
|
+
sinon.restore();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('checks measureLatency with overwrite false', async () => {
|
|
160
|
+
const key = 'internal.client.pageJMT';
|
|
161
|
+
const overwrite = false;
|
|
162
|
+
const callbackStub = sinon.stub().callsFake(() => {
|
|
163
|
+
clock.tick(50);
|
|
164
|
+
return Promise.resolve('test');
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
const promise = cdl.measureLatency(callbackStub, 'internal.client.pageJMT', overwrite);
|
|
168
|
+
|
|
169
|
+
const resolvedValue = await promise;
|
|
170
|
+
assert.deepEqual(resolvedValue, 'test');
|
|
171
|
+
assert.calledOnceWithExactly(callbackStub);
|
|
172
|
+
assert.calledOnceWithExactly(saveLatencySpy, key, 50, overwrite)
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('checks measureLatency with overwrite true', async () => {
|
|
176
|
+
const key = 'internal.download.time';
|
|
177
|
+
const overwrite = true;
|
|
178
|
+
const callbackStub = sinon.stub().callsFake(() => {
|
|
179
|
+
clock.tick(20);
|
|
180
|
+
return Promise.resolve('test123');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const promise = cdl.measureLatency(callbackStub, 'internal.download.time', overwrite);
|
|
184
|
+
|
|
185
|
+
const resolvedValue = await promise;
|
|
186
|
+
assert.deepEqual(resolvedValue, 'test123');
|
|
187
|
+
assert.calledOnceWithExactly(callbackStub);
|
|
188
|
+
assert.calledOnceWithExactly(saveLatencySpy, key, 20, overwrite)
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('checks measureLatency when callBack rejects', async () => {
|
|
192
|
+
const key = 'internal.client.pageJMT';
|
|
193
|
+
const overwrite = true;
|
|
194
|
+
const error = new Error('some error');
|
|
195
|
+
const callbackStub = sinon.stub().callsFake(() => {
|
|
196
|
+
clock.tick(50);
|
|
197
|
+
return Promise.reject(error);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
const promise = cdl.measureLatency(callbackStub, 'internal.client.pageJMT', overwrite);
|
|
201
|
+
|
|
202
|
+
const rejectedValue = await assert.isRejected(promise);
|
|
203
|
+
assert.deepEqual(rejectedValue, error);
|
|
204
|
+
assert.calledOnceWithExactly(callbackStub);
|
|
205
|
+
assert.calledOnceWithExactly(saveLatencySpy, key, 50, overwrite)
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe('getRefreshCaptchaReqResp', () => {
|
|
210
|
+
it('returns undefined when no precomputed value available', () => {
|
|
211
|
+
assert.deepEqual(cdl.getRefreshCaptchaReqResp(), undefined);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('returns the correct value', () => {
|
|
215
|
+
cdl.saveLatency('internal.refresh.captcha.time', 123);
|
|
216
|
+
|
|
217
|
+
assert.deepEqual(cdl.getRefreshCaptchaReqResp(), 123);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it('returns the correct whole number', () => {
|
|
221
|
+
cdl.saveLatency('internal.refresh.captcha.time', 321.44);
|
|
222
|
+
|
|
223
|
+
assert.deepEqual(cdl.getRefreshCaptchaReqResp(), 321);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
114
227
|
describe('saveTimestamp', () => {
|
|
115
228
|
afterEach(() => {
|
|
116
229
|
sinon.restore();
|
|
@@ -512,9 +625,51 @@ describe('internal-plugin-metrics', () => {
|
|
|
512
625
|
assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
|
|
513
626
|
});
|
|
514
627
|
|
|
628
|
+
it('calculates getU2CTime correctly', () => {
|
|
629
|
+
it('returns undefined when no precomputed value available', () => {
|
|
630
|
+
assert.deepEqual(cdl.getU2CTime(), undefined);
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
it('returns the correct value', () => {
|
|
634
|
+
cdl.saveLatency('internal.get.u2c.time', 123);
|
|
635
|
+
|
|
636
|
+
assert.deepEqual(cdl.getU2CTime(), 123);
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
it('returns the correct whole number', () => {
|
|
640
|
+
cdl.saveLatency('internal.get.u2c.time', 321.44);
|
|
641
|
+
|
|
642
|
+
assert.deepEqual(cdl.getU2CTime(), 321);
|
|
643
|
+
});
|
|
644
|
+
});
|
|
645
|
+
|
|
515
646
|
it('calculates getDownloadTimeJMT correctly', () => {
|
|
516
647
|
cdl.saveLatency('internal.download.time', 1000);
|
|
517
648
|
assert.deepEqual(cdl.getDownloadTimeJMT(), 1000);
|
|
518
649
|
});
|
|
650
|
+
|
|
651
|
+
describe('getOtherAppApiReqResp', () => {
|
|
652
|
+
it('returns undefined when no precomputed value available', () => {
|
|
653
|
+
assert.deepEqual(cdl.getOtherAppApiReqResp(), undefined);
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
it('returns undefined if it is less than 0', () => {
|
|
657
|
+
cdl.saveLatency('internal.other.app.api.time', 0);
|
|
658
|
+
|
|
659
|
+
assert.deepEqual(cdl.getOtherAppApiReqResp(), undefined);
|
|
660
|
+
});
|
|
661
|
+
|
|
662
|
+
it('returns the correct value', () => {
|
|
663
|
+
cdl.saveLatency('internal.other.app.api.time', 123);
|
|
664
|
+
|
|
665
|
+
assert.deepEqual(cdl.getOtherAppApiReqResp(), 123);
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
it('returns the correct whole number', () => {
|
|
669
|
+
cdl.saveLatency('internal.other.app.api.time', 321.44);
|
|
670
|
+
|
|
671
|
+
assert.deepEqual(cdl.getOtherAppApiReqResp(), 321);
|
|
672
|
+
});
|
|
673
|
+
});
|
|
519
674
|
});
|
|
520
675
|
});
|
|
@@ -302,6 +302,11 @@ describe('internal-plugin-metrics', () => {
|
|
|
302
302
|
|
|
303
303
|
describe('#getIdentifiers', () => {
|
|
304
304
|
it('should build identifiers correctly', () => {
|
|
305
|
+
webex.internal.device = {
|
|
306
|
+
...webex.internal.device,
|
|
307
|
+
config: {installationId: 'installationId'},
|
|
308
|
+
};
|
|
309
|
+
|
|
305
310
|
const res = cd.getIdentifiers({
|
|
306
311
|
mediaConnections: [
|
|
307
312
|
{mediaAgentAlias: 'mediaAgentAlias', mediaAgentGroupId: 'mediaAgentGroupId'},
|
|
@@ -315,6 +320,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
315
320
|
locusId: 'url',
|
|
316
321
|
locusStartTime: 'lastActive',
|
|
317
322
|
locusUrl: 'locus/url',
|
|
323
|
+
machineId: 'installationId',
|
|
318
324
|
mediaAgentAlias: 'mediaAgentAlias',
|
|
319
325
|
mediaAgentGroupId: 'mediaAgentGroupId',
|
|
320
326
|
orgId: 'orgId',
|
|
@@ -301,6 +301,11 @@ describe('internal-plugin-metrics', () => {
|
|
|
301
301
|
|
|
302
302
|
[
|
|
303
303
|
['client.exit.app', {}],
|
|
304
|
+
['client.login.end', {
|
|
305
|
+
joinTimes: {
|
|
306
|
+
otherAppApiReqResp: undefined,
|
|
307
|
+
}
|
|
308
|
+
}],
|
|
304
309
|
['client.webexapp.launched', {
|
|
305
310
|
joinTimes: {
|
|
306
311
|
downloadTime: undefined,
|
|
@@ -312,6 +317,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
312
317
|
joinTimes: {
|
|
313
318
|
clickToInterstitial: undefined,
|
|
314
319
|
meetingInfoReqResp: undefined,
|
|
320
|
+
refreshCaptchaServiceReqResp: undefined,
|
|
315
321
|
},
|
|
316
322
|
},
|
|
317
323
|
],
|
|
@@ -322,6 +328,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
322
328
|
showInterstitialTime: undefined,
|
|
323
329
|
meetingInfoReqResp: undefined,
|
|
324
330
|
registerWDMDeviceJMT: undefined,
|
|
331
|
+
getU2CTime: undefined
|
|
325
332
|
},
|
|
326
333
|
},
|
|
327
334
|
],
|
|
@@ -332,7 +339,6 @@ describe('internal-plugin-metrics', () => {
|
|
|
332
339
|
meetingInfoReqResp: undefined,
|
|
333
340
|
callInitJoinReq: undefined,
|
|
334
341
|
joinReqResp: undefined,
|
|
335
|
-
joinReqSentReceived: undefined,
|
|
336
342
|
pageJmt: undefined,
|
|
337
343
|
clickToInterstitial: undefined,
|
|
338
344
|
interstitialToJoinOK: undefined,
|
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
import {assert} from '@webex/test-helper-chai';
|
|
2
|
-
import {NewMetrics} from '@webex/internal-plugin-metrics';
|
|
2
|
+
import {NewMetrics, CallDiagnosticLatencies} from '@webex/internal-plugin-metrics';
|
|
3
3
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
4
4
|
import sinon from 'sinon';
|
|
5
5
|
import {Utils} from '@webex/internal-plugin-metrics';
|
|
6
6
|
|
|
7
7
|
describe('internal-plugin-metrics', () => {
|
|
8
8
|
|
|
9
|
+
const mockWebex = () => new MockWebex({
|
|
10
|
+
children: {
|
|
11
|
+
newMetrics: NewMetrics,
|
|
12
|
+
},
|
|
13
|
+
meetings: {
|
|
14
|
+
meetingCollection: {
|
|
15
|
+
get: sinon.stub(),
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
request: sinon.stub().resolves({}),
|
|
19
|
+
logger: {
|
|
20
|
+
log: sinon.stub(),
|
|
21
|
+
error: sinon.stub(),
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
9
25
|
describe('check submitClientEvent when webex is not ready', () => {
|
|
10
26
|
let webex;
|
|
11
27
|
//@ts-ignore
|
|
12
|
-
webex =
|
|
13
|
-
children: {
|
|
14
|
-
newMetrics: NewMetrics,
|
|
15
|
-
},
|
|
16
|
-
meetings: {
|
|
17
|
-
meetingCollection: {
|
|
18
|
-
get: sinon.stub(),
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
request: sinon.stub().resolves({}),
|
|
22
|
-
logger: {
|
|
23
|
-
log: sinon.stub(),
|
|
24
|
-
error: sinon.stub(),
|
|
25
|
-
}
|
|
26
|
-
});
|
|
28
|
+
webex = mockWebex();
|
|
27
29
|
|
|
28
30
|
it('checks the log', () => {
|
|
29
31
|
webex.internal.newMetrics.submitClientEvent({
|
|
@@ -38,26 +40,22 @@ describe('internal-plugin-metrics', () => {
|
|
|
38
40
|
);
|
|
39
41
|
});
|
|
40
42
|
});
|
|
43
|
+
|
|
44
|
+
describe('new-metrics contstructor', () => {
|
|
45
|
+
it('checks callDiagnosticLatencies is defined before ready emit', () => {
|
|
46
|
+
|
|
47
|
+
const webex = mockWebex();
|
|
48
|
+
|
|
49
|
+
assert.instanceOf(webex.internal.newMetrics.callDiagnosticLatencies, CallDiagnosticLatencies);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
41
53
|
describe('new-metrics', () => {
|
|
42
54
|
let webex;
|
|
43
55
|
|
|
44
56
|
beforeEach(() => {
|
|
45
57
|
//@ts-ignore
|
|
46
|
-
webex =
|
|
47
|
-
children: {
|
|
48
|
-
newMetrics: NewMetrics,
|
|
49
|
-
},
|
|
50
|
-
meetings: {
|
|
51
|
-
meetingCollection: {
|
|
52
|
-
get: sinon.stub(),
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
request: sinon.stub().resolves({}),
|
|
56
|
-
logger: {
|
|
57
|
-
log: sinon.stub(),
|
|
58
|
-
error: sinon.stub(),
|
|
59
|
-
}
|
|
60
|
-
});
|
|
58
|
+
webex = mockWebex();
|
|
61
59
|
|
|
62
60
|
webex.emit('ready');
|
|
63
61
|
|