@webex/internal-plugin-metrics 3.0.0-beta.229 → 3.0.0-beta.230
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/call-diagnostic/call-diagnostic-metrics-batcher.js +5 -3
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +12 -11
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/new-metrics.js +6 -4
- package/dist/new-metrics.js.map +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +4 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/metrics.types.d.ts +1 -1
- package/dist/types/utils.d.ts +6 -0
- package/dist/utils.js +27 -0
- package/dist/utils.js.map +1 -0
- package/package.json +8 -8
- package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +4 -3
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +1 -1
- package/src/call-diagnostic/call-diagnostic-metrics.ts +17 -16
- package/src/index.ts +2 -1
- package/src/metrics.types.ts +0 -1
- package/src/new-metrics.ts +17 -4
- package/src/utils.ts +17 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +119 -11
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1 -1
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +134 -0
- package/test/unit/spec/new-metrics.ts +56 -7
- package/test/unit/spec/utils.ts +22 -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","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","authorization","body","then","res","logger","log","catch","err","error","reject","qs","alias","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","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';\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 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: payload,\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful:`, res);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(`NewMetrics: @postPreLoginMetric. Request failed:`, err);\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:`, res);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(`NewMetrics: @clientMetricsAliasUser. Request failed:`, err);\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\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","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","authorization","body","then","res","logger","log","catch","err","error","generateCommonErrorMetadata","reject","qs","alias","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","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 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: payload,\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @postPreLoginMetric. Request successful:`,\n `res: ${JSON.stringify(res)}`\n );\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(\n `NewMetrics: @clientMetricsAliasUser. Request successful:`,\n `res: ${JSON.stringify(res)}`\n );\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\nexport default Metrics;\n"],"mappings":"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"}
|
|
@@ -68,7 +68,10 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
68
68
|
clientLaunchMethod?: "url-handler" | "universal-link" | "voice-command" | "notification" | "manual" | "teams-cross-launch" | "mc-cross-launch";
|
|
69
69
|
browser?: string;
|
|
70
70
|
browserVersion?: string;
|
|
71
|
-
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";
|
|
71
|
+
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"; /**
|
|
72
|
+
* Returns if the meeting has converged architecture enabled
|
|
73
|
+
* @param options.meetingId
|
|
74
|
+
*/
|
|
72
75
|
subClientType?: "DESKTOP_APP" | "DESKTOP_APP_VDI" | "DEVICE_CURRENT" | "DEVICE_LEGACY_2020" | "HVDI_APP" | "MOBILE_APP" | "VDI_APP" | "WEB_APP" | "MOBILE_NETWORK" | "HOLOGRAM_HEADSET_APP";
|
|
73
76
|
clientVersion?: string;
|
|
74
77
|
localClientVersion?: string;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
import '@webex/internal-plugin-device';
|
|
5
5
|
import config from './config';
|
|
6
6
|
import NewMetrics from './new-metrics';
|
|
7
|
+
import * as Utils from './utils';
|
|
7
8
|
import { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitOperationalEvent, SubmitMQE } from './metrics.types';
|
|
8
9
|
import * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';
|
|
9
10
|
export { default, getOSNameInternal } from './metrics';
|
|
10
|
-
export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics };
|
|
11
|
+
export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils };
|
|
11
12
|
export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, };
|
|
@@ -22,7 +22,7 @@ export type SubmitMQEOptions = {
|
|
|
22
22
|
networkType?: Event['origin']['networkType'];
|
|
23
23
|
};
|
|
24
24
|
export type InternalEvent = {
|
|
25
|
-
name: 'internal.client.meetinginfo.request' | 'internal.client.meetinginfo.response' | 'internal.reset.join.latencies' | 'internal.client.
|
|
25
|
+
name: 'internal.client.meetinginfo.request' | 'internal.client.meetinginfo.response' | 'internal.reset.join.latencies' | 'internal.client.meeting.click.joinbutton' | 'internal.host.meeting.participant.admitted' | 'internal.client.meeting.interstitial-window.showed' | 'internal.client.interstitial-window.click.joinbutton';
|
|
26
26
|
payload?: never;
|
|
27
27
|
options?: never;
|
|
28
28
|
};
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
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.generateCommonErrorMetadata = void 0;
|
|
9
|
+
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
10
|
+
/* eslint-disable import/prefer-default-export */
|
|
11
|
+
/**
|
|
12
|
+
* Generates common metadata for errors
|
|
13
|
+
* @param {any} error
|
|
14
|
+
* @returns {object}
|
|
15
|
+
*/
|
|
16
|
+
var generateCommonErrorMetadata = function generateCommonErrorMetadata(error) {
|
|
17
|
+
if (error instanceof Error) {
|
|
18
|
+
return (0, _stringify.default)({
|
|
19
|
+
message: error === null || error === void 0 ? void 0 : error.message,
|
|
20
|
+
name: error === null || error === void 0 ? void 0 : error.name,
|
|
21
|
+
stack: error === null || error === void 0 ? void 0 : error.stack
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return error;
|
|
25
|
+
};
|
|
26
|
+
exports.generateCommonErrorMetadata = generateCommonErrorMetadata;
|
|
27
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["generateCommonErrorMetadata","error","Error","message","name","stack"],"sources":["utils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n/**\n * Generates common metadata for errors\n * @param {any} error\n * @returns {object}\n */\nexport const generateCommonErrorMetadata = (error) => {\n if (error instanceof Error) {\n return JSON.stringify({\n message: error?.message,\n name: error?.name,\n stack: error?.stack,\n });\n }\n\n return error;\n};\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMA,2BAA2B,GAAG,SAA9BA,2BAA2B,CAAIC,KAAK,EAAK;EACpD,IAAIA,KAAK,YAAYC,KAAK,EAAE;IAC1B,OAAO,wBAAe;MACpBC,OAAO,EAAEF,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,OAAO;MACvBC,IAAI,EAAEH,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEG,IAAI;MACjBC,KAAK,EAAEJ,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEI;IAChB,CAAC,CAAC;EACJ;EAEA,OAAOJ,KAAK;AACd,CAAC;AAAC"}
|
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.230",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@webex/common": "3.0.0-beta.
|
|
33
|
-
"@webex/common-timers": "3.0.0-beta.
|
|
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.
|
|
32
|
+
"@webex/common": "3.0.0-beta.230",
|
|
33
|
+
"@webex/common-timers": "3.0.0-beta.230",
|
|
34
|
+
"@webex/internal-plugin-device": "3.0.0-beta.230",
|
|
35
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.230",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.230",
|
|
37
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.230",
|
|
38
|
+
"@webex/webex-core": "3.0.0-beta.230"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -5,6 +5,7 @@ import {uniqueId} from 'lodash';
|
|
|
5
5
|
import Batcher from '../batcher';
|
|
6
6
|
import {prepareDiagnosticMetricItem} from './call-diagnostic-metrics.util';
|
|
7
7
|
import {CALL_DIAGNOSTIC_LOG_IDENTIFIER} from './config';
|
|
8
|
+
import {generateCommonErrorMetadata} from '../utils';
|
|
8
9
|
|
|
9
10
|
const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
10
11
|
namespace: 'Metrics',
|
|
@@ -43,7 +44,7 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
43
44
|
this.webex.logger.log(
|
|
44
45
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
45
46
|
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Sending the request:`,
|
|
46
|
-
payload
|
|
47
|
+
`payload: ${JSON.stringify(payload)}`
|
|
47
48
|
);
|
|
48
49
|
|
|
49
50
|
return this.webex
|
|
@@ -59,7 +60,7 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
59
60
|
this.webex.logger.log(
|
|
60
61
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
61
62
|
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request successful:`,
|
|
62
|
-
res
|
|
63
|
+
`response: ${JSON.stringify(res)}`
|
|
63
64
|
);
|
|
64
65
|
|
|
65
66
|
return res;
|
|
@@ -68,7 +69,7 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
68
69
|
this.webex.logger.error(
|
|
69
70
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
70
71
|
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request failed:`,
|
|
71
|
-
err
|
|
72
|
+
`error: ${generateCommonErrorMetadata(err)}`
|
|
72
73
|
);
|
|
73
74
|
|
|
74
75
|
return Promise.reject(err);
|
|
@@ -148,7 +148,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
148
148
|
*/
|
|
149
149
|
public getShowInterstitialTime() {
|
|
150
150
|
return this.getDiffBetweenTimestamps(
|
|
151
|
-
'
|
|
151
|
+
'client.interstitial-window.start-launch',
|
|
152
152
|
'internal.client.interstitial-window.click.joinbutton'
|
|
153
153
|
);
|
|
154
154
|
}
|
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,
|
|
48
48
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
49
49
|
} from './config';
|
|
50
|
+
import {generateCommonErrorMetadata} from '../utils';
|
|
50
51
|
|
|
51
52
|
const {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
|
|
52
53
|
|
|
@@ -467,10 +468,10 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
467
468
|
}) {
|
|
468
469
|
this.logger.log(
|
|
469
470
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
470
|
-
'CallDiagnosticMetrics: @
|
|
471
|
-
name
|
|
471
|
+
'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
|
|
472
|
+
`name: ${name}`
|
|
472
473
|
);
|
|
473
|
-
const {meetingId, mediaConnections
|
|
474
|
+
const {meetingId, mediaConnections} = options;
|
|
474
475
|
|
|
475
476
|
// @ts-ignore
|
|
476
477
|
const meeting = this.webex.meetings.meetingCollection.get(meetingId);
|
|
@@ -478,7 +479,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
478
479
|
if (!meeting) {
|
|
479
480
|
console.warn(
|
|
480
481
|
'Attempt to send client event but no meeting was found...',
|
|
481
|
-
`
|
|
482
|
+
`name: ${name}, meetingId: ${meetingId}`
|
|
482
483
|
);
|
|
483
484
|
// @ts-ignore
|
|
484
485
|
this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {
|
|
@@ -535,7 +536,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
535
536
|
this.logger.log(
|
|
536
537
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
537
538
|
'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.',
|
|
538
|
-
name
|
|
539
|
+
`name: ${name}`
|
|
539
540
|
);
|
|
540
541
|
const {correlationId} = options;
|
|
541
542
|
|
|
@@ -587,8 +588,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
587
588
|
this.logger.log(
|
|
588
589
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
589
590
|
'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',
|
|
590
|
-
name
|
|
591
|
-
rawError
|
|
591
|
+
`name: ${name}`,
|
|
592
|
+
`rawError: ${generateCommonErrorMetadata(rawError)}`
|
|
592
593
|
);
|
|
593
594
|
|
|
594
595
|
const generatedError = this.generateClientEventErrorPayload(rawError);
|
|
@@ -598,7 +599,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
598
599
|
this.logger.log(
|
|
599
600
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
600
601
|
'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
|
|
601
|
-
generatedError
|
|
602
|
+
`generatedError: ${JSON.stringify(generatedError)}`
|
|
602
603
|
);
|
|
603
604
|
}
|
|
604
605
|
|
|
@@ -641,9 +642,9 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
641
642
|
this.logger.log(
|
|
642
643
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
643
644
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
644
|
-
name
|
|
645
|
-
payload
|
|
646
|
-
options
|
|
645
|
+
`name: ${name}`,
|
|
646
|
+
`payload: ${JSON.stringify(payload)}`,
|
|
647
|
+
`options: ${JSON.stringify(options)}`
|
|
647
648
|
);
|
|
648
649
|
const diagnosticEvent = this.prepareClientEvent({name, payload, options});
|
|
649
650
|
|
|
@@ -669,7 +670,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
669
670
|
this.logger.log(
|
|
670
671
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
671
672
|
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
672
|
-
finalEvent
|
|
673
|
+
`finalEvent: ${JSON.stringify(finalEvent)}`
|
|
673
674
|
);
|
|
674
675
|
|
|
675
676
|
return this.callDiagnosticEventsBatcher.request(finalEvent);
|
|
@@ -695,7 +696,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
695
696
|
this.logger.log(
|
|
696
697
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
697
698
|
`CallDiagnosticMetrics: @submitToCallDiagnosticsPreLogin. Sending the request:`,
|
|
698
|
-
diagnosticEvent
|
|
699
|
+
`diagnosticEvent: ${JSON.stringify(diagnosticEvent)}`
|
|
699
700
|
);
|
|
700
701
|
|
|
701
702
|
// @ts-ignore
|
|
@@ -723,9 +724,9 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
723
724
|
this.logger.log(
|
|
724
725
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
725
726
|
'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',
|
|
726
|
-
name
|
|
727
|
-
payload
|
|
728
|
-
options
|
|
727
|
+
`name: ${name}`,
|
|
728
|
+
`payload: ${JSON.stringify(payload)}`,
|
|
729
|
+
`options: ${JSON.stringify(options)}`
|
|
729
730
|
);
|
|
730
731
|
|
|
731
732
|
const clientEvent = this.prepareClientEvent({name, payload, options});
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {registerInternalPlugin} from '@webex/webex-core';
|
|
|
9
9
|
import Metrics from './metrics';
|
|
10
10
|
import config from './config';
|
|
11
11
|
import NewMetrics from './new-metrics';
|
|
12
|
+
import * as Utils from './utils';
|
|
12
13
|
import {
|
|
13
14
|
ClientEvent,
|
|
14
15
|
ClientEventLeaveReason,
|
|
@@ -29,7 +30,7 @@ registerInternalPlugin('newMetrics', NewMetrics, {
|
|
|
29
30
|
});
|
|
30
31
|
|
|
31
32
|
export {default, getOSNameInternal} from './metrics';
|
|
32
|
-
export {config, CALL_DIAGNOSTIC_CONFIG, NewMetrics};
|
|
33
|
+
export {config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils};
|
|
33
34
|
export type {
|
|
34
35
|
ClientEvent,
|
|
35
36
|
ClientEventLeaveReason,
|
package/src/metrics.types.ts
CHANGED
|
@@ -38,7 +38,6 @@ export type InternalEvent = {
|
|
|
38
38
|
| 'internal.client.meetinginfo.request'
|
|
39
39
|
| 'internal.client.meetinginfo.response'
|
|
40
40
|
| 'internal.reset.join.latencies'
|
|
41
|
-
| 'internal.client.interstitial-window.launched'
|
|
42
41
|
| 'internal.client.meeting.click.joinbutton'
|
|
43
42
|
| 'internal.host.meeting.participant.admitted'
|
|
44
43
|
| 'internal.client.meeting.interstitial-window.showed'
|
package/src/new-metrics.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from './metrics.types';
|
|
19
19
|
import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
|
|
20
20
|
import {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';
|
|
21
|
+
import {generateCommonErrorMetadata} from './utils';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Metrics plugin to centralize all types of metrics.
|
|
@@ -190,13 +191,19 @@ class Metrics extends WebexPlugin {
|
|
|
190
191
|
})
|
|
191
192
|
.then((res) => {
|
|
192
193
|
// @ts-ignore
|
|
193
|
-
this.webex.logger.log(
|
|
194
|
+
this.webex.logger.log(
|
|
195
|
+
`NewMetrics: @postPreLoginMetric. Request successful:`,
|
|
196
|
+
`res: ${JSON.stringify(res)}`
|
|
197
|
+
);
|
|
194
198
|
|
|
195
199
|
return res;
|
|
196
200
|
})
|
|
197
201
|
.catch((err) => {
|
|
198
202
|
// @ts-ignore
|
|
199
|
-
this.logger.error(
|
|
203
|
+
this.logger.error(
|
|
204
|
+
`NewMetrics: @postPreLoginMetric. Request failed:`,
|
|
205
|
+
`err: ${generateCommonErrorMetadata(err)}`
|
|
206
|
+
);
|
|
200
207
|
|
|
201
208
|
return Promise.reject(err);
|
|
202
209
|
});
|
|
@@ -224,13 +231,19 @@ class Metrics extends WebexPlugin {
|
|
|
224
231
|
})
|
|
225
232
|
.then((res) => {
|
|
226
233
|
// @ts-ignore
|
|
227
|
-
this.webex.logger.log(
|
|
234
|
+
this.webex.logger.log(
|
|
235
|
+
`NewMetrics: @clientMetricsAliasUser. Request successful:`,
|
|
236
|
+
`res: ${JSON.stringify(res)}`
|
|
237
|
+
);
|
|
228
238
|
|
|
229
239
|
return res;
|
|
230
240
|
})
|
|
231
241
|
.catch((err) => {
|
|
232
242
|
// @ts-ignore
|
|
233
|
-
this.logger.error(
|
|
243
|
+
this.logger.error(
|
|
244
|
+
`NewMetrics: @clientMetricsAliasUser. Request failed:`,
|
|
245
|
+
`err: ${generateCommonErrorMetadata(err)}`
|
|
246
|
+
);
|
|
234
247
|
|
|
235
248
|
return Promise.reject(err);
|
|
236
249
|
});
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
|
2
|
+
/**
|
|
3
|
+
* Generates common metadata for errors
|
|
4
|
+
* @param {any} error
|
|
5
|
+
* @returns {object}
|
|
6
|
+
*/
|
|
7
|
+
export const generateCommonErrorMetadata = (error) => {
|
|
8
|
+
if (error instanceof Error) {
|
|
9
|
+
return JSON.stringify({
|
|
10
|
+
message: error?.message,
|
|
11
|
+
name: error?.name,
|
|
12
|
+
stack: error?.stack,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return error;
|
|
17
|
+
};
|