@webex/internal-plugin-metrics 3.12.0-next.4 → 3.12.0-next.40

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 (48) hide show
  1. package/dist/automated-user.js +19 -0
  2. package/dist/automated-user.js.map +1 -0
  3. package/dist/batcher.js +3 -0
  4. package/dist/batcher.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +638 -65
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  7. package/dist/call-diagnostic/call-diagnostic-metrics.js +167 -76
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  9. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +5 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
  11. package/dist/call-diagnostic/config.js +16 -3
  12. package/dist/call-diagnostic/config.js.map +1 -1
  13. package/dist/config.js +1 -0
  14. package/dist/config.js.map +1 -1
  15. package/dist/index.js +15 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/metrics.js +1 -1
  18. package/dist/metrics.types.js +4 -0
  19. package/dist/metrics.types.js.map +1 -1
  20. package/dist/new-metrics.js +16 -6
  21. package/dist/new-metrics.js.map +1 -1
  22. package/dist/types/automated-user.d.ts +2 -0
  23. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +208 -5
  24. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +67 -14
  25. package/dist/types/call-diagnostic/config.d.ts +4 -0
  26. package/dist/types/config.d.ts +1 -0
  27. package/dist/types/index.d.ts +5 -3
  28. package/dist/types/metrics.types.d.ts +4 -2
  29. package/dist/types/new-metrics.d.ts +4 -0
  30. package/package.json +12 -11
  31. package/src/automated-user.ts +16 -0
  32. package/src/batcher.js +4 -0
  33. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +800 -73
  34. package/src/call-diagnostic/call-diagnostic-metrics.ts +101 -15
  35. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +5 -0
  36. package/src/call-diagnostic/config.ts +14 -0
  37. package/src/config.js +1 -0
  38. package/src/index.ts +5 -0
  39. package/src/metrics.types.ts +16 -3
  40. package/src/new-metrics.ts +12 -4
  41. package/test/unit/spec/automated-user.ts +43 -0
  42. package/test/unit/spec/batcher.js +43 -0
  43. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +14 -2
  44. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1434 -303
  45. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +852 -159
  46. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +27 -0
  47. package/test/unit/spec/new-metrics.ts +39 -2
  48. package/test/unit/spec/prelogin-metrics-batcher.ts +71 -36
@@ -460,6 +460,33 @@ describe('internal-plugin-metrics', () => {
460
460
  });
461
461
  });
462
462
 
463
+ it('logs a Milestone entry when event name is present', () => {
464
+ const logSpy = sinon.spy(webex.logger, 'log');
465
+ const eventName = 'client.call.initiated';
466
+ const eventPayload = {event: {name: eventName}};
467
+
468
+ prepareDiagnosticMetricItem(webex, {eventPayload, type: ['diagnostic-event']});
469
+
470
+ assert.isTrue(
471
+ logSpy.calledWith('Milestone,CallDiagnostic', eventName),
472
+ 'expected logger.log to be called with Milestone,CallDiagnostic and the event name'
473
+ );
474
+ sinon.restore();
475
+ });
476
+
477
+ it('does not log a Milestone entry when event name is absent', () => {
478
+ const logSpy = sinon.spy(webex.logger, 'log');
479
+ const eventPayload = {event: {}};
480
+
481
+ prepareDiagnosticMetricItem(webex, {eventPayload, type: ['diagnostic-event']});
482
+
483
+ assert.isFalse(
484
+ logSpy.calledWith('Milestone,CallDiagnostic', sinon.match.any),
485
+ 'expected logger.log not to be called with Milestone,CallDiagnostic when event name is absent'
486
+ );
487
+ sinon.restore();
488
+ });
489
+
463
490
  it('sets buildType and upgradeChannel correctly', () => {
464
491
  const item: any = {
465
492
  eventPayload: {
@@ -1,8 +1,12 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
- import {NewMetrics, CallDiagnosticLatencies} from '@webex/internal-plugin-metrics';
2
+ import {
3
+ NewMetrics,
4
+ CallDiagnosticLatencies,
5
+ AutomatedUserUtils,
6
+ Utils,
7
+ } from '@webex/internal-plugin-metrics';
3
8
  import MockWebex from '@webex/test-helper-mock-webex';
4
9
  import sinon from 'sinon';
5
- import {Utils} from '@webex/internal-plugin-metrics';
6
10
 
7
11
  describe('internal-plugin-metrics', () => {
8
12
 
@@ -69,6 +73,32 @@ describe('internal-plugin-metrics', () => {
69
73
 
70
74
  assert.instanceOf(webex.internal.newMetrics.callDiagnosticLatencies, CallDiagnosticLatencies);
71
75
  });
76
+
77
+ it('checks callDiagnosticMetrics is defined before ready emit', () => {
78
+ const webex = mockWebex();
79
+
80
+ assert.isDefined(webex.internal.newMetrics.callDiagnosticMetrics);
81
+ });
82
+
83
+ it('can call buildClientEventFetchRequestOptions before ready', async () => {
84
+ const webex = mockWebex();
85
+ const stub = sinon.stub(
86
+ webex.internal.newMetrics.callDiagnosticMetrics,
87
+ 'buildClientEventFetchRequestOptions'
88
+ ).resolves({url: 'https://metrics.example.com'});
89
+
90
+ const result = await webex.internal.newMetrics.buildClientEventFetchRequestOptions({
91
+ name: 'client.alert.displayed',
92
+ options: {correlationId: 'test-id'},
93
+ });
94
+
95
+ assert.calledOnceWithExactly(stub, {
96
+ name: 'client.alert.displayed',
97
+ payload: undefined,
98
+ options: {correlationId: 'test-id'},
99
+ });
100
+ assert.deepEqual(result, {url: 'https://metrics.example.com'});
101
+ });
72
102
  });
73
103
 
74
104
  describe('new-metrics', () => {
@@ -110,6 +140,13 @@ describe('internal-plugin-metrics', () => {
110
140
  assert.isDefined(webex.internal.newMetrics.businessMetrics);
111
141
  })
112
142
 
143
+ it('returns the automated user classification', () => {
144
+ assert.strictEqual(
145
+ webex.internal.newMetrics.isAutomatedUser(),
146
+ AutomatedUserUtils.isAutomatedUser()
147
+ );
148
+ });
149
+
113
150
  it('passes the table through to the business metrics', () => {
114
151
  assert.isUndefined(webex.internal.newMetrics.businessMetrics)
115
152
  webex.internal.newMetrics.isReadyToSubmitBusinessEvents();
@@ -64,45 +64,36 @@ describe('internal-plugin-metrics', () => {
64
64
  //@ts-ignore
65
65
  assert.calledOnce(webex.request);
66
66
 
67
- // matching because the request includes a symbol key: value pair and sinon cannot handle to compare it..
68
- assert.match(webexRequestArgs, {
69
- //@ts-ignore
70
- body: {
71
- metrics: [
72
- {
73
- eventPayload: {
74
- event: {
75
- joinTimes: {
76
- meetingInfoReqResp: undefined,
77
- clickToInterstitial: undefined,
78
- refreshCaptchaServiceReqResp: undefined,
79
- downloadIntelligenceModelsReqResp: undefined,
80
- clickToInterstitialWithUserDelay: undefined,
81
- },
82
- name: 'client.interstitial-window.launched',
83
- },
84
- origin: {
85
- buildType: 'test',
86
- networkType: 'unknown',
87
- upgradeChannel: 'test',
88
- },
89
- originTime: {
90
- sent: dateAfterBatcherWait.toISOString(),
91
- },
92
- },
93
- type: ['diagnostic-event'],
94
- },
95
- ],
67
+ assert.deepEqual(webexRequestArgs.headers, {
68
+ authorization: false,
69
+ 'x-prelogin-userid': preLoginId,
70
+ });
71
+ assert.equal(webexRequestArgs.method, 'POST');
72
+ assert.equal(webexRequestArgs.resource, 'clientmetrics-prelogin');
73
+ assert.equal(webexRequestArgs.service, 'metrics');
74
+ assert.equal(webexRequestArgs.waitForServiceTimeout, 30);
75
+
76
+ assert.deepEqual(webexRequestArgs.body.metrics[0].eventPayload, {
77
+ event: {
78
+ joinTimes: {
79
+ meetingInfoReqResp: undefined,
80
+ clickToInterstitial: undefined,
81
+ refreshCaptchaServiceReqResp: undefined,
82
+ downloadIntelligenceModelsReqResp: undefined,
83
+ clickToInterstitialWithUserDelay: undefined,
84
+ },
85
+ name: 'client.interstitial-window.launched',
96
86
  },
97
- headers: {
98
- authorization: false,
99
- 'x-prelogin-userid': preLoginId,
87
+ origin: {
88
+ buildType: 'test',
89
+ networkType: 'unknown',
90
+ upgradeChannel: 'test',
91
+ },
92
+ originTime: {
93
+ sent: dateAfterBatcherWait.toISOString(),
100
94
  },
101
- method: 'POST',
102
- resource: 'clientmetrics-prelogin',
103
- service: 'metrics',
104
- waitForServiceTimeout: 30,
105
95
  });
96
+ assert.deepEqual(webexRequestArgs.body.metrics[0].type, ['diagnostic-event']);
106
97
  assert.lengthOf(
107
98
  webex.internal.newMetrics.callDiagnosticMetrics.preLoginMetricsBatcher.queue,
108
99
  0
@@ -320,5 +311,49 @@ describe('internal-plugin-metrics', () => {
320
311
  );
321
312
  });
322
313
  });
314
+
315
+ describe('#submitHttpRequest', () => {
316
+ it('calls webex.request with the correct parameters', async () => {
317
+ const payload = [
318
+ {
319
+ eventPayload: {event: 'my.event'},
320
+ type: ['diagnostic-event'],
321
+ },
322
+ ];
323
+
324
+ webex.internal.newMetrics.callDiagnosticMetrics.preLoginMetricsBatcher.savePreLoginId(
325
+ preLoginId
326
+ );
327
+ webex.request = sinon.stub().resolves({statusCode: 200});
328
+
329
+ const promise =
330
+ webex.internal.newMetrics.callDiagnosticMetrics.preLoginMetricsBatcher.submitHttpRequest(
331
+ payload
332
+ );
333
+
334
+ await flushPromises();
335
+
336
+ clock.tick(config.metrics.batcherWait);
337
+
338
+ await promise;
339
+
340
+ const webexRequestArgs = webex.request.args[0][0];
341
+
342
+ assert.match(webexRequestArgs, {
343
+ //@ts-ignore
344
+ body: {
345
+ metrics: payload,
346
+ },
347
+ headers: {
348
+ authorization: false,
349
+ 'x-prelogin-userid': preLoginId,
350
+ },
351
+ method: 'POST',
352
+ resource: 'clientmetrics-prelogin',
353
+ service: 'metrics',
354
+ waitForServiceTimeout: 30,
355
+ });
356
+ });
357
+ });
323
358
  });
324
359
  });