@webex/internal-plugin-metrics 2.60.0-next.8 → 2.60.1

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.
Files changed (68) hide show
  1. package/dist/batcher.js +3 -3
  2. package/dist/batcher.js.map +1 -1
  3. package/dist/call-diagnostic-events-batcher.js +60 -0
  4. package/dist/call-diagnostic-events-batcher.js.map +1 -0
  5. package/dist/client-metrics-batcher.js +3 -3
  6. package/dist/client-metrics-batcher.js.map +1 -1
  7. package/dist/config.js +9 -6
  8. package/dist/config.js.map +1 -1
  9. package/dist/index.js +2 -21
  10. package/dist/index.js.map +1 -1
  11. package/dist/metrics.js +22 -24
  12. package/dist/metrics.js.map +1 -1
  13. package/package.json +19 -24
  14. package/src/batcher.js +0 -1
  15. package/src/call-diagnostic-events-batcher.js +62 -0
  16. package/src/client-metrics-batcher.js +0 -1
  17. package/src/config.js +0 -1
  18. package/src/index.js +15 -0
  19. package/src/metrics.js +16 -17
  20. package/test/unit/spec/batcher.js +0 -2
  21. package/test/unit/spec/call-diagnostic-events-batcher.js +195 -0
  22. package/test/unit/spec/client-metrics-batcher.js +0 -2
  23. package/test/unit/spec/metrics.js +94 -65
  24. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +0 -67
  25. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +0 -1
  26. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +0 -454
  27. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +0 -1
  28. package/dist/call-diagnostic/call-diagnostic-metrics.js +0 -821
  29. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +0 -1
  30. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +0 -323
  31. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +0 -1
  32. package/dist/call-diagnostic/config.js +0 -593
  33. package/dist/call-diagnostic/config.js.map +0 -1
  34. package/dist/metrics.types.js +0 -7
  35. package/dist/metrics.types.js.map +0 -1
  36. package/dist/new-metrics.js +0 -336
  37. package/dist/new-metrics.js.map +0 -1
  38. package/dist/types/batcher.d.ts +0 -2
  39. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +0 -2
  40. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +0 -194
  41. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +0 -418
  42. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +0 -96
  43. package/dist/types/call-diagnostic/config.d.ts +0 -172
  44. package/dist/types/client-metrics-batcher.d.ts +0 -2
  45. package/dist/types/config.d.ts +0 -36
  46. package/dist/types/index.d.ts +0 -13
  47. package/dist/types/metrics.d.ts +0 -3
  48. package/dist/types/metrics.types.d.ts +0 -104
  49. package/dist/types/new-metrics.d.ts +0 -139
  50. package/dist/types/utils.d.ts +0 -6
  51. package/dist/utils.js +0 -26
  52. package/dist/utils.js.map +0 -1
  53. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +0 -75
  54. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +0 -419
  55. package/src/call-diagnostic/call-diagnostic-metrics.ts +0 -875
  56. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +0 -362
  57. package/src/call-diagnostic/config.ts +0 -666
  58. package/src/index.ts +0 -43
  59. package/src/metrics.types.ts +0 -160
  60. package/src/new-metrics.ts +0 -317
  61. package/src/utils.ts +0 -17
  62. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +0 -453
  63. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +0 -506
  64. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +0 -2078
  65. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +0 -565
  66. package/test/unit/spec/new-metrics.ts +0 -266
  67. package/test/unit/spec/utils.ts +0 -22
  68. package/tsconfig.json +0 -6
@@ -1,453 +0,0 @@
1
- /*!
2
- * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
- */
4
-
5
- import {assert} from '@webex/test-helper-chai';
6
- import {config, Utils} from '@webex/internal-plugin-metrics';
7
- import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
8
- import MockWebex from '@webex/test-helper-mock-webex';
9
- import sinon from 'sinon';
10
- import FakeTimers from '@sinonjs/fake-timers';
11
- import {NewMetrics} from '@webex/internal-plugin-metrics';
12
- import {uniqueId} from 'lodash';
13
-
14
- const flushPromises = () => new Promise(setImmediate);
15
-
16
- function promiseTick(count) {
17
- let promise = Promise.resolve();
18
-
19
- while (count > 1) {
20
- promise = promise.then(() => promiseTick(1));
21
- count -= 1;
22
- }
23
-
24
- return promise;
25
- }
26
-
27
- describe('plugin-metrics', () => {
28
- describe('CallDiagnosticEventsBatcher', () => {
29
- let webex;
30
- let clock;
31
- let now;
32
-
33
- beforeEach(() => {
34
- now = new Date();
35
- clock = FakeTimers.install({now});
36
-
37
- //@ts-ignore
38
- webex = new MockWebex({
39
- children: {
40
- newMetrics: NewMetrics,
41
- },
42
- });
43
-
44
- webex.request = (options) =>
45
- Promise.resolve({body: {items: []}, waitForServiceTimeout: 15, options});
46
- sinon.spy(webex, 'request');
47
-
48
- webex.emit('ready');
49
-
50
- webex.config.metrics = config.metrics;
51
- });
52
-
53
- afterEach(() => {
54
- sinon.restore();
55
- clock.uninstall();
56
- });
57
-
58
- describe('#request()', () => {
59
- describe('when the request completes successfully', () => {
60
- it('clears the queue', async () => {
61
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
62
- //@ts-ignore
63
- {event: {name: 'client.interstitial-window.launched'}}
64
- );
65
- await flushPromises();
66
- clock.tick(config.metrics.batcherWait);
67
-
68
- await promise;
69
-
70
- //@ts-ignore
71
- assert.calledOnce(webex.request);
72
- assert.lengthOf(
73
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
74
- 0
75
- );
76
- });
77
-
78
- it('doesnt include any joinTimes for other events', async () => {
79
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
80
- //@ts-ignore
81
- {event: {name: 'client.alert.displayed'}}
82
- );
83
- await flushPromises();
84
- clock.tick(config.metrics.batcherWait);
85
-
86
- await promise;
87
-
88
- //@ts-ignore
89
- assert.calledOnce(webex.request);
90
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
91
- name: 'client.alert.displayed',
92
- });
93
- assert.lengthOf(
94
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
95
- 0
96
- );
97
- });
98
-
99
- it('appends the correct join times to the request for client.interstitial-window.launched', async () => {
100
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
101
- .stub()
102
- .returns(10);
103
- webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon
104
- .stub()
105
- .returns(10);
106
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
107
- //@ts-ignore
108
- {event: {name: 'client.interstitial-window.launched'}}
109
- );
110
- await flushPromises();
111
- clock.tick(config.metrics.batcherWait);
112
-
113
- await promise;
114
-
115
- //@ts-ignore
116
- assert.calledOnce(webex.request);
117
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
118
- name: 'client.interstitial-window.launched',
119
- joinTimes: {
120
- clickToInterstitial: 10,
121
- meetingInfoReqResp: 10,
122
- },
123
- });
124
- assert.lengthOf(
125
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
126
- 0
127
- );
128
- });
129
-
130
- it('appends the correct join times to the request for client.call.initiated', async () => {
131
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
132
- .stub()
133
- .returns(10);
134
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
135
- //@ts-ignore
136
- {event: {name: 'client.call.initiated'}}
137
- );
138
- await flushPromises();
139
- clock.tick(config.metrics.batcherWait);
140
-
141
- await promise;
142
- //@ts-ignore
143
- assert.calledOnce(webex.request);
144
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
145
- name: 'client.call.initiated',
146
- joinTimes: {
147
- meetingInfoReqResp: 10,
148
- showInterstitialTime: 10,
149
- },
150
- });
151
- assert.lengthOf(
152
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
153
- 0
154
- );
155
- });
156
-
157
- it('appends the correct join times to the request for client.locus.join.response', async () => {
158
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
159
- .stub()
160
- .returns(10);
161
- webex.internal.newMetrics.callDiagnosticLatencies.getJoinRespSentReceived = sinon
162
- .stub()
163
- .returns(20);
164
- webex.internal.newMetrics.callDiagnosticLatencies.getPageJMT = sinon.stub().returns(30);
165
- webex.internal.newMetrics.callDiagnosticLatencies.getClientJMT = sinon.stub().returns(5);
166
- webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon
167
- .stub()
168
- .returns(10);
169
- webex.internal.newMetrics.callDiagnosticLatencies.getCallInitJoinReq = sinon
170
- .stub()
171
- .returns(10);
172
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
173
- //@ts-ignore
174
- {event: {name: 'client.locus.join.response'}}
175
- );
176
- await flushPromises();
177
- clock.tick(config.metrics.batcherWait);
178
-
179
- await promise;
180
-
181
- //@ts-ignore
182
- assert.calledOnce(webex.request);
183
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
184
- name: 'client.locus.join.response',
185
- joinTimes: {
186
- callInitJoinReq: 10,
187
- clickToInterstitial: 10,
188
- interstitialToJoinOK: 10,
189
- joinReqResp: 10,
190
- joinReqSentReceived: 20,
191
- meetingInfoReqResp: 10,
192
- pageJmt: 30,
193
- totalJmt: 20,
194
- clientJmt: 5,
195
- },
196
- });
197
- assert.lengthOf(
198
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
199
- 0
200
- );
201
- });
202
-
203
- it('appends the correct join times to the request for client.ice.end', async () => {
204
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
205
- .stub()
206
- .returns(10);
207
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
208
- //@ts-ignore
209
- {event: {name: 'client.ice.end'}}
210
- );
211
- await flushPromises();
212
- clock.tick(config.metrics.batcherWait);
213
-
214
- await promise;
215
-
216
- //@ts-ignore
217
- assert.calledOnce(webex.request);
218
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
219
- name: 'client.ice.end',
220
- joinTimes: {
221
- ICESetupTime: 10,
222
- audioICESetupTime: 10,
223
- shareICESetupTime: 10,
224
- videoICESetupTime: 10,
225
- },
226
- });
227
- assert.lengthOf(
228
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
229
- 0
230
- );
231
- });
232
-
233
- it('appends the correct join times to the request for client.media.rx.start', async () => {
234
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
235
- .stub()
236
- .returns(10);
237
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
238
- //@ts-ignore
239
- {event: {name: 'client.media.rx.start'}}
240
- );
241
- await flushPromises();
242
- clock.tick(config.metrics.batcherWait);
243
-
244
- await promise;
245
-
246
- //@ts-ignore
247
- assert.calledOnce(webex.request);
248
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
249
- name: 'client.media.rx.start',
250
- joinTimes: {
251
- localSDPGenRemoteSDPRecv: 10,
252
- },
253
- });
254
- assert.lengthOf(
255
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
256
- 0
257
- );
258
- });
259
-
260
- it('appends the correct join times to the request for client.media-engine.ready', async () => {
261
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
262
- .stub()
263
- .returns(10);
264
- webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToMediaOKJMT = sinon
265
- .stub()
266
- .returns(10);
267
- webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon
268
- .stub()
269
- .returns(10);
270
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
271
- //@ts-ignore
272
- {event: {name: 'client.media-engine.ready'}}
273
- );
274
- await flushPromises();
275
- clock.tick(config.metrics.batcherWait);
276
-
277
- await promise;
278
-
279
- //@ts-ignore
280
- assert.calledOnce(webex.request);
281
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
282
- name: 'client.media-engine.ready',
283
- joinTimes: {
284
- totalMediaJMT: 30,
285
- interstitialToMediaOKJMT: 10,
286
- callInitMediaEngineReady: 10,
287
- stayLobbyTime: 10,
288
- },
289
- });
290
- assert.lengthOf(
291
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
292
- 0
293
- );
294
- });
295
-
296
- it('appends the correct audio and video setup delays to the request for client.mediaquality.event', async () => {
297
- webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
298
- .stub()
299
- .returns(10);
300
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
301
- //@ts-ignore
302
- {event: {name: 'client.mediaquality.event'}}
303
- );
304
- await flushPromises();
305
- clock.tick(config.metrics.batcherWait);
306
-
307
- await promise;
308
-
309
- //@ts-ignore
310
- assert.calledOnce(webex.request);
311
- assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
312
- name: 'client.mediaquality.event',
313
- audioSetupDelay: {
314
- joinRespRxStart: 10,
315
- joinRespTxStart: 10,
316
- },
317
- videoSetupDelay: {
318
- joinRespRxStart: 10,
319
- joinRespTxStart: 10,
320
- },
321
- });
322
- assert.lengthOf(
323
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
324
- 0
325
- );
326
- });
327
-
328
- it('doesnt include audioSetup and videoSetup delays for other events', async () => {
329
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
330
- //@ts-ignore
331
- {event: {name: 'client.alert.displayed'}}
332
- );
333
- await flushPromises();
334
- clock.tick(config.metrics.batcherWait);
335
-
336
- await promise;
337
-
338
- //@ts-ignore
339
- assert.calledOnce(webex.request);
340
- assert.deepEqual(
341
- webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event.audioSetupDelay,
342
- undefined
343
- );
344
- assert.deepEqual(
345
- webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event.videoSetupDelay,
346
- undefined
347
- );
348
- assert.lengthOf(
349
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
350
- 0
351
- );
352
- });
353
- });
354
-
355
- //TODO: The following two skipped tests needs investigation: https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-485382
356
- describe('when the request fails', () => {
357
- it.skip('does not clear the queue', async () => {
358
- // avoid setting .sent timestamp
359
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.prepareRequest =
360
- (q) => Promise.resolve(q);
361
-
362
- const err = new Error('error');
363
- webex.request = sinon.stub().returns(Promise.reject(err));
364
-
365
- webex.logger.error = sinon.stub();
366
- webex.logger.log = sinon.stub();
367
- sinon.stub(Utils, 'generateCommonErrorMetadata').returns('formattedError');
368
-
369
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics({
370
- event: 'my.event',
371
- });
372
-
373
- await flushPromises();
374
- clock.tick(config.metrics.batcherWait);
375
-
376
- let error;
377
-
378
- // catch the expected error and store it
379
- await promise.catch((e) => {
380
- error = e;
381
- });
382
-
383
- // This is horrific, but stubbing lodash is proving difficult
384
- const expectedBatchId = parseInt(uniqueId()) - 1;
385
-
386
- // check that promise was rejected with the original error of the webex.request
387
- assert.deepEqual(err, error);
388
-
389
- assert.calledOnceWithExactly(
390
- webex.logger.error,
391
- 'call-diagnostic-events -> ',
392
- `CallDiagnosticEventsBatcher: @submitHttpRequest#ca-batch-${expectedBatchId}. Request failed:`,
393
- `error: formattedError`
394
- );
395
- assert.lengthOf(
396
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
397
- 0
398
- );
399
- });
400
- });
401
- });
402
-
403
- describe('prepareItem', () => {
404
- it.skip('calls prepareDiagnosticMetricItem correctly', async () => {
405
- // avoid setting .sent timestamp
406
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.prepareRequest =
407
- (q) => Promise.resolve(q);
408
-
409
- const prepareItemSpy = sinon.spy(
410
- webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher,
411
- 'prepareItem'
412
- );
413
- const prepareDiagnosticMetricItemSpy = sinon.spy(
414
- CallDiagnosticUtils,
415
- 'prepareDiagnosticMetricItem'
416
- );
417
-
418
- const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics({
419
- event: 'my.event',
420
- });
421
-
422
- await flushPromises();
423
-
424
- clock.tick(config.metrics.batcherWait);
425
-
426
- await promise;
427
-
428
- const calls = prepareItemSpy.getCalls()[0];
429
-
430
- // item also gets assigned a delay property but the key is a Symbol and haven't been able to test that..
431
- assert.deepEqual(calls.args[0].eventPayload, {
432
- event: 'my.event',
433
- origin: {buildType: 'test', networkType: 'unknown'},
434
- });
435
-
436
- assert.deepEqual(calls.args[0].type, ['diagnostic-event']);
437
-
438
- const prepareDiagnosticMetricItemCalls = prepareDiagnosticMetricItemSpy.getCalls();
439
-
440
- // second argument (item) also gets assigned a delay property but the key is a Symbol and haven't been able to test that..
441
- assert.deepEqual(prepareDiagnosticMetricItemCalls[0].args[0], webex);
442
- assert.deepEqual(prepareDiagnosticMetricItemCalls[0].args[1].eventPayload, {
443
- event: 'my.event',
444
- origin: {
445
- buildType: 'test',
446
- networkType: 'unknown',
447
- },
448
- });
449
- assert.deepEqual(prepareDiagnosticMetricItemCalls[0].args[1].type, ['diagnostic-event']);
450
- });
451
- });
452
- });
453
- });