@webex/internal-plugin-metrics 3.0.0-beta.420 → 3.0.0-beta.422
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/client-metrics-prelogin-batcher.js +33 -0
- package/dist/client-metrics-prelogin-batcher.js.map +1 -0
- package/dist/metrics.js +6 -25
- package/dist/metrics.js.map +1 -1
- package/dist/prelogin-metrics-batcher.js +1 -1
- package/dist/prelogin-metrics-batcher.js.map +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +2 -2
- package/dist/types/client-metrics-prelogin-batcher.d.ts +2 -0
- package/package.json +7 -7
- package/src/client-metrics-prelogin-batcher.ts +26 -0
- package/src/metrics.js +5 -23
- package/src/prelogin-metrics-batcher.ts +1 -1
- package/test/unit/spec/client-metrics-prelogin-batcher.ts +54 -0
- package/test/unit/spec/metrics.js +1 -31
- package/test/unit/spec/prelogin-metrics-batcher.ts +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
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 _preloginMetricsBatcher = _interopRequireDefault(require("./prelogin-metrics-batcher"));
|
|
11
|
+
var ClientMetricsPreloginBatcher = _preloginMetricsBatcher.default.extend({
|
|
12
|
+
namespace: 'Metrics',
|
|
13
|
+
/**
|
|
14
|
+
* Prepare item
|
|
15
|
+
* @param {any} item
|
|
16
|
+
* @returns {Promise<any>}
|
|
17
|
+
*/
|
|
18
|
+
prepareItem: function prepareItem(item) {
|
|
19
|
+
// Add more defaults to payload when the clientmetrics endpoint evolves to support richer payloads
|
|
20
|
+
return _promise.default.resolve(item);
|
|
21
|
+
},
|
|
22
|
+
/**
|
|
23
|
+
* Prepare request, add time sensitive date etc.
|
|
24
|
+
* @param {any[]} queue
|
|
25
|
+
* @returns {Promise<any[]>}
|
|
26
|
+
*/
|
|
27
|
+
prepareRequest: function prepareRequest(queue) {
|
|
28
|
+
return _promise.default.resolve(queue);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
var _default = ClientMetricsPreloginBatcher;
|
|
32
|
+
exports.default = _default;
|
|
33
|
+
//# sourceMappingURL=client-metrics-prelogin-batcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ClientMetricsPreloginBatcher","PreLoginMetricsBatcher","extend","namespace","prepareItem","item","resolve","prepareRequest","queue"],"sources":["client-metrics-prelogin-batcher.ts"],"sourcesContent":["import PreLoginMetricsBatcher from './prelogin-metrics-batcher';\n\nconst ClientMetricsPreloginBatcher = PreLoginMetricsBatcher.extend({\n namespace: 'Metrics',\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n // Add more defaults to payload when the clientmetrics endpoint evolves to support richer payloads\n return Promise.resolve(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 return Promise.resolve(queue);\n },\n});\n\nexport default ClientMetricsPreloginBatcher;\n"],"mappings":";;;;;;;;;AAAA;AAEA,IAAMA,4BAA4B,GAAGC,+BAAsB,CAACC,MAAM,CAAC;EACjEC,SAAS,EAAE,SAAS;EAEpB;AACF;AACA;AACA;AACA;EACEC,WAAW,uBAACC,IAAI,EAAE;IAChB;IACA,OAAO,iBAAQC,OAAO,CAACD,IAAI,CAAC;EAC9B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,cAAc,0BAACC,KAAK,EAAE;IACpB,OAAO,iBAAQF,OAAO,CAACE,KAAK,CAAC;EAC/B;AACF,CAAC,CAAC;AAAC,eAEYR,4BAA4B;AAAA"}
|
package/dist/metrics.js
CHANGED
|
@@ -18,6 +18,7 @@ var _common = require("@webex/common");
|
|
|
18
18
|
var _config = require("./config");
|
|
19
19
|
var _batcher = _interopRequireDefault(require("./batcher"));
|
|
20
20
|
var _clientMetricsBatcher = _interopRequireDefault(require("./client-metrics-batcher"));
|
|
21
|
+
var _clientMetricsPreloginBatcher = _interopRequireDefault(require("./client-metrics-prelogin-batcher"));
|
|
21
22
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
22
23
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
23
24
|
var _BrowserDetection = (0, _common.BrowserDetection)(),
|
|
@@ -47,7 +48,8 @@ function getSparkUserAgent(webex) {
|
|
|
47
48
|
var Metrics = _webexCore.WebexPlugin.extend({
|
|
48
49
|
children: {
|
|
49
50
|
batcher: _batcher.default,
|
|
50
|
-
clientMetricsBatcher: _clientMetricsBatcher.default
|
|
51
|
+
clientMetricsBatcher: _clientMetricsBatcher.default,
|
|
52
|
+
clientMetricsPreloginBatcher: _clientMetricsPreloginBatcher.default
|
|
51
53
|
},
|
|
52
54
|
namespace: 'Metrics',
|
|
53
55
|
submit: function submit(key, value) {
|
|
@@ -120,14 +122,8 @@ var Metrics = _webexCore.WebexPlugin.extend({
|
|
|
120
122
|
var preLoginId = arguments.length > 2 ? arguments[2] : undefined;
|
|
121
123
|
var payload = this.getClientMetricsPayload(eventName, props);
|
|
122
124
|
if (preLoginId) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
// Do not batch these because pre-login events occur during onboarding, so we will be partially blind
|
|
128
|
-
// to users' progress through the reg flow if we wait to persist pre-login metrics for people who drop off because
|
|
129
|
-
// their metrics will not post from a queue flush in time
|
|
130
|
-
return this.postPreLoginMetric(_payload, preLoginId);
|
|
125
|
+
this.clientMetricsPreloginBatcher.savePreLoginId(preLoginId);
|
|
126
|
+
return this.clientMetricsPreloginBatcher.request(payload);
|
|
131
127
|
}
|
|
132
128
|
return this.clientMetricsBatcher.request(payload);
|
|
133
129
|
},
|
|
@@ -150,22 +146,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
|
|
|
150
146
|
}
|
|
151
147
|
});
|
|
152
148
|
},
|
|
153
|
-
|
|
154
|
-
var _this = this;
|
|
155
|
-
return this.webex.credentials.getClientToken().then(function (token) {
|
|
156
|
-
return _this.request({
|
|
157
|
-
method: 'POST',
|
|
158
|
-
api: 'metrics',
|
|
159
|
-
resource: 'clientmetrics-prelogin',
|
|
160
|
-
headers: {
|
|
161
|
-
authorization: token.toString(),
|
|
162
|
-
'x-prelogin-userid': preLoginId
|
|
163
|
-
},
|
|
164
|
-
body: payload
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
},
|
|
168
|
-
version: "3.0.0-beta.420"
|
|
149
|
+
version: "3.0.0-beta.422"
|
|
169
150
|
});
|
|
170
151
|
var _default = Metrics;
|
|
171
152
|
exports.default = _default;
|
package/dist/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","getOSNameInternal","OSMap","OS_NAME","OTHERS","getSparkUserAgent","webex","config","appName","appVersion","appPlatform","sparkUserAgent","CLIENT_NAME","Metrics","WebexPlugin","extend","children","batcher","Batcher","clientMetricsBatcher","ClientMetricsBatcher","namespace","submit","key","value","request","getClientMetricsPayload","eventName","props","Error","payload","metricName","providedClientVersion","meetings","metrics","clientVersion","tags","browser","os","domain","window","location","hostname","fields","browser_version","os_version","sdk_version","version","platform","spark_user_agent","client_id","credentials","type","context","app","locale","name","eventPayload","timestamp","Date","valueOf","submitClientMetrics","preLoginId","
|
|
1
|
+
{"version":3,"names":["BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","getOSNameInternal","OSMap","OS_NAME","OTHERS","getSparkUserAgent","webex","config","appName","appVersion","appPlatform","sparkUserAgent","CLIENT_NAME","Metrics","WebexPlugin","extend","children","batcher","Batcher","clientMetricsBatcher","ClientMetricsBatcher","clientMetricsPreloginBatcher","ClientMetricsPreloginBatcher","namespace","submit","key","value","request","getClientMetricsPayload","eventName","props","Error","payload","metricName","providedClientVersion","meetings","metrics","clientVersion","tags","browser","os","domain","window","location","hostname","fields","browser_version","os_version","sdk_version","version","platform","spark_user_agent","client_id","credentials","type","context","app","locale","name","eventPayload","timestamp","Date","valueOf","submitClientMetrics","preLoginId","savePreLoginId","aliasUser","method","api","resource","headers","body","qs","alias"],"sources":["metrics.js"],"sourcesContent":["/* eslint-disable default-param-last */\n\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {BrowserDetection} from '@webex/common';\nimport {OS_NAME, OSMap, CLIENT_NAME} from './config';\n\nimport Batcher from './batcher';\nimport ClientMetricsBatcher from './client-metrics-batcher';\nimport ClientMetricsPreloginBatcher from './client-metrics-prelogin-batcher';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport function getOSNameInternal() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n}\n\nfunction getSparkUserAgent(webex) {\n const {appName, appVersion, appPlatform} = webex?.config ?? {};\n\n let sparkUserAgent = CLIENT_NAME;\n\n if (appName) {\n sparkUserAgent += ` ${appName}/${appVersion ?? '0.0'}`;\n }\n\n if (appPlatform) {\n sparkUserAgent += ` ${appPlatform}`;\n }\n\n return sparkUserAgent;\n}\n\nconst Metrics = WebexPlugin.extend({\n children: {\n batcher: Batcher,\n clientMetricsBatcher: ClientMetricsBatcher,\n clientMetricsPreloginBatcher: ClientMetricsPreloginBatcher,\n },\n\n namespace: 'Metrics',\n\n submit(key, value) {\n return this.batcher.request({key, ...value});\n },\n\n /**\n * Returns the payload for submitting client metrics.\n * @param {string} eventName\n * @param {any} props\n * @returns {any} - the payload\n */\n getClientMetricsPayload(eventName, props) {\n if (!eventName) {\n throw Error('Missing behavioral metric name. Please provide one');\n }\n const payload = {metricName: eventName};\n // @ts-ignore\n const providedClientVersion = this.webex.meetings?.config?.metrics?.clientVersion;\n\n payload.tags = {\n ...props.tags,\n browser: getBrowserName(),\n os: getOSNameInternal(),\n appVersion: providedClientVersion,\n\n // Node does not like this so we need to check if it exists or not\n // eslint-disable-next-line no-undef\n domain:\n typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser', // Check what else we could measure\n };\n\n payload.fields = {\n ...props.fields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version,\n platform: 'Web',\n spark_user_agent: getSparkUserAgent(this.webex),\n client_id: this.webex.credentials.config.client_id,\n };\n\n payload.type = props.type || this.webex.config.metrics.type;\n\n payload.context = {\n ...props.context,\n app: {\n version: this.webex.version,\n },\n locale: 'en-US',\n os: {\n name: getOSNameInternal(),\n version: getOSVersion(),\n },\n };\n\n if (props.eventPayload) {\n payload.eventPayload = props.eventPayload;\n }\n\n // Mocking the time in tests when running in node\n // is impossible so unable to use Date.now()\n payload.timestamp = new Date().valueOf();\n\n return payload;\n },\n\n /**\n * This corresponds to #sendSemiStructured() in the deprecated metrics handler\n * @param {string} eventName\n * @param {Object} props\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n submitClientMetrics(eventName, props = {}, preLoginId) {\n const payload = this.getClientMetricsPayload(eventName, props);\n\n if (preLoginId) {\n this.clientMetricsPreloginBatcher.savePreLoginId(preLoginId);\n\n return this.clientMetricsPreloginBatcher.request(payload);\n }\n\n return this.clientMetricsBatcher.request(payload);\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 aliasUser(preLoginId) {\n return this.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 },\n});\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
@@ -51,7 +51,7 @@ var PreLoginMetricsBatcher = _batcher.default.extend({
|
|
|
51
51
|
*/
|
|
52
52
|
submitHttpRequest: function submitHttpRequest(payload) {
|
|
53
53
|
var _this = this;
|
|
54
|
-
var batchId = (0, _uniqueId2.default)('prelogin-
|
|
54
|
+
var batchId = (0, _uniqueId2.default)('prelogin-batch-');
|
|
55
55
|
if (this.preLoginId === undefined) {
|
|
56
56
|
this.webex.logger.error(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". PreLoginId is not set."));
|
|
57
57
|
return _promise.default.reject(new Error('PreLoginId is not set.'));
|
|
@@ -1 +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-
|
|
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-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,iBAAiB,CAAC;IAC3C,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"}
|
|
@@ -76,7 +76,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
76
76
|
environment?: string;
|
|
77
77
|
newEnvironment?: string;
|
|
78
78
|
clientInfo?: {
|
|
79
|
-
os?: "
|
|
79
|
+
os?: "other" | "chrome" | "windows" | "mac" | "ios" | "android" | "linux" | "android-x64" | "android-arm64" | "uwp-arm64";
|
|
80
80
|
osVersion?: string;
|
|
81
81
|
localIP?: string;
|
|
82
82
|
gatewayIP?: string;
|
|
@@ -335,7 +335,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
335
335
|
*/
|
|
336
336
|
generateClientEventErrorPayload(rawError: any): {
|
|
337
337
|
fatal: boolean;
|
|
338
|
-
category: "
|
|
338
|
+
category: "signaling" | "media" | "network" | "other" | "expected";
|
|
339
339
|
errorDescription?: string;
|
|
340
340
|
errorCode?: number;
|
|
341
341
|
errorCodeStr?: string;
|
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.422",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,13 +28,13 @@
|
|
|
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.422",
|
|
32
|
+
"@webex/common-timers": "3.0.0-beta.422",
|
|
33
33
|
"@webex/event-dictionary-ts": "^1.0.1406",
|
|
34
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
35
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
37
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
34
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.422",
|
|
35
|
+
"@webex/test-helper-chai": "3.0.0-beta.422",
|
|
36
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.422",
|
|
37
|
+
"@webex/webex-core": "3.0.0-beta.422",
|
|
38
38
|
"ip-anonymize": "^0.1.0",
|
|
39
39
|
"lodash": "^4.17.21",
|
|
40
40
|
"uuid": "^3.3.2"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import PreLoginMetricsBatcher from './prelogin-metrics-batcher';
|
|
2
|
+
|
|
3
|
+
const ClientMetricsPreloginBatcher = PreLoginMetricsBatcher.extend({
|
|
4
|
+
namespace: 'Metrics',
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Prepare item
|
|
8
|
+
* @param {any} item
|
|
9
|
+
* @returns {Promise<any>}
|
|
10
|
+
*/
|
|
11
|
+
prepareItem(item) {
|
|
12
|
+
// Add more defaults to payload when the clientmetrics endpoint evolves to support richer payloads
|
|
13
|
+
return Promise.resolve(item);
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Prepare request, add time sensitive date etc.
|
|
18
|
+
* @param {any[]} queue
|
|
19
|
+
* @returns {Promise<any[]>}
|
|
20
|
+
*/
|
|
21
|
+
prepareRequest(queue) {
|
|
22
|
+
return Promise.resolve(queue);
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export default ClientMetricsPreloginBatcher;
|
package/src/metrics.js
CHANGED
|
@@ -10,6 +10,7 @@ import {OS_NAME, OSMap, CLIENT_NAME} from './config';
|
|
|
10
10
|
|
|
11
11
|
import Batcher from './batcher';
|
|
12
12
|
import ClientMetricsBatcher from './client-metrics-batcher';
|
|
13
|
+
import ClientMetricsPreloginBatcher from './client-metrics-prelogin-batcher';
|
|
13
14
|
|
|
14
15
|
const {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
|
|
15
16
|
|
|
@@ -37,6 +38,7 @@ const Metrics = WebexPlugin.extend({
|
|
|
37
38
|
children: {
|
|
38
39
|
batcher: Batcher,
|
|
39
40
|
clientMetricsBatcher: ClientMetricsBatcher,
|
|
41
|
+
clientMetricsPreloginBatcher: ClientMetricsPreloginBatcher,
|
|
40
42
|
},
|
|
41
43
|
|
|
42
44
|
namespace: 'Metrics',
|
|
@@ -117,14 +119,9 @@ const Metrics = WebexPlugin.extend({
|
|
|
117
119
|
const payload = this.getClientMetricsPayload(eventName, props);
|
|
118
120
|
|
|
119
121
|
if (preLoginId) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
// Do not batch these because pre-login events occur during onboarding, so we will be partially blind
|
|
125
|
-
// to users' progress through the reg flow if we wait to persist pre-login metrics for people who drop off because
|
|
126
|
-
// their metrics will not post from a queue flush in time
|
|
127
|
-
return this.postPreLoginMetric(_payload, preLoginId);
|
|
122
|
+
this.clientMetricsPreloginBatcher.savePreLoginId(preLoginId);
|
|
123
|
+
|
|
124
|
+
return this.clientMetricsPreloginBatcher.request(payload);
|
|
128
125
|
}
|
|
129
126
|
|
|
130
127
|
return this.clientMetricsBatcher.request(payload);
|
|
@@ -149,21 +146,6 @@ const Metrics = WebexPlugin.extend({
|
|
|
149
146
|
},
|
|
150
147
|
});
|
|
151
148
|
},
|
|
152
|
-
|
|
153
|
-
postPreLoginMetric(payload, preLoginId) {
|
|
154
|
-
return this.webex.credentials.getClientToken().then((token) =>
|
|
155
|
-
this.request({
|
|
156
|
-
method: 'POST',
|
|
157
|
-
api: 'metrics',
|
|
158
|
-
resource: 'clientmetrics-prelogin',
|
|
159
|
-
headers: {
|
|
160
|
-
authorization: token.toString(),
|
|
161
|
-
'x-prelogin-userid': preLoginId,
|
|
162
|
-
},
|
|
163
|
-
body: payload,
|
|
164
|
-
})
|
|
165
|
-
);
|
|
166
|
-
},
|
|
167
149
|
});
|
|
168
150
|
|
|
169
151
|
export default Metrics;
|
|
@@ -48,7 +48,7 @@ const PreLoginMetricsBatcher = Batcher.extend({
|
|
|
48
48
|
* @returns {Promise<any>}
|
|
49
49
|
*/
|
|
50
50
|
submitHttpRequest(payload: any) {
|
|
51
|
-
const batchId = uniqueId('prelogin-
|
|
51
|
+
const batchId = uniqueId('prelogin-batch-');
|
|
52
52
|
if (this.preLoginId === undefined) {
|
|
53
53
|
this.webex.logger.error(
|
|
54
54
|
PRE_LOGIN_METRICS_IDENTIFIER,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {assert} from '@webex/test-helper-chai';
|
|
6
|
+
import MockWebex from '@webex/test-helper-mock-webex';
|
|
7
|
+
import sinon from 'sinon';
|
|
8
|
+
import Metrics from '@webex/internal-plugin-metrics';
|
|
9
|
+
import PreLoginMetricsBatcher from '@webex/internal-plugin-metrics';
|
|
10
|
+
import ClientMetricsPreloginBatcher from '@webex/internal-plugin-metrics';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
describe('internal-plugin-metrics', () => {
|
|
14
|
+
describe('ClientMetricsPreloginBatcher', () => {
|
|
15
|
+
let webex;
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
//@ts-ignore
|
|
19
|
+
webex = new MockWebex({
|
|
20
|
+
children: {
|
|
21
|
+
metrics: Metrics,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
webex.request = (options) =>
|
|
26
|
+
Promise.resolve({body: {items: []}, waitForServiceTimeout: 15, options});
|
|
27
|
+
|
|
28
|
+
sinon.spy(webex, 'request');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
sinon.restore();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should be an instance of PreLoginMetricsBatcher', () => {
|
|
36
|
+
const clientMetricsPreloginBatcher = new ClientMetricsPreloginBatcher();
|
|
37
|
+
assert.instanceOf(clientMetricsPreloginBatcher, PreLoginMetricsBatcher);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
it('checks prepareItem', async () => {
|
|
42
|
+
const testItem = {id: 1};
|
|
43
|
+
const resultPromise = await webex.internal.metrics.clientMetricsPreloginBatcher.prepareItem(testItem);
|
|
44
|
+
assert.strictEqual(resultPromise, testItem);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('checks prepareRequest', async () => {
|
|
48
|
+
const testQueue = [];
|
|
49
|
+
|
|
50
|
+
const resultPromise = await webex.internal.metrics.clientMetricsPreloginBatcher.prepareRequest(testQueue);
|
|
51
|
+
assert.strictEqual(resultPromise, testQueue);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -113,7 +113,6 @@ describe('plugin-metrics', () => {
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
sinon.spy(webex, 'request');
|
|
116
|
-
sinon.spy(metrics, 'postPreLoginMetric');
|
|
117
116
|
sinon.spy(metrics, 'aliasUser');
|
|
118
117
|
});
|
|
119
118
|
|
|
@@ -207,7 +206,7 @@ describe('plugin-metrics', () => {
|
|
|
207
206
|
|
|
208
207
|
describe('#submitClientMetrics()', () => {
|
|
209
208
|
describe('before login', () => {
|
|
210
|
-
it('
|
|
209
|
+
it('clientMetricsPreloginBatcher pre-login metric', () => {
|
|
211
210
|
const date = clock.now;
|
|
212
211
|
const promise = metrics.submitClientMetrics(eventName, mockPayload, preLoginId);
|
|
213
212
|
|
|
@@ -215,8 +214,6 @@ describe('plugin-metrics', () => {
|
|
|
215
214
|
.then(() => clock.tick(config.metrics.batcherWait))
|
|
216
215
|
.then(() => promise)
|
|
217
216
|
.then(() => {
|
|
218
|
-
assert.called(metrics.postPreLoginMetric);
|
|
219
|
-
assert.calledOnce(webex.credentials.getClientToken);
|
|
220
217
|
assert.calledOnce(webex.request);
|
|
221
218
|
const req = webex.request.args[0][0];
|
|
222
219
|
const metric = req.body.metrics[0];
|
|
@@ -304,33 +301,6 @@ describe('plugin-metrics', () => {
|
|
|
304
301
|
});
|
|
305
302
|
});
|
|
306
303
|
|
|
307
|
-
describe('#postPreLoginMetric()', () => {
|
|
308
|
-
it('returns an HttpResponse object', () => {
|
|
309
|
-
const promise = metrics.postPreLoginMetric(preLoginProps, preLoginId);
|
|
310
|
-
|
|
311
|
-
return promiseTick(50)
|
|
312
|
-
.then(() => clock.tick(config.metrics.batcherWait))
|
|
313
|
-
.then(() => promise)
|
|
314
|
-
.then(() => {
|
|
315
|
-
assert.calledOnce(webex.request);
|
|
316
|
-
const req = webex.request.args[0][0];
|
|
317
|
-
const metric = req.body.metrics[0];
|
|
318
|
-
const {headers} = req;
|
|
319
|
-
|
|
320
|
-
assert.property(headers, 'x-prelogin-userid');
|
|
321
|
-
assert.property(metric, 'metricName');
|
|
322
|
-
assert.property(metric, 'tags');
|
|
323
|
-
assert.property(metric, 'fields');
|
|
324
|
-
assert.property(metric, 'timestamp');
|
|
325
|
-
|
|
326
|
-
assert.equal(metric.timestamp, transformedProps.timestamp);
|
|
327
|
-
assert.equal(metric.metricName, eventName);
|
|
328
|
-
assert.equal(metric.tags.testTag, 'tag value');
|
|
329
|
-
assert.equal(metric.fields.testField, 123);
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
|
|
334
304
|
describe('#aliasUser()', () => {
|
|
335
305
|
it('returns an HttpResponse object', () =>
|
|
336
306
|
metrics.aliasUser(preLoginId).then(() => {
|
|
@@ -140,7 +140,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
140
140
|
assert.calledOnceWithExactly(
|
|
141
141
|
webex.logger.error,
|
|
142
142
|
'Pre Login Metrics -->',
|
|
143
|
-
`PreLoginMetricsBatcher: @submitHttpRequest#prelogin-
|
|
143
|
+
`PreLoginMetricsBatcher: @submitHttpRequest#prelogin-batch-${expectedBatchId}. Request failed:`,
|
|
144
144
|
`error: formattedError`
|
|
145
145
|
);
|
|
146
146
|
assert.lengthOf(
|