@webex/internal-plugin-metrics 3.0.0-beta.2 → 3.0.0-beta.200

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 (76) hide show
  1. package/README.md +1 -3
  2. package/dist/batcher.js +3 -22
  3. package/dist/batcher.js.map +1 -1
  4. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +56 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +451 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js +584 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +225 -0
  11. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  12. package/dist/call-diagnostic/config.js +461 -0
  13. package/dist/call-diagnostic/config.js.map +1 -0
  14. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js +7 -0
  15. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js.map +1 -0
  16. package/dist/call-diagnostic/generated-types-temp/Event.js +7 -0
  17. package/dist/call-diagnostic/generated-types-temp/Event.js.map +1 -0
  18. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js +7 -0
  19. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js.map +1 -0
  20. package/dist/client-metrics-batcher.js +1 -7
  21. package/dist/client-metrics-batcher.js.map +1 -1
  22. package/dist/config.js +21 -5
  23. package/dist/config.js.map +1 -1
  24. package/dist/index.js +26 -10
  25. package/dist/index.js.map +1 -1
  26. package/dist/metrics.js +43 -80
  27. package/dist/metrics.js.map +1 -1
  28. package/dist/metrics.types.js +7 -0
  29. package/dist/metrics.types.js.map +1 -0
  30. package/dist/new-metrics.js +249 -0
  31. package/dist/new-metrics.js.map +1 -0
  32. package/dist/types/batcher.d.ts +2 -0
  33. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  34. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +189 -0
  35. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +348 -0
  36. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +52 -0
  37. package/dist/types/call-diagnostic/config.d.ts +57 -0
  38. package/dist/types/call-diagnostic/generated-types-temp/ClientEvent.d.ts +1112 -0
  39. package/dist/types/call-diagnostic/generated-types-temp/Event.d.ts +4851 -0
  40. package/dist/types/call-diagnostic/generated-types-temp/MediaQualityEvent.d.ts +2121 -0
  41. package/dist/types/client-metrics-batcher.d.ts +2 -0
  42. package/dist/types/config.d.ts +35 -0
  43. package/dist/types/index.d.ts +11 -0
  44. package/dist/types/metrics.d.ts +3 -0
  45. package/dist/types/metrics.types.d.ts +92 -0
  46. package/dist/types/new-metrics.d.ts +119 -0
  47. package/package.json +12 -8
  48. package/src/batcher.js +33 -26
  49. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +51 -0
  50. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +408 -0
  51. package/src/call-diagnostic/call-diagnostic-metrics.ts +591 -0
  52. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +233 -0
  53. package/src/call-diagnostic/config.ts +455 -0
  54. package/src/call-diagnostic/generated-types-temp/ClientEvent.ts +2395 -0
  55. package/src/call-diagnostic/generated-types-temp/Event.ts +7762 -0
  56. package/src/call-diagnostic/generated-types-temp/MediaQualityEvent.ts +2321 -0
  57. package/src/client-metrics-batcher.js +3 -4
  58. package/src/config.js +25 -5
  59. package/src/index.ts +39 -0
  60. package/src/metrics.js +44 -58
  61. package/src/metrics.types.ts +137 -0
  62. package/src/new-metrics.ts +223 -0
  63. package/test/unit/spec/batcher.js +26 -15
  64. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +243 -0
  65. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +474 -0
  66. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +820 -0
  67. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +336 -0
  68. package/test/unit/spec/client-metrics-batcher.js +26 -15
  69. package/test/unit/spec/metrics.js +85 -116
  70. package/test/unit/spec/new-metrics.ts +153 -0
  71. package/tsconfig.json +6 -0
  72. package/dist/call-diagnostic-events-batcher.js +0 -70
  73. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  74. package/src/call-diagnostic-events-batcher.js +0 -62
  75. package/src/index.js +0 -17
  76. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -180
@@ -27,8 +27,8 @@ describe('plugin-metrics', () => {
27
27
  beforeEach(() => {
28
28
  webex = new MockWebex({
29
29
  children: {
30
- metrics: Metrics
31
- }
30
+ metrics: Metrics,
31
+ },
32
32
  });
33
33
 
34
34
  webex.config.metrics = config.metrics;
@@ -37,7 +37,7 @@ describe('plugin-metrics', () => {
37
37
  return Promise.resolve({
38
38
  statusCode: 204,
39
39
  body: undefined,
40
- options
40
+ options,
41
41
  });
42
42
  };
43
43
  sinon.spy(webex, 'request');
@@ -58,9 +58,10 @@ describe('plugin-metrics', () => {
58
58
  it('clears the queue', () => {
59
59
  clock.uninstall();
60
60
 
61
- return webex.internal.metrics.batcher.request({
62
- key: 'testMetric'
63
- })
61
+ return webex.internal.metrics.batcher
62
+ .request({
63
+ key: 'testMetric',
64
+ })
64
65
  .then(() => {
65
66
  assert.calledOnce(webex.request);
66
67
  assert.lengthOf(webex.internal.metrics.batcher.queue, 0);
@@ -80,26 +81,28 @@ describe('plugin-metrics', () => {
80
81
 
81
82
  sinon.stub(webex, 'request').callsFake((options) => {
82
83
  options.headers = {
83
- trackingid: count
84
+ trackingid: count,
84
85
  };
85
86
 
86
87
  count += 1;
87
88
  if (count < 9) {
88
- return Promise.reject(new WebexHttpError.NetworkOrCORSError({
89
- statusCode: 0,
90
- options
91
- }));
89
+ return Promise.reject(
90
+ new WebexHttpError.NetworkOrCORSError({
91
+ statusCode: 0,
92
+ options,
93
+ })
94
+ );
92
95
  }
93
96
 
94
97
  return Promise.resolve({
95
98
  statusCode: 204,
96
99
  body: undefined,
97
- options
100
+ options,
98
101
  });
99
102
  });
100
103
 
101
104
  const promise = webex.internal.metrics.batcher.request({
102
- key: 'testMetric'
105
+ key: 'testMetric',
103
106
  });
104
107
 
105
108
  return promiseTick(50)
@@ -159,8 +162,16 @@ describe('plugin-metrics', () => {
159
162
  .then(() => assert.lengthOf(webex.internal.metrics.batcher.queue, 0))
160
163
  .then(() => promise)
161
164
  .then(() => {
162
- assert.lengthOf(webex.request.args[1][0].body.metrics, 1, 'Reenqueuing the metric once did not increase the number of metrics to be submitted');
163
- assert.lengthOf(webex.request.args[2][0].body.metrics, 1, 'Reenqueuing the metric twice did not increase the number of metrics to be submitted');
165
+ assert.lengthOf(
166
+ webex.request.args[1][0].body.metrics,
167
+ 1,
168
+ 'Reenqueuing the metric once did not increase the number of metrics to be submitted'
169
+ );
170
+ assert.lengthOf(
171
+ webex.request.args[2][0].body.metrics,
172
+ 1,
173
+ 'Reenqueuing the metric twice did not increase the number of metrics to be submitted'
174
+ );
164
175
  assert.lengthOf(webex.internal.metrics.batcher.queue, 0);
165
176
  });
166
177
  });
@@ -0,0 +1,243 @@
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} from '@webex/internal-plugin-metrics';
7
+ import MockWebex from '@webex/test-helper-mock-webex';
8
+ import sinon from 'sinon';
9
+ import {NewMetrics} from '@webex/internal-plugin-metrics';
10
+ const flushPromises = () => new Promise(setImmediate);
11
+
12
+ describe('plugin-metrics', () => {
13
+ describe('CallDiagnosticEventsBatcher', () => {
14
+ let webex;
15
+
16
+ beforeEach(() => {
17
+ //@ts-ignore
18
+ webex = new MockWebex({
19
+ children: {
20
+ newMetrics: NewMetrics
21
+ }
22
+ });
23
+
24
+ webex.request = (options) => Promise.resolve({body: {items: []}, options});
25
+ sinon.spy(webex, 'request');
26
+
27
+ webex.emit("ready");
28
+
29
+ webex.config.metrics = config.metrics;
30
+ });
31
+
32
+ afterEach(() => {
33
+ sinon.restore();
34
+ });
35
+
36
+ describe('#request()', () => {
37
+ describe('when the request completes successfully', async () => {
38
+ it('clears the queue', async () => {
39
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
40
+ //@ts-ignore
41
+ {event: {name: 'client.interstitial-window.launched'}}
42
+ );
43
+ await flushPromises();
44
+
45
+ //@ts-ignore
46
+ assert.calledOnce(webex.request);
47
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
48
+ });
49
+
50
+ it('doesnt include any joinTimes for other events', async () => {
51
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
52
+ //@ts-ignore
53
+ {event: {name: 'client.alert.displayed'}}
54
+ );
55
+ await flushPromises();
56
+
57
+ //@ts-ignore
58
+ assert.calledOnce(webex.request);
59
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
60
+ name: 'client.alert.displayed',
61
+ });
62
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
63
+ });
64
+
65
+ it('appends the correct join times to the request for client.interstitial-window.launched', async () => {
66
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
67
+ webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon.stub().returns(10);
68
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
69
+ //@ts-ignore
70
+ {event: {name: 'client.interstitial-window.launched'}}
71
+ );
72
+ await flushPromises();
73
+
74
+ //@ts-ignore
75
+ assert.calledOnce(webex.request);
76
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
77
+ name: 'client.interstitial-window.launched',
78
+ joinTimes: {
79
+ clickToInterstitial: 10,
80
+ meetingInfoReqResp: 10,
81
+ },
82
+ });
83
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
84
+ });
85
+
86
+ it('appends the correct join times to the request for client.call.initiated', async () => {
87
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
88
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
89
+ //@ts-ignore
90
+ {event: {name: 'client.call.initiated'}}
91
+ );
92
+ await flushPromises();
93
+
94
+ //@ts-ignore
95
+ assert.calledOnce(webex.request);
96
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
97
+ name: 'client.call.initiated',
98
+ joinTimes: {
99
+ meetingInfoReqResp: 10,
100
+ showInterstitialTime: 10,
101
+ },
102
+ });
103
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
104
+ });
105
+
106
+ it('appends the correct join times to the request for client.locus.join.response', async () => {
107
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
108
+ webex.internal.newMetrics.callDiagnosticLatencies.getJoinRespSentReceived = sinon.stub().returns(20);
109
+ webex.internal.newMetrics.callDiagnosticLatencies.getPageJMT = sinon.stub().returns(30);
110
+ webex.internal.newMetrics.callDiagnosticLatencies.getClientJMT = sinon.stub().returns(5);
111
+ webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon.stub().returns(10);
112
+ webex.internal.newMetrics.callDiagnosticLatencies.getCallInitJoinReq = sinon.stub().returns(10);
113
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
114
+ //@ts-ignore
115
+ {event: {name: 'client.locus.join.response'}}
116
+ );
117
+ await flushPromises();
118
+
119
+ //@ts-ignore
120
+ assert.calledOnce(webex.request);
121
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
122
+ name: 'client.locus.join.response',
123
+ joinTimes: {
124
+ callInitJoinReq: 10,
125
+ clickToInterstitial: 10,
126
+ interstitialToJoinOK: 10,
127
+ joinReqResp: 10,
128
+ joinReqSentReceived: 20,
129
+ meetingInfoReqResp: 10,
130
+ pageJmt: 30,
131
+ totalJmt: 20,
132
+ clientJmt: 5,
133
+ },
134
+ });
135
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
136
+ });
137
+
138
+ it('appends the correct join times to the request for client.ice.end', async () => {
139
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
140
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
141
+ //@ts-ignore
142
+ {event: {name: 'client.ice.end'}}
143
+ );
144
+ await flushPromises();
145
+
146
+ //@ts-ignore
147
+ assert.calledOnce(webex.request);
148
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
149
+ name: 'client.ice.end',
150
+ joinTimes: {
151
+ ICESetupTime: 10,
152
+ audioICESetupTime: 10,
153
+ shareICESetupTime: 10,
154
+ videoICESetupTime: 10,
155
+ },
156
+ });
157
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
158
+ });
159
+
160
+ it('appends the correct join times to the request for client.media.rx.start', async () => {
161
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
162
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
163
+ //@ts-ignore
164
+ {event: {name: 'client.media.rx.start'}}
165
+ );
166
+ await flushPromises();
167
+
168
+ //@ts-ignore
169
+ assert.calledOnce(webex.request);
170
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
171
+ name: 'client.media.rx.start',
172
+ joinTimes: {
173
+ localSDPGenRemoteSDPRecv: 10,
174
+ },
175
+ });
176
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
177
+ });
178
+
179
+ it('appends the correct join times to the request for client.media-engine.ready', async () => {
180
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
181
+ webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToMediaOKJMT = sinon.stub().returns(10);
182
+ webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitial = sinon.stub().returns(10);
183
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
184
+ //@ts-ignore
185
+ {event: {name: 'client.media-engine.ready'}}
186
+ );
187
+ await flushPromises();
188
+
189
+ //@ts-ignore
190
+ assert.calledOnce(webex.request);
191
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
192
+ name: 'client.media-engine.ready',
193
+ joinTimes: {
194
+ totalMediaJMT: 30,
195
+ interstitialToMediaOKJMT: 10,
196
+ callInitMediaEngineReady: 10,
197
+ stayLobbyTime: 10,
198
+ },
199
+ });
200
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
201
+ });
202
+
203
+ it('appends the correct audio and video setup delays to the request for client.mediaquality.event', async () => {
204
+ webex.internal.newMetrics.callDiagnosticLatencies.getDiffBetweenTimestamps = sinon.stub().returns(10);
205
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
206
+ //@ts-ignore
207
+ {event: {name: 'client.mediaquality.event'}}
208
+ );
209
+ await flushPromises();
210
+
211
+ //@ts-ignore
212
+ assert.calledOnce(webex.request);
213
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event, {
214
+ name: 'client.mediaquality.event',
215
+ audioSetupDelay: {
216
+ joinRespRxStart: 10,
217
+ joinRespTxStart: 10,
218
+ },
219
+ videoSetupDelay: {
220
+ joinRespRxStart: 10,
221
+ joinRespTxStart: 10,
222
+ }
223
+ });
224
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
225
+ });
226
+
227
+ it('doesnt include audioSetup and videoSetup delays for other events', async () => {
228
+ await webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
229
+ //@ts-ignore
230
+ {event: {name: 'client.alert.displayed'}}
231
+ );
232
+ await flushPromises();
233
+
234
+ //@ts-ignore
235
+ assert.calledOnce(webex.request);
236
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event.audioSetupDelay, undefined);
237
+ assert.deepEqual(webex.request.getCalls()[0].args[0].body.metrics[0].eventPayload.event.videoSetupDelay, undefined);
238
+ assert.lengthOf(webex.internal.newMetrics.callDiagnosticMetrics.callDiagnosticEventsBatcher.queue, 0);
239
+ })
240
+ });
241
+ });
242
+ });
243
+ });