@webex/internal-plugin-metrics 3.3.1-next.1 → 3.3.1-next.11
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/behavioral/behavioral-metrics.js +199 -0
- package/dist/behavioral/behavioral-metrics.js.map +1 -0
- package/dist/behavioral/config.js +11 -0
- package/dist/behavioral/config.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +13 -8
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
- package/dist/call-diagnostic/config.js +19 -13
- package/dist/call-diagnostic/config.js.map +1 -1
- package/dist/index.js +7 -0
- 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 +31 -6
- package/dist/new-metrics.js.map +1 -1
- package/dist/types/behavioral/behavioral-metrics.d.ts +63 -0
- package/dist/types/behavioral/config.d.ts +1 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +3 -2
- package/dist/types/call-diagnostic/config.d.ts +2 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/metrics.types.d.ts +28 -7
- package/dist/types/new-metrics.d.ts +14 -6
- package/package.json +11 -11
- package/src/behavioral/behavioral-metrics.ts +179 -0
- package/src/behavioral/config.ts +3 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +15 -15
- package/src/call-diagnostic/config.ts +9 -2
- package/src/index.ts +2 -0
- package/src/metrics.types.ts +59 -8
- package/src/new-metrics.ts +34 -8
- package/test/unit/spec/behavioral/behavioral-metrics.ts +164 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +48 -52
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1 -1
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +23 -12
- package/test/unit/spec/prelogin-metrics-batcher.ts +1 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import sinon from 'sinon';
|
|
2
|
+
import {assert} from '@webex/test-helper-chai';
|
|
3
|
+
import {BrowserDetection} from '@webex/common';
|
|
4
|
+
import {BehavioralMetrics, config, getOSNameInternal} from '@webex/internal-plugin-metrics';
|
|
5
|
+
import uuid from 'uuid';
|
|
6
|
+
import {merge} from 'lodash';
|
|
7
|
+
|
|
8
|
+
//@ts-ignore
|
|
9
|
+
global.window = {location: {hostname: 'whatever'}, navigator: {language: 'language'}};
|
|
10
|
+
process.env.NODE_ENV = 'test';
|
|
11
|
+
|
|
12
|
+
const {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
|
|
13
|
+
|
|
14
|
+
describe('internal-plugin-metrics', () => {
|
|
15
|
+
describe('BehavioralMetrics', () => {
|
|
16
|
+
let webex;
|
|
17
|
+
let now;
|
|
18
|
+
let behavioralMetrics: BehavioralMetrics;
|
|
19
|
+
|
|
20
|
+
const tags = {key: 'val'};
|
|
21
|
+
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
now = new Date();
|
|
24
|
+
|
|
25
|
+
webex = {
|
|
26
|
+
canAuthorize: true,
|
|
27
|
+
version: 'webex-version',
|
|
28
|
+
internal: {
|
|
29
|
+
services: {
|
|
30
|
+
get: () => 'locus-url',
|
|
31
|
+
},
|
|
32
|
+
metrics: {
|
|
33
|
+
submitClientMetrics: sinon.stub(),
|
|
34
|
+
config: {...config.metrics},
|
|
35
|
+
},
|
|
36
|
+
newMetrics: {},
|
|
37
|
+
device: {
|
|
38
|
+
userId: 'userId',
|
|
39
|
+
url: 'https://wdm-intb.ciscospark.com/wdm/api/v1/devices/deviceId',
|
|
40
|
+
orgId: 'orgId',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
meetings: {
|
|
44
|
+
config: {
|
|
45
|
+
metrics: {
|
|
46
|
+
clientType: 'TEAMS_CLIENT',
|
|
47
|
+
subClientType: 'WEB_APP',
|
|
48
|
+
clientName: 'Cantina',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
geoHintInfo: {
|
|
52
|
+
clientAddress: '1.3.4.5',
|
|
53
|
+
countryCode: 'UK',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
credentials: {
|
|
57
|
+
isUnverifiedGuest: false,
|
|
58
|
+
},
|
|
59
|
+
prepareFetchOptions: sinon.stub().callsFake((opts: any) => ({...opts, foo: 'bar'})),
|
|
60
|
+
request: sinon.stub().resolves({body: {}}),
|
|
61
|
+
logger: {
|
|
62
|
+
log: sinon.stub(),
|
|
63
|
+
error: sinon.stub(),
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
sinon.createSandbox();
|
|
68
|
+
sinon.useFakeTimers(now.getTime());
|
|
69
|
+
behavioralMetrics = new BehavioralMetrics({}, {parent: webex});
|
|
70
|
+
sinon.stub(uuid, 'v4').returns('my-fake-id');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
afterEach(() => {
|
|
74
|
+
sinon.restore();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('#getContext', () => {
|
|
78
|
+
it('should build context correctly', () => {
|
|
79
|
+
const res = behavioralMetrics.getContext();
|
|
80
|
+
|
|
81
|
+
assert.deepEqual(res, {
|
|
82
|
+
app: {
|
|
83
|
+
version: 'webex-version',
|
|
84
|
+
},
|
|
85
|
+
device: {
|
|
86
|
+
id: 'deviceId',
|
|
87
|
+
},
|
|
88
|
+
locale: 'language',
|
|
89
|
+
os: {
|
|
90
|
+
name: getOSNameInternal(),
|
|
91
|
+
version: getOSVersion(),
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe('#getDefaultTags', () => {
|
|
98
|
+
it('should build tags correctly', () => {
|
|
99
|
+
const res = behavioralMetrics.getDefaultTags();
|
|
100
|
+
|
|
101
|
+
assert.deepEqual(res, {
|
|
102
|
+
browser: getBrowserName(),
|
|
103
|
+
browserHeight: window.innerHeight,
|
|
104
|
+
browserVersion: getBrowserVersion(),
|
|
105
|
+
browserWidth: window.innerWidth,
|
|
106
|
+
domain: window.location.hostname,
|
|
107
|
+
inIframe: false,
|
|
108
|
+
locale: window.navigator.language,
|
|
109
|
+
os: getOSNameInternal(),
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe('#isReadyToSubmitBehavioralEvents', () => {
|
|
115
|
+
it('should return true when we have a deviceId, false when deviceId is empty or undefined', async () => {
|
|
116
|
+
assert.equal(true, behavioralMetrics.isReadyToSubmitBehavioralEvents());
|
|
117
|
+
|
|
118
|
+
webex.internal.device.url = "";
|
|
119
|
+
assert.equal(false, behavioralMetrics.isReadyToSubmitBehavioralEvents());
|
|
120
|
+
|
|
121
|
+
delete webex.internal.device.url;
|
|
122
|
+
assert.equal(false, behavioralMetrics.isReadyToSubmitBehavioralEvents());
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('#createEventObject', () => {
|
|
127
|
+
it('should build event object correctly', async () => {
|
|
128
|
+
const res = behavioralMetrics.createEventObject({
|
|
129
|
+
product: 'webex',
|
|
130
|
+
agent: 'user',
|
|
131
|
+
target: 'target',
|
|
132
|
+
verb: 'create',
|
|
133
|
+
payload: tags,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
assert.deepEqual(res, {
|
|
137
|
+
context: {
|
|
138
|
+
app: {
|
|
139
|
+
version: 'webex-version',
|
|
140
|
+
},
|
|
141
|
+
device: {
|
|
142
|
+
id: 'deviceId',
|
|
143
|
+
},
|
|
144
|
+
locale: 'language',
|
|
145
|
+
os: {
|
|
146
|
+
name: getOSNameInternal(),
|
|
147
|
+
version: getOSVersion(),
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
metricName: 'webex.user.target.create',
|
|
151
|
+
tags: merge(tags, {
|
|
152
|
+
browser: getBrowserName(),
|
|
153
|
+
browserVersion: getBrowserVersion(),
|
|
154
|
+
domain: window.location.hostname,
|
|
155
|
+
locale: window.navigator.language,
|
|
156
|
+
os: getOSNameInternal(),
|
|
157
|
+
}),
|
|
158
|
+
timestamp: res.timestamp,
|
|
159
|
+
type: ['behavioral'],
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -248,9 +248,15 @@ describe('plugin-metrics', () => {
|
|
|
248
248
|
});
|
|
249
249
|
|
|
250
250
|
it('appends the correct join times to the request for client.media.rx.start', async () => {
|
|
251
|
-
webex.internal.newMetrics.callDiagnosticLatencies.
|
|
251
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getLocalSDPGenRemoteSDPRecv = sinon
|
|
252
|
+
.stub()
|
|
253
|
+
.returns(5);
|
|
254
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getAudioJoinRespRxStart = sinon
|
|
252
255
|
.stub()
|
|
253
256
|
.returns(10);
|
|
257
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getVideoJoinRespRxStart = sinon
|
|
258
|
+
.stub()
|
|
259
|
+
.returns(20);
|
|
254
260
|
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
|
|
255
261
|
//@ts-ignore
|
|
256
262
|
{event: {name: 'client.media.rx.start'}}
|
|
@@ -265,7 +271,13 @@ describe('plugin-metrics', () => {
|
|
|
265
271
|
assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
|
|
266
272
|
name: 'client.media.rx.start',
|
|
267
273
|
joinTimes: {
|
|
268
|
-
localSDPGenRemoteSDPRecv:
|
|
274
|
+
localSDPGenRemoteSDPRecv: 5,
|
|
275
|
+
},
|
|
276
|
+
audioSetupDelay: {
|
|
277
|
+
joinRespRxStart: 10,
|
|
278
|
+
},
|
|
279
|
+
videoSetupDelay: {
|
|
280
|
+
joinRespRxStart: 20,
|
|
269
281
|
},
|
|
270
282
|
});
|
|
271
283
|
assert.lengthOf(
|
|
@@ -274,19 +286,16 @@ describe('plugin-metrics', () => {
|
|
|
274
286
|
);
|
|
275
287
|
});
|
|
276
288
|
|
|
277
|
-
it('appends the correct join times to the request for client.media
|
|
278
|
-
webex.internal.newMetrics.callDiagnosticLatencies.
|
|
279
|
-
.stub()
|
|
280
|
-
.returns(10);
|
|
281
|
-
webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToMediaOKJMT = sinon
|
|
289
|
+
it('appends the correct join times to the request for client.media.tx.start', async () => {
|
|
290
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getAudioJoinRespTxStart = sinon
|
|
282
291
|
.stub()
|
|
283
292
|
.returns(10);
|
|
284
|
-
webex.internal.newMetrics.callDiagnosticLatencies.
|
|
293
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getVideoJoinRespTxStart = sinon
|
|
285
294
|
.stub()
|
|
286
|
-
.returns(
|
|
295
|
+
.returns(20);
|
|
287
296
|
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
|
|
288
297
|
//@ts-ignore
|
|
289
|
-
{event: {name: 'client.media
|
|
298
|
+
{event: {name: 'client.media.tx.start'}}
|
|
290
299
|
);
|
|
291
300
|
await flushPromises();
|
|
292
301
|
clock.tick(config.metrics.batcherWait);
|
|
@@ -296,12 +305,12 @@ describe('plugin-metrics', () => {
|
|
|
296
305
|
//@ts-ignore
|
|
297
306
|
assert.calledOnce(webex.request);
|
|
298
307
|
assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
|
|
299
|
-
name: 'client.media
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
308
|
+
name: 'client.media.tx.start',
|
|
309
|
+
audioSetupDelay: {
|
|
310
|
+
joinRespTxStart: 10,
|
|
311
|
+
},
|
|
312
|
+
videoSetupDelay: {
|
|
313
|
+
joinRespTxStart: 20,
|
|
305
314
|
},
|
|
306
315
|
});
|
|
307
316
|
assert.lengthOf(
|
|
@@ -310,13 +319,28 @@ describe('plugin-metrics', () => {
|
|
|
310
319
|
);
|
|
311
320
|
});
|
|
312
321
|
|
|
313
|
-
it('appends the correct
|
|
322
|
+
it('appends the correct join times to the request for client.media-engine.ready', async () => {
|
|
314
323
|
webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon
|
|
315
324
|
.stub()
|
|
316
325
|
.returns(10);
|
|
326
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToMediaOKJMT = sinon
|
|
327
|
+
.stub()
|
|
328
|
+
.returns(22);
|
|
329
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon
|
|
330
|
+
.stub()
|
|
331
|
+
.returns(35);
|
|
332
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToJoinOK = sinon
|
|
333
|
+
.stub()
|
|
334
|
+
.returns(5);
|
|
335
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToJoinOK = sinon
|
|
336
|
+
.stub()
|
|
337
|
+
.returns(7);
|
|
338
|
+
webex.internal.newMetrics.callDiagnosticLatencies.getStayLobbyTime = sinon
|
|
339
|
+
.stub()
|
|
340
|
+
.returns(1);
|
|
317
341
|
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
|
|
318
342
|
//@ts-ignore
|
|
319
|
-
{event: {name: 'client.
|
|
343
|
+
{event: {name: 'client.media-engine.ready'}}
|
|
320
344
|
);
|
|
321
345
|
await flushPromises();
|
|
322
346
|
clock.tick(config.metrics.batcherWait);
|
|
@@ -326,14 +350,12 @@ describe('plugin-metrics', () => {
|
|
|
326
350
|
//@ts-ignore
|
|
327
351
|
assert.calledOnce(webex.request);
|
|
328
352
|
assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
|
|
329
|
-
name: 'client.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
joinRespRxStart: 10,
|
|
336
|
-
joinRespTxStart: 10,
|
|
353
|
+
name: 'client.media-engine.ready',
|
|
354
|
+
joinTimes: {
|
|
355
|
+
totalMediaJMT: 61,
|
|
356
|
+
interstitialToMediaOKJMT: 22,
|
|
357
|
+
callInitMediaEngineReady: 10,
|
|
358
|
+
stayLobbyTime: 1,
|
|
337
359
|
},
|
|
338
360
|
});
|
|
339
361
|
assert.lengthOf(
|
|
@@ -341,32 +363,6 @@ describe('plugin-metrics', () => {
|
|
|
341
363
|
0
|
|
342
364
|
);
|
|
343
365
|
});
|
|
344
|
-
|
|
345
|
-
it('doesnt include audioSetup and videoSetup delays for other events', async () => {
|
|
346
|
-
const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
|
|
347
|
-
//@ts-ignore
|
|
348
|
-
{event: {name: 'client.alert.displayed'}}
|
|
349
|
-
);
|
|
350
|
-
await flushPromises();
|
|
351
|
-
clock.tick(config.metrics.batcherWait);
|
|
352
|
-
|
|
353
|
-
await promise;
|
|
354
|
-
|
|
355
|
-
//@ts-ignore
|
|
356
|
-
assert.calledOnce(webex.request);
|
|
357
|
-
assert.deepEqual(
|
|
358
|
-
webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event.audioSetupDelay,
|
|
359
|
-
undefined
|
|
360
|
-
);
|
|
361
|
-
assert.deepEqual(
|
|
362
|
-
webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event.videoSetupDelay,
|
|
363
|
-
undefined
|
|
364
|
-
);
|
|
365
|
-
assert.lengthOf(
|
|
366
|
-
webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue,
|
|
367
|
-
0
|
|
368
|
-
);
|
|
369
|
-
});
|
|
370
366
|
});
|
|
371
367
|
|
|
372
368
|
describe('when the request fails', () => {
|
|
@@ -668,7 +668,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
668
668
|
assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
|
|
669
669
|
});
|
|
670
670
|
|
|
671
|
-
|
|
671
|
+
describe('calculates getU2CTime correctly', () => {
|
|
672
672
|
it('returns undefined when no precomputed value available', () => {
|
|
673
673
|
assert.deepEqual(cdl.getU2CTime(), undefined);
|
|
674
674
|
});
|
|
@@ -7,6 +7,7 @@ import CallDiagnosticLatencies from '../../../../src/call-diagnostic/call-diagno
|
|
|
7
7
|
import {
|
|
8
8
|
DTLS_HANDSHAKE_FAILED_CLIENT_CODE,
|
|
9
9
|
ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE,
|
|
10
|
+
ICE_AND_REACHABILITY_FAILED_CLIENT_CODE,
|
|
10
11
|
ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,
|
|
11
12
|
MISSING_ROAP_ANSWER_CLIENT_CODE,
|
|
12
13
|
} from '../../../../src/call-diagnostic/config';
|
|
@@ -374,6 +375,12 @@ describe('internal-plugin-metrics', () => {
|
|
|
374
375
|
joinTimes: {
|
|
375
376
|
localSDPGenRemoteSDPRecv: undefined,
|
|
376
377
|
},
|
|
378
|
+
audioSetupDelay: {
|
|
379
|
+
joinRespRxStart: undefined,
|
|
380
|
+
},
|
|
381
|
+
videoSetupDelay: {
|
|
382
|
+
joinRespRxStart: undefined,
|
|
383
|
+
},
|
|
377
384
|
},
|
|
378
385
|
],
|
|
379
386
|
[
|
|
@@ -388,14 +395,12 @@ describe('internal-plugin-metrics', () => {
|
|
|
388
395
|
},
|
|
389
396
|
],
|
|
390
397
|
[
|
|
391
|
-
'client.
|
|
398
|
+
'client.media.tx.start',
|
|
392
399
|
{
|
|
393
400
|
audioSetupDelay: {
|
|
394
|
-
joinRespRxStart: undefined,
|
|
395
401
|
joinRespTxStart: undefined,
|
|
396
402
|
},
|
|
397
403
|
videoSetupDelay: {
|
|
398
|
-
joinRespRxStart: undefined,
|
|
399
404
|
joinRespTxStart: undefined,
|
|
400
405
|
},
|
|
401
406
|
},
|
|
@@ -613,41 +618,47 @@ describe('internal-plugin-metrics', () => {
|
|
|
613
618
|
[
|
|
614
619
|
{
|
|
615
620
|
signalingState: 'have-local-offer',
|
|
616
|
-
|
|
621
|
+
iceConnected: false,
|
|
617
622
|
turnServerUsed: true,
|
|
618
623
|
errorCode: MISSING_ROAP_ANSWER_CLIENT_CODE,
|
|
624
|
+
unreachable: false,
|
|
619
625
|
},
|
|
620
626
|
{
|
|
621
627
|
signalingState: 'stable',
|
|
622
|
-
|
|
628
|
+
iceConnected: true,
|
|
623
629
|
turnServerUsed: true,
|
|
624
630
|
errorCode: DTLS_HANDSHAKE_FAILED_CLIENT_CODE,
|
|
631
|
+
unreachable: false,
|
|
625
632
|
},
|
|
626
633
|
{
|
|
627
634
|
signalingState: 'stable',
|
|
628
|
-
|
|
635
|
+
iceConnected: false,
|
|
629
636
|
turnServerUsed: true,
|
|
630
|
-
errorCode:
|
|
637
|
+
errorCode: ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,
|
|
638
|
+
unreachable: false,
|
|
631
639
|
},
|
|
632
640
|
{
|
|
633
641
|
signalingState: 'stable',
|
|
634
|
-
|
|
642
|
+
iceConnected: false,
|
|
635
643
|
turnServerUsed: true,
|
|
636
|
-
errorCode:
|
|
644
|
+
errorCode: ICE_AND_REACHABILITY_FAILED_CLIENT_CODE,
|
|
645
|
+
unreachable: true,
|
|
637
646
|
},
|
|
638
647
|
{
|
|
639
648
|
signalingState: 'stable',
|
|
640
|
-
|
|
649
|
+
iceConnected: false,
|
|
641
650
|
turnServerUsed: false,
|
|
642
651
|
errorCode: ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE,
|
|
652
|
+
unreachable: false,
|
|
643
653
|
},
|
|
644
|
-
].forEach(({signalingState,
|
|
654
|
+
].forEach(({signalingState, iceConnected, turnServerUsed, errorCode, unreachable}: any) => {
|
|
645
655
|
it('returns expected result', () => {
|
|
646
656
|
assert.deepEqual(
|
|
647
657
|
generateClientErrorCodeForIceFailure({
|
|
648
658
|
signalingState,
|
|
649
|
-
|
|
659
|
+
iceConnected,
|
|
650
660
|
turnServerUsed,
|
|
661
|
+
unreachable,
|
|
651
662
|
}),
|
|
652
663
|
errorCode
|
|
653
664
|
);
|
|
@@ -9,7 +9,6 @@ import MockWebex from '@webex/test-helper-mock-webex';
|
|
|
9
9
|
import sinon from 'sinon';
|
|
10
10
|
import FakeTimers from '@sinonjs/fake-timers';
|
|
11
11
|
import {NewMetrics} from '@webex/internal-plugin-metrics';
|
|
12
|
-
import {uniqueId} from 'lodash';
|
|
13
12
|
|
|
14
13
|
const flushPromises = () => new Promise(setImmediate);
|
|
15
14
|
|
|
@@ -66,6 +65,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
66
65
|
|
|
67
66
|
// matching because the request includes a symbol key: value pair and sinon cannot handle to compare it..
|
|
68
67
|
assert.match(webexRequestArgs, {
|
|
68
|
+
//@ts-ignore
|
|
69
69
|
body: {
|
|
70
70
|
metrics: [
|
|
71
71
|
{
|