@webex/internal-plugin-metrics 3.0.0-beta.373 → 3.0.0-beta.375
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/batcher.js +38 -0
- package/dist/batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +6 -6
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +13 -10
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/new-metrics.js +3 -37
- package/dist/new-metrics.js.map +1 -1
- package/dist/prelogin-metrics-batcher.js +82 -0
- package/dist/prelogin-metrics-batcher.js.map +1 -0
- package/dist/types/batcher.d.ts +5 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +10 -3
- package/dist/types/index.d.ts +3 -1
- package/dist/types/new-metrics.d.ts +0 -8
- package/dist/types/prelogin-metrics-batcher.d.ts +2 -0
- package/package.json +8 -8
- package/src/batcher.js +37 -0
- package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +6 -9
- package/src/call-diagnostic/call-diagnostic-metrics.ts +13 -12
- package/src/index.ts +12 -1
- package/src/new-metrics.ts +0 -39
- package/src/prelogin-metrics-batcher.ts +95 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +60 -97
- package/test/unit/spec/new-metrics.ts +0 -33
- package/test/unit/spec/prelogin-metrics-batcher.ts +250 -0
package/dist/new-metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Metrics","args","onReady","webex","once","callDiagnosticMetrics","CallDiagnosticMetrics","parent","callDiagnosticLatencies","CallDiagnosticLatencies","name","payload","options","clearTimestamps","saveTimestamp","key","Error","submitMQE","logger","log","resolve","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","authorization","body","metrics","then","res","catch","err","error","generateCommonErrorMetadata","reject","qs","alias","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","serviceErrorCode","isServiceErrorExpected","WebexPlugin"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport {\n RecursivePartial,\n ClientEvent,\n FeatureEvent,\n BehavioralEvent,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n name,\n payload,\n options,\n }: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n throw new Error('Not implemented.');\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({\n name,\n payload,\n options,\n }: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Submit a pre-login metric to clientmetrics\n * @public\n * @param payload\n * @param preLoginId - pre-login ID of user\n * @returns\n */\n public postPreLoginMetric(payload: any, preLoginId: string): Promise<any> {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': preLoginId,\n },\n body: {\n metrics: [payload],\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @postPreLoginMetric. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Metrics","args","onReady","webex","once","callDiagnosticMetrics","CallDiagnosticMetrics","parent","callDiagnosticLatencies","CallDiagnosticLatencies","name","payload","options","clearTimestamps","saveTimestamp","key","Error","submitMQE","logger","log","resolve","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","body","qs","alias","then","res","catch","err","error","generateCommonErrorMetadata","reject","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","serviceErrorCode","isServiceErrorExpected","WebexPlugin"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport {\n RecursivePartial,\n ClientEvent,\n FeatureEvent,\n BehavioralEvent,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n name,\n payload,\n options,\n }: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n throw new Error('Not implemented.');\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({\n name,\n payload,\n options,\n }: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
5
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
10
|
+
var _uniqueId2 = _interopRequireDefault(require("lodash/uniqueId"));
|
|
11
|
+
var _batcher = _interopRequireDefault(require("./batcher"));
|
|
12
|
+
var _callDiagnosticMetrics = require("./call-diagnostic/call-diagnostic-metrics.util");
|
|
13
|
+
var _utils = require("./utils");
|
|
14
|
+
var PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';
|
|
15
|
+
var PreLoginMetricsBatcher = _batcher.default.extend({
|
|
16
|
+
namespace: 'Metrics',
|
|
17
|
+
preLoginId: undefined,
|
|
18
|
+
/**
|
|
19
|
+
* Save the pre-login ID.
|
|
20
|
+
* @param {string} preLoginId The pre-login ID to be saved.
|
|
21
|
+
* @returns {void}
|
|
22
|
+
*/
|
|
23
|
+
savePreLoginId: function savePreLoginId(preLoginId) {
|
|
24
|
+
this.preLoginId = preLoginId;
|
|
25
|
+
},
|
|
26
|
+
/**
|
|
27
|
+
* Prepare item
|
|
28
|
+
* @param {any} item
|
|
29
|
+
* @returns {Promise<any>}
|
|
30
|
+
*/
|
|
31
|
+
prepareItem: function prepareItem(item) {
|
|
32
|
+
return _promise.default.resolve((0, _callDiagnosticMetrics.prepareDiagnosticMetricItem)(this.webex, item));
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Prepare request, add time sensitive date etc.
|
|
36
|
+
* @param {any[]} queue
|
|
37
|
+
* @returns {Promise<any[]>}
|
|
38
|
+
*/
|
|
39
|
+
prepareRequest: function prepareRequest(queue) {
|
|
40
|
+
// Add sent timestamp
|
|
41
|
+
queue.forEach(function (item) {
|
|
42
|
+
item.eventPayload.originTime = item.eventPayload.originTime || {};
|
|
43
|
+
item.eventPayload.originTime.sent = new Date().toISOString();
|
|
44
|
+
});
|
|
45
|
+
return _promise.default.resolve(queue);
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
* @param {any} payload
|
|
50
|
+
* @returns {Promise<any>}
|
|
51
|
+
*/
|
|
52
|
+
submitHttpRequest: function submitHttpRequest(payload) {
|
|
53
|
+
var _this = this;
|
|
54
|
+
var batchId = (0, _uniqueId2.default)('prelogin-ca-batch-');
|
|
55
|
+
if (this.preLoginId === undefined) {
|
|
56
|
+
this.webex.logger.error(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". PreLoginId is not set."));
|
|
57
|
+
return _promise.default.reject(new Error('PreLoginId is not set.'));
|
|
58
|
+
}
|
|
59
|
+
return this.webex.request({
|
|
60
|
+
method: 'POST',
|
|
61
|
+
service: 'metrics',
|
|
62
|
+
resource: 'clientmetrics-prelogin',
|
|
63
|
+
headers: {
|
|
64
|
+
authorization: false,
|
|
65
|
+
'x-prelogin-userid': this.preLoginId
|
|
66
|
+
},
|
|
67
|
+
body: {
|
|
68
|
+
metrics: payload
|
|
69
|
+
},
|
|
70
|
+
waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
|
|
71
|
+
}).then(function (res) {
|
|
72
|
+
_this.webex.logger.log(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful."));
|
|
73
|
+
return res;
|
|
74
|
+
}).catch(function (err) {
|
|
75
|
+
_this.webex.logger.error(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". Request failed:"), "error: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
|
|
76
|
+
return _promise.default.reject(err);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
var _default = PreLoginMetricsBatcher;
|
|
81
|
+
exports.default = _default;
|
|
82
|
+
//# sourceMappingURL=prelogin-metrics-batcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PRE_LOGIN_METRICS_IDENTIFIER","PreLoginMetricsBatcher","Batcher","extend","namespace","preLoginId","undefined","savePreLoginId","prepareItem","item","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","batchId","logger","error","reject","Error","request","method","service","resource","headers","authorization","body","metrics","waitForServiceTimeout","config","then","res","log","catch","err","generateCommonErrorMetadata"],"sources":["prelogin-metrics-batcher.ts"],"sourcesContent":["import {uniqueId} from 'lodash';\nimport Batcher from './batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\nconst PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';\n\nconst PreLoginMetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n preLoginId: undefined,\n\n /**\n * Save the pre-login ID.\n * @param {string} preLoginId The pre-login ID to be saved.\n * @returns {void}\n */\n savePreLoginId(preLoginId) {\n this.preLoginId = preLoginId;\n },\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload: any) {\n const batchId = uniqueId('prelogin-ca-batch-');\n if (this.preLoginId === undefined) {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`\n );\n\n return Promise.reject(new Error('PreLoginId is not set.'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': this.preLoginId,\n },\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default PreLoginMetricsBatcher;\n"],"mappings":";;;;;;;;;;AACA;AACA;AACA;AAEA,IAAMA,4BAA4B,GAAG,uBAAuB;AAE5D,IAAMC,sBAAsB,GAAGC,gBAAO,CAACC,MAAM,CAAC;EAC5CC,SAAS,EAAE,SAAS;EACpBC,UAAU,EAAEC,SAAS;EAErB;AACF;AACA;AACA;AACA;EACEC,cAAc,0BAACF,UAAU,EAAE;IACzB,IAAI,CAACA,UAAU,GAAGA,UAAU;EAC9B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEG,WAAW,uBAACC,IAAI,EAAE;IAChB,OAAO,iBAAQC,OAAO,CAAC,IAAAC,kDAA2B,EAAC,IAAI,CAACC,KAAK,EAAEH,IAAI,CAAC,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEI,cAAc,0BAACC,KAAK,EAAE;IACpB;IACAA,KAAK,CAACC,OAAO,CAAC,UAACN,IAAI,EAAK;MACtBA,IAAI,CAACO,YAAY,CAACC,UAAU,GAAGR,IAAI,CAACO,YAAY,CAACC,UAAU,IAAI,CAAC,CAAC;MACjER,IAAI,CAACO,YAAY,CAACC,UAAU,CAACC,IAAI,GAAG,IAAIC,IAAI,EAAE,CAACC,WAAW,EAAE;IAC9D,CAAC,CAAC;IAEF,OAAO,iBAAQV,OAAO,CAACI,KAAK,CAAC;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,iBAAiB,6BAACC,OAAY,EAAE;IAAA;IAC9B,IAAMC,OAAO,GAAG,wBAAS,oBAAoB,CAAC;IAC9C,IAAI,IAAI,CAAClB,UAAU,KAAKC,SAAS,EAAE;MACjC,IAAI,CAACM,KAAK,CAACY,MAAM,CAACC,KAAK,CACrBzB,4BAA4B,uDACkBuB,OAAO,8BACtD;MAED,OAAO,iBAAQG,MAAM,CAAC,IAAIC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5D;IAEA,OAAO,IAAI,CAACf,KAAK,CACdgB,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,wBAAwB;MAClCC,OAAO,EAAE;QACPC,aAAa,EAAE,KAAK;QACpB,mBAAmB,EAAE,IAAI,CAAC5B;MAC5B,CAAC;MACD6B,IAAI,EAAE;QACJC,OAAO,EAAEb;MACX,CAAC;MACDc,qBAAqB,EAAE,IAAI,CAACxB,KAAK,CAACyB,MAAM,CAACF,OAAO,CAACC;IACnD,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;MACb,KAAI,CAAC3B,KAAK,CAACY,MAAM,CAACgB,GAAG,CACnBxC,4BAA4B,uDACkBuB,OAAO,2BACtD;MAED,OAAOgB,GAAG;IACZ,CAAC,CAAC,CACDE,KAAK,CAAC,UAACC,GAAG,EAAK;MACd,KAAI,CAAC9B,KAAK,CAACY,MAAM,CAACC,KAAK,CACrBzB,4BAA4B,uDACkBuB,OAAO,yCAC3C,IAAAoB,kCAA2B,EAACD,GAAG,CAAC,EAC3C;MAED,OAAO,iBAAQhB,MAAM,CAACgB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN;AACF,CAAC,CAAC;AAAC,eAEYzC,sBAAsB;AAAA"}
|
package/dist/types/batcher.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ type GetIdentifiersOptions = {
|
|
|
23
23
|
*/
|
|
24
24
|
export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
25
25
|
private callDiagnosticEventsBatcher;
|
|
26
|
+
private preLoginMetricsBatcher;
|
|
26
27
|
private logger;
|
|
27
28
|
private hasLoggedBrowserSerial;
|
|
28
29
|
validator: (options: {
|
|
@@ -87,11 +88,17 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
87
88
|
browserVersion?: string;
|
|
88
89
|
clientType?: "MEETING_CENTER" | "EVENT_CENTER" | "TRAINING_CENTER" | "TEAMS_CLIENT" | "TEAMS_DEVICE" | "TEAMS_SHARE" | "SIP" | "RECORDING" | "CLOUD_AWARE_SIP" | "TEAMS_WXC_CLIENT" | "WXC_CLIENT" | "WXC_DEVICE" | "WEBEX_JS_SDK" | "VOICEA_CLIENT" | "CISCO_SIP_GW" | "WEBEX_SDK" | "CPAAS_THIRD_PARTY_SDK" | "WXC_THIRD_PARTY" | "WXCC";
|
|
89
90
|
subClientType?: "TEAMS_DEVICE" | "DESKTOP_APP" | "DESKTOP_APP_VDI" | "DEVICE_CURRENT" | "DEVICE_LEGACY_2020" | "HOLOGRAM_HEADSET_APP" | "HVDI_APP" | "MOBILE_APP" | "MOBILE_NETWORK" | "VDI_APP" | "WEB_APP";
|
|
90
|
-
clientVersion?: string;
|
|
91
|
+
clientVersion?: string; /**
|
|
92
|
+
* Returns the login type of the current user
|
|
93
|
+
* @returns one of 'login-ci','unverified-guest', null
|
|
94
|
+
*/
|
|
91
95
|
clientVersionStatus?: "CURRENT" | "LEGACY" | "UNSUPPORTED";
|
|
92
96
|
localClientVersion?: string;
|
|
93
97
|
modelNumber?: string;
|
|
94
|
-
joinFirstUpdateLater?: "ep-enabled" | "sp-enabled" | "not-enabled";
|
|
98
|
+
joinFirstUpdateLater?: "ep-enabled" | "sp-enabled" | "not-enabled"; /**
|
|
99
|
+
* Returns if the meeting has converged architecture enabled
|
|
100
|
+
* @param options.meetingId
|
|
101
|
+
*/
|
|
95
102
|
standbyUsed?: boolean;
|
|
96
103
|
prefetchDocShowUsed?: boolean;
|
|
97
104
|
fastJoinUsed?: boolean;
|
|
@@ -388,7 +395,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
388
395
|
*/
|
|
389
396
|
submitToCallDiagnostics(event: Event): Promise<any>;
|
|
390
397
|
/**
|
|
391
|
-
*
|
|
398
|
+
* Prepare the event and send the request to metrics-a service, pre login.
|
|
392
399
|
* @param event
|
|
393
400
|
* @param preLoginId
|
|
394
401
|
* @returns
|
package/dist/types/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ import * as Utils from './utils';
|
|
|
8
8
|
import { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitOperationalEvent, SubmitMQE } from './metrics.types';
|
|
9
9
|
import * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';
|
|
10
10
|
import * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';
|
|
11
|
+
import CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';
|
|
12
|
+
import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
|
|
11
13
|
export { default, getOSNameInternal } from './metrics';
|
|
12
|
-
export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils };
|
|
14
|
+
export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, };
|
|
13
15
|
export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, };
|
|
@@ -79,14 +79,6 @@ declare class Metrics extends WebexPlugin {
|
|
|
79
79
|
payload?: RecursivePartial<ClientEvent['payload']>;
|
|
80
80
|
options?: SubmitClientEventOptions;
|
|
81
81
|
}): Promise<any>;
|
|
82
|
-
/**
|
|
83
|
-
* Submit a pre-login metric to clientmetrics
|
|
84
|
-
* @public
|
|
85
|
-
* @param payload
|
|
86
|
-
* @param preLoginId - pre-login ID of user
|
|
87
|
-
* @returns
|
|
88
|
-
*/
|
|
89
|
-
postPreLoginMetric(payload: any, preLoginId: string): Promise<any>;
|
|
90
82
|
/**
|
|
91
83
|
* Issue request to alias a user's pre-login ID with their CI UUID
|
|
92
84
|
* @param {string} preLoginId
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-metrics",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.375",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@webex/common": "3.0.0-beta.
|
|
32
|
-
"@webex/common-timers": "3.0.0-beta.
|
|
31
|
+
"@webex/common": "3.0.0-beta.375",
|
|
32
|
+
"@webex/common-timers": "3.0.0-beta.375",
|
|
33
33
|
"@webex/event-dictionary-ts": "^1.0.1329",
|
|
34
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
35
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
38
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
34
|
+
"@webex/internal-plugin-device": "3.0.0-beta.375",
|
|
35
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.375",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.375",
|
|
37
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.375",
|
|
38
|
+
"@webex/webex-core": "3.0.0-beta.375",
|
|
39
39
|
"ip-anonymize": "^0.1.0",
|
|
40
40
|
"lodash": "^4.17.21",
|
|
41
41
|
"uuid": "^3.3.2"
|
package/src/batcher.js
CHANGED
|
@@ -7,9 +7,18 @@ import {safeSetTimeout} from '@webex/common-timers';
|
|
|
7
7
|
|
|
8
8
|
const sym = Symbol('metric id');
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* @class
|
|
12
|
+
* @extends Batcher
|
|
13
|
+
* @memberof Metrics
|
|
14
|
+
*/
|
|
10
15
|
const MetricsBatcher = Batcher.extend({
|
|
11
16
|
namespace: 'Metrics',
|
|
12
17
|
|
|
18
|
+
/**
|
|
19
|
+
* @param {any} item
|
|
20
|
+
* @returns {Promise<any>}
|
|
21
|
+
*/
|
|
13
22
|
prepareItem(item) {
|
|
14
23
|
// Keep non-prod data out of metrics
|
|
15
24
|
const env = process.env.NODE_ENV === 'production' ? null : 'TEST';
|
|
@@ -22,6 +31,10 @@ const MetricsBatcher = Batcher.extend({
|
|
|
22
31
|
return Promise.resolve(item);
|
|
23
32
|
},
|
|
24
33
|
|
|
34
|
+
/**
|
|
35
|
+
* @param {any[]} queue
|
|
36
|
+
* @returns {Promise<any[]>}
|
|
37
|
+
*/
|
|
25
38
|
prepareRequest(queue) {
|
|
26
39
|
return Promise.resolve(
|
|
27
40
|
queue.map((item) => {
|
|
@@ -32,6 +45,10 @@ const MetricsBatcher = Batcher.extend({
|
|
|
32
45
|
);
|
|
33
46
|
},
|
|
34
47
|
|
|
48
|
+
/**
|
|
49
|
+
* @param {any} payload
|
|
50
|
+
* @returns {Promise<any>}
|
|
51
|
+
*/
|
|
35
52
|
submitHttpRequest(payload) {
|
|
36
53
|
return this.webex.request({
|
|
37
54
|
method: 'POST',
|
|
@@ -44,10 +61,18 @@ const MetricsBatcher = Batcher.extend({
|
|
|
44
61
|
});
|
|
45
62
|
},
|
|
46
63
|
|
|
64
|
+
/**
|
|
65
|
+
* @param {any} res
|
|
66
|
+
* @returns {Promise<any>}
|
|
67
|
+
*/
|
|
47
68
|
handleHttpSuccess(res) {
|
|
48
69
|
return Promise.all(res.options.body.metrics.map((item) => this.acceptItem(item)));
|
|
49
70
|
},
|
|
50
71
|
|
|
72
|
+
/**
|
|
73
|
+
* @param {any} reason
|
|
74
|
+
* @returns {Promise<any>}
|
|
75
|
+
*/
|
|
51
76
|
handleHttpError(reason) {
|
|
52
77
|
if (reason instanceof WebexHttpError.NetworkOrCORSError) {
|
|
53
78
|
this.logger.warn(
|
|
@@ -74,6 +99,10 @@ const MetricsBatcher = Batcher.extend({
|
|
|
74
99
|
return Reflect.apply(Batcher.prototype.handleHttpError, this, [reason]);
|
|
75
100
|
},
|
|
76
101
|
|
|
102
|
+
/**
|
|
103
|
+
* @param {any} item
|
|
104
|
+
* @returns {Promise<any>}
|
|
105
|
+
*/
|
|
77
106
|
rerequest(item) {
|
|
78
107
|
return Promise.all([this.getDeferredForRequest(item), this.prepareItem(item)]).then(
|
|
79
108
|
([defer, req]) => {
|
|
@@ -84,6 +113,10 @@ const MetricsBatcher = Batcher.extend({
|
|
|
84
113
|
);
|
|
85
114
|
},
|
|
86
115
|
|
|
116
|
+
/**
|
|
117
|
+
* @param {any} item
|
|
118
|
+
* @returns {Promise<any>}
|
|
119
|
+
*/
|
|
87
120
|
fingerprintRequest(item) {
|
|
88
121
|
item[sym] = item[sym] || {
|
|
89
122
|
nextDelay: 1000,
|
|
@@ -92,6 +125,10 @@ const MetricsBatcher = Batcher.extend({
|
|
|
92
125
|
return Promise.resolve(item[sym]);
|
|
93
126
|
},
|
|
94
127
|
|
|
128
|
+
/**
|
|
129
|
+
* @param {any} item
|
|
130
|
+
* @returns {Promise<any>}
|
|
131
|
+
*/
|
|
95
132
|
fingerprintResponse(item) {
|
|
96
133
|
return Promise.resolve(item[sym]);
|
|
97
134
|
},
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/* eslint-disable class-methods-use-this */
|
|
2
|
-
/* eslint-disable valid-jsdoc */
|
|
3
|
-
|
|
4
1
|
import {uniqueId} from 'lodash';
|
|
5
2
|
import Batcher from '../batcher';
|
|
6
3
|
import {prepareDiagnosticMetricItem} from './call-diagnostic-metrics.util';
|
|
@@ -12,8 +9,8 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
12
9
|
|
|
13
10
|
/**
|
|
14
11
|
* Prepare item
|
|
15
|
-
* @param item
|
|
16
|
-
* @returns
|
|
12
|
+
* @param {any} item
|
|
13
|
+
* @returns {Promise<any>}
|
|
17
14
|
*/
|
|
18
15
|
prepareItem(item) {
|
|
19
16
|
return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));
|
|
@@ -21,8 +18,8 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
21
18
|
|
|
22
19
|
/**
|
|
23
20
|
* Prepare request, add time sensitive date etc.
|
|
24
|
-
* @param queue
|
|
25
|
-
* @returns
|
|
21
|
+
* @param {any[]} queue
|
|
22
|
+
* @returns {Promise<any[]>}
|
|
26
23
|
*/
|
|
27
24
|
prepareRequest(queue) {
|
|
28
25
|
// Add sent timestamp
|
|
@@ -36,8 +33,8 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
36
33
|
|
|
37
34
|
/**
|
|
38
35
|
*
|
|
39
|
-
* @param payload
|
|
40
|
-
* @returns
|
|
36
|
+
* @param {any} payload
|
|
37
|
+
* @returns {Promise<any>}
|
|
41
38
|
*/
|
|
42
39
|
submitHttpRequest(payload) {
|
|
43
40
|
const batchId = uniqueId('ca-batch-');
|
|
@@ -41,6 +41,8 @@ import {
|
|
|
41
41
|
ClientSubServiceType,
|
|
42
42
|
} from '../metrics.types';
|
|
43
43
|
import CallDiagnosticEventsBatcher from './call-diagnostic-metrics-batcher';
|
|
44
|
+
import PreLoginMetricsBatcher from '../prelogin-metrics-batcher';
|
|
45
|
+
|
|
44
46
|
import {
|
|
45
47
|
CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD,
|
|
46
48
|
CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND,
|
|
@@ -56,8 +58,6 @@ import {
|
|
|
56
58
|
SDP_OFFER_CREATION_ERROR_MAP,
|
|
57
59
|
} from './config';
|
|
58
60
|
|
|
59
|
-
import {generateCommonErrorMetadata} from '../utils';
|
|
60
|
-
|
|
61
61
|
const {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
|
|
62
62
|
|
|
63
63
|
type GetOriginOptions = {
|
|
@@ -86,6 +86,9 @@ type GetIdentifiersOptions = {
|
|
|
86
86
|
export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
87
87
|
// @ts-ignore
|
|
88
88
|
private callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher;
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
private preLoginMetricsBatcher: PreLoginMetricsBatcher;
|
|
91
|
+
|
|
89
92
|
private logger: any; // to avoid adding @ts-ignore everywhere
|
|
90
93
|
private hasLoggedBrowserSerial: boolean;
|
|
91
94
|
// the default validator before piping an event to the batcher
|
|
@@ -106,6 +109,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
106
109
|
this.logger = this.webex.logger;
|
|
107
110
|
// @ts-ignore
|
|
108
111
|
this.callDiagnosticEventsBatcher = new CallDiagnosticEventsBatcher({}, {parent: this.webex});
|
|
112
|
+
// @ts-ignore
|
|
113
|
+
this.preLoginMetricsBatcher = new PreLoginMetricsBatcher({}, {parent: this.webex});
|
|
109
114
|
}
|
|
110
115
|
|
|
111
116
|
/**
|
|
@@ -807,24 +812,20 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
807
812
|
}
|
|
808
813
|
|
|
809
814
|
/**
|
|
810
|
-
*
|
|
815
|
+
* Prepare the event and send the request to metrics-a service, pre login.
|
|
811
816
|
* @param event
|
|
812
817
|
* @param preLoginId
|
|
813
818
|
* @returns
|
|
814
819
|
*/
|
|
815
|
-
|
|
820
|
+
submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {
|
|
816
821
|
// build metrics-a event type
|
|
817
|
-
|
|
818
|
-
const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {
|
|
822
|
+
const finalEvent = {
|
|
819
823
|
eventPayload: event,
|
|
820
824
|
type: ['diagnostic-event'],
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
// append sent timestamp
|
|
824
|
-
diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();
|
|
825
|
+
};
|
|
826
|
+
this.preLoginMetricsBatcher.savePreLoginId(preLoginId);
|
|
825
827
|
|
|
826
|
-
|
|
827
|
-
return this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);
|
|
828
|
+
return this.preLoginMetricsBatcher.request(finalEvent);
|
|
828
829
|
};
|
|
829
830
|
|
|
830
831
|
/**
|
package/src/index.ts
CHANGED
|
@@ -21,6 +21,8 @@ import {
|
|
|
21
21
|
} from './metrics.types';
|
|
22
22
|
import * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';
|
|
23
23
|
import * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';
|
|
24
|
+
import CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';
|
|
25
|
+
import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
|
|
24
26
|
|
|
25
27
|
registerInternalPlugin('metrics', Metrics, {
|
|
26
28
|
config,
|
|
@@ -31,7 +33,16 @@ registerInternalPlugin('newMetrics', NewMetrics, {
|
|
|
31
33
|
});
|
|
32
34
|
|
|
33
35
|
export {default, getOSNameInternal} from './metrics';
|
|
34
|
-
|
|
36
|
+
|
|
37
|
+
export {
|
|
38
|
+
config,
|
|
39
|
+
CALL_DIAGNOSTIC_CONFIG,
|
|
40
|
+
NewMetrics,
|
|
41
|
+
Utils,
|
|
42
|
+
CallDiagnosticUtils,
|
|
43
|
+
CallDiagnosticLatencies,
|
|
44
|
+
CallDiagnosticMetrics,
|
|
45
|
+
};
|
|
35
46
|
export type {
|
|
36
47
|
ClientEvent,
|
|
37
48
|
ClientEventLeaveReason,
|
package/src/new-metrics.ts
CHANGED
|
@@ -177,45 +177,6 @@ class Metrics extends WebexPlugin {
|
|
|
177
177
|
return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
/**
|
|
181
|
-
* Submit a pre-login metric to clientmetrics
|
|
182
|
-
* @public
|
|
183
|
-
* @param payload
|
|
184
|
-
* @param preLoginId - pre-login ID of user
|
|
185
|
-
* @returns
|
|
186
|
-
*/
|
|
187
|
-
public postPreLoginMetric(payload: any, preLoginId: string): Promise<any> {
|
|
188
|
-
// @ts-ignore
|
|
189
|
-
return this.webex
|
|
190
|
-
.request({
|
|
191
|
-
method: 'POST',
|
|
192
|
-
api: 'metrics',
|
|
193
|
-
resource: 'clientmetrics-prelogin',
|
|
194
|
-
headers: {
|
|
195
|
-
authorization: false,
|
|
196
|
-
'x-prelogin-userid': preLoginId,
|
|
197
|
-
},
|
|
198
|
-
body: {
|
|
199
|
-
metrics: [payload],
|
|
200
|
-
},
|
|
201
|
-
})
|
|
202
|
-
.then((res) => {
|
|
203
|
-
// @ts-ignore
|
|
204
|
-
this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful.`);
|
|
205
|
-
|
|
206
|
-
return res;
|
|
207
|
-
})
|
|
208
|
-
.catch((err) => {
|
|
209
|
-
// @ts-ignore
|
|
210
|
-
this.logger.error(
|
|
211
|
-
`NewMetrics: @postPreLoginMetric. Request failed:`,
|
|
212
|
-
`err: ${generateCommonErrorMetadata(err)}`
|
|
213
|
-
);
|
|
214
|
-
|
|
215
|
-
return Promise.reject(err);
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
180
|
/**
|
|
220
181
|
* Issue request to alias a user's pre-login ID with their CI UUID
|
|
221
182
|
* @param {string} preLoginId
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {uniqueId} from 'lodash';
|
|
2
|
+
import Batcher from './batcher';
|
|
3
|
+
import {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';
|
|
4
|
+
import {generateCommonErrorMetadata} from './utils';
|
|
5
|
+
|
|
6
|
+
const PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';
|
|
7
|
+
|
|
8
|
+
const PreLoginMetricsBatcher = Batcher.extend({
|
|
9
|
+
namespace: 'Metrics',
|
|
10
|
+
preLoginId: undefined,
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Save the pre-login ID.
|
|
14
|
+
* @param {string} preLoginId The pre-login ID to be saved.
|
|
15
|
+
* @returns {void}
|
|
16
|
+
*/
|
|
17
|
+
savePreLoginId(preLoginId) {
|
|
18
|
+
this.preLoginId = preLoginId;
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Prepare item
|
|
23
|
+
* @param {any} item
|
|
24
|
+
* @returns {Promise<any>}
|
|
25
|
+
*/
|
|
26
|
+
prepareItem(item) {
|
|
27
|
+
return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Prepare request, add time sensitive date etc.
|
|
32
|
+
* @param {any[]} queue
|
|
33
|
+
* @returns {Promise<any[]>}
|
|
34
|
+
*/
|
|
35
|
+
prepareRequest(queue) {
|
|
36
|
+
// Add sent timestamp
|
|
37
|
+
queue.forEach((item) => {
|
|
38
|
+
item.eventPayload.originTime = item.eventPayload.originTime || {};
|
|
39
|
+
item.eventPayload.originTime.sent = new Date().toISOString();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return Promise.resolve(queue);
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
* @param {any} payload
|
|
48
|
+
* @returns {Promise<any>}
|
|
49
|
+
*/
|
|
50
|
+
submitHttpRequest(payload: any) {
|
|
51
|
+
const batchId = uniqueId('prelogin-ca-batch-');
|
|
52
|
+
if (this.preLoginId === undefined) {
|
|
53
|
+
this.webex.logger.error(
|
|
54
|
+
PRE_LOGIN_METRICS_IDENTIFIER,
|
|
55
|
+
`PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
return Promise.reject(new Error('PreLoginId is not set.'));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return this.webex
|
|
62
|
+
.request({
|
|
63
|
+
method: 'POST',
|
|
64
|
+
service: 'metrics',
|
|
65
|
+
resource: 'clientmetrics-prelogin',
|
|
66
|
+
headers: {
|
|
67
|
+
authorization: false,
|
|
68
|
+
'x-prelogin-userid': this.preLoginId,
|
|
69
|
+
},
|
|
70
|
+
body: {
|
|
71
|
+
metrics: payload,
|
|
72
|
+
},
|
|
73
|
+
waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,
|
|
74
|
+
})
|
|
75
|
+
.then((res) => {
|
|
76
|
+
this.webex.logger.log(
|
|
77
|
+
PRE_LOGIN_METRICS_IDENTIFIER,
|
|
78
|
+
`PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return res;
|
|
82
|
+
})
|
|
83
|
+
.catch((err) => {
|
|
84
|
+
this.webex.logger.error(
|
|
85
|
+
PRE_LOGIN_METRICS_IDENTIFIER,
|
|
86
|
+
`PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,
|
|
87
|
+
`error: ${generateCommonErrorMetadata(err)}`
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
return Promise.reject(err);
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export default PreLoginMetricsBatcher;
|