@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.
Files changed (31) hide show
  1. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +5 -3
  2. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +1 -1
  4. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics.js +12 -11
  6. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  7. package/dist/index.js +3 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/metrics.js +1 -1
  10. package/dist/metrics.types.js.map +1 -1
  11. package/dist/new-metrics.js +6 -4
  12. package/dist/new-metrics.js.map +1 -1
  13. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +4 -1
  14. package/dist/types/index.d.ts +2 -1
  15. package/dist/types/metrics.types.d.ts +1 -1
  16. package/dist/types/utils.d.ts +6 -0
  17. package/dist/utils.js +27 -0
  18. package/dist/utils.js.map +1 -0
  19. package/package.json +8 -8
  20. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +4 -3
  21. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +1 -1
  22. package/src/call-diagnostic/call-diagnostic-metrics.ts +17 -16
  23. package/src/index.ts +2 -1
  24. package/src/metrics.types.ts +0 -1
  25. package/src/new-metrics.ts +17 -4
  26. package/src/utils.ts +17 -0
  27. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +119 -11
  28. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1 -1
  29. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +134 -0
  30. package/test/unit/spec/new-metrics.ts +56 -7
  31. package/test/unit/spec/utils.ts +22 -0
@@ -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;
@@ -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.interstitial-window.launched' | 'internal.client.meeting.click.joinbutton' | 'internal.host.meeting.participant.admitted' | 'internal.client.meeting.interstitial-window.showed' | 'internal.client.interstitial-window.click.joinbutton';
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
  };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generates common metadata for errors
3
+ * @param {any} error
4
+ * @returns {object}
5
+ */
6
+ export declare const generateCommonErrorMetadata: (error: any) => any;
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.229",
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.229",
33
- "@webex/common-timers": "3.0.0-beta.229",
34
- "@webex/internal-plugin-device": "3.0.0-beta.229",
35
- "@webex/internal-plugin-metrics": "3.0.0-beta.229",
36
- "@webex/test-helper-chai": "3.0.0-beta.229",
37
- "@webex/test-helper-mock-webex": "3.0.0-beta.229",
38
- "@webex/webex-core": "3.0.0-beta.229"
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
- 'internal.client.interstitial-window.launched',
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: @prepareClientEvent. Creating in meeting event object.',
471
- name
471
+ 'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
472
+ `name: ${name}`
472
473
  );
473
- const {meetingId, mediaConnections, rawError} = options;
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
- `event: ${name}, meetingId: ${meetingId}`
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,
@@ -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'
@@ -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(`NewMetrics: @postPreLoginMetric. Request successful:`, res);
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(`NewMetrics: @postPreLoginMetric. Request failed:`, err);
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(`NewMetrics: @clientMetricsAliasUser. Request successful:`, res);
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(`NewMetrics: @clientMetricsAliasUser. Request failed:`, err);
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
+ };