@webex/internal-plugin-metrics 3.5.0 → 3.6.0-next.1
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/business-metrics.js +119 -9
- package/dist/business-metrics.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 +24 -7
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +7 -2
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
- package/dist/call-diagnostic/config.js +13 -3
- package/dist/call-diagnostic/config.js.map +1 -1
- package/dist/index.js +7 -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 +5 -2
- package/dist/new-metrics.js.map +1 -1
- package/dist/rtcMetrics/constants.js +11 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +223 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/types/business-metrics.d.ts +36 -4
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +4 -1
- package/dist/types/call-diagnostic/config.d.ts +3 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/metrics.types.d.ts +19 -2
- package/dist/types/new-metrics.d.ts +5 -3
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +80 -0
- package/package.json +12 -12
- package/src/business-metrics.ts +97 -5
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +1 -1
- package/src/call-diagnostic/call-diagnostic-metrics.ts +25 -7
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +11 -5
- package/src/call-diagnostic/config.ts +12 -0
- package/src/index.ts +2 -0
- package/src/metrics.types.ts +98 -23
- package/src/new-metrics.ts +12 -2
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +205 -0
- package/test/unit/spec/business/business-metrics.ts +69 -2
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +2 -1
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +4 -6
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +451 -15
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +7 -3
- package/test/unit/spec/new-metrics.ts +18 -3
- package/test/unit/spec/prelogin-metrics-batcher.ts +3 -1
- package/test/unit/spec/rtcMetrics/index.ts +196 -0
- package/dist/behavioral/behavioral-metrics.js +0 -199
- package/dist/behavioral/behavioral-metrics.js.map +0 -1
- package/dist/behavioral/config.js +0 -11
- package/dist/behavioral/config.js.map +0 -1
- package/dist/types/behavioral/behavioral-metrics.d.ts +0 -63
- package/dist/types/behavioral/config.d.ts +0 -1
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
|
|
4
|
+
var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
|
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
7
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
8
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
9
|
+
value: true
|
|
10
|
+
});
|
|
11
|
+
exports.default = void 0;
|
|
12
|
+
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
13
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
14
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
16
|
+
var _uuid = _interopRequireDefault(require("uuid"));
|
|
17
|
+
var CallDiagnosticUtils = _interopRequireWildcard(require("../call-diagnostic/call-diagnostic-metrics.util"));
|
|
18
|
+
var _constants = _interopRequireDefault(require("./constants"));
|
|
19
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof _WeakMap) return null; var r = new _WeakMap(), t = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
20
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
|
+
/* eslint-disable class-methods-use-this */
|
|
22
|
+
|
|
23
|
+
var parseJsonPayload = function parseJsonPayload(payload) {
|
|
24
|
+
try {
|
|
25
|
+
if (payload && payload[0]) {
|
|
26
|
+
return JSON.parse(payload[0]);
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
} catch (_) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Rtc Metrics
|
|
36
|
+
*/
|
|
37
|
+
var RtcMetrics = exports.default = /*#__PURE__*/function () {
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the interval.
|
|
40
|
+
*
|
|
41
|
+
* @param {object} webex - The main `webex` object.
|
|
42
|
+
* @param {IdType} Ids - Meeting or Calling id.
|
|
43
|
+
* @param {string} correlationId - The correlation id.
|
|
44
|
+
*/
|
|
45
|
+
function RtcMetrics(webex, _ref, correlationId) {
|
|
46
|
+
var meetingId = _ref.meetingId,
|
|
47
|
+
callId = _ref.callId;
|
|
48
|
+
(0, _classCallCheck2.default)(this, RtcMetrics);
|
|
49
|
+
/**
|
|
50
|
+
* Array of MetricData items to be sent to the metrics service.
|
|
51
|
+
*/
|
|
52
|
+
(0, _defineProperty2.default)(this, "metricsQueue", []);
|
|
53
|
+
(0, _defineProperty2.default)(this, "intervalId", void 0);
|
|
54
|
+
(0, _defineProperty2.default)(this, "webex", void 0);
|
|
55
|
+
(0, _defineProperty2.default)(this, "meetingId", void 0);
|
|
56
|
+
(0, _defineProperty2.default)(this, "callId", void 0);
|
|
57
|
+
(0, _defineProperty2.default)(this, "correlationId", void 0);
|
|
58
|
+
(0, _defineProperty2.default)(this, "connectionId", void 0);
|
|
59
|
+
(0, _defineProperty2.default)(this, "shouldSendMetricsOnNextStatsReport", void 0);
|
|
60
|
+
// `window` is used to prevent typescript from returning a NodeJS.Timer.
|
|
61
|
+
this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
|
|
62
|
+
this.meetingId = meetingId;
|
|
63
|
+
this.callId = callId;
|
|
64
|
+
this.webex = webex;
|
|
65
|
+
this.correlationId = correlationId;
|
|
66
|
+
this.resetConnection();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Updates the call identifier with the provided value.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} callId - The new call identifier to set.
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
(0, _createClass2.default)(RtcMetrics, [{
|
|
76
|
+
key: "updateCallId",
|
|
77
|
+
value: function updateCallId(callId) {
|
|
78
|
+
this.callId = callId;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Check to see if the metrics queue has any items.
|
|
83
|
+
*
|
|
84
|
+
* @returns {void}
|
|
85
|
+
*/
|
|
86
|
+
}, {
|
|
87
|
+
key: "sendMetricsInQueue",
|
|
88
|
+
value: function sendMetricsInQueue() {
|
|
89
|
+
if (this.metricsQueue.length) {
|
|
90
|
+
this.sendMetrics();
|
|
91
|
+
this.metricsQueue = [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Forces sending metrics when we get the next stats-report
|
|
97
|
+
*
|
|
98
|
+
* This is useful for cases when something important happens that affects the media connection,
|
|
99
|
+
* for example when we move from lobby into the meeting.
|
|
100
|
+
*
|
|
101
|
+
* @returns {void}
|
|
102
|
+
*/
|
|
103
|
+
}, {
|
|
104
|
+
key: "sendNextMetrics",
|
|
105
|
+
value: function sendNextMetrics() {
|
|
106
|
+
this.shouldSendMetricsOnNextStatsReport = true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Add metrics items to the metrics queue.
|
|
111
|
+
*
|
|
112
|
+
* @param {object} data - An object with a payload array of metrics items.
|
|
113
|
+
*
|
|
114
|
+
* @returns {void}
|
|
115
|
+
*/
|
|
116
|
+
}, {
|
|
117
|
+
key: "addMetrics",
|
|
118
|
+
value: function addMetrics(data) {
|
|
119
|
+
if (data.payload.length) {
|
|
120
|
+
if (data.name === 'stats-report') {
|
|
121
|
+
data.payload = data.payload.map(this.anonymizeIp);
|
|
122
|
+
}
|
|
123
|
+
this.metricsQueue.push(data);
|
|
124
|
+
if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {
|
|
125
|
+
// this is the first useful set of data (WCME gives it to us after 5s), send it out immediately
|
|
126
|
+
// in case the user is unhappy and closes the browser early
|
|
127
|
+
this.sendMetricsInQueue();
|
|
128
|
+
this.shouldSendMetricsOnNextStatsReport = false;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
// If a connection fails, send the rest of the metrics in queue and get a new connection id.
|
|
132
|
+
var parsedPayload = parseJsonPayload(data.payload);
|
|
133
|
+
if (data.name === 'onconnectionstatechange' && parsedPayload && parsedPayload.value === 'failed') {
|
|
134
|
+
this.sendMetricsInQueue();
|
|
135
|
+
this.resetConnection();
|
|
136
|
+
}
|
|
137
|
+
} catch (e) {
|
|
138
|
+
console.error(e);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Clear the metrics interval.
|
|
145
|
+
*
|
|
146
|
+
* @returns {void}
|
|
147
|
+
*/
|
|
148
|
+
}, {
|
|
149
|
+
key: "closeMetrics",
|
|
150
|
+
value: function closeMetrics() {
|
|
151
|
+
this.sendMetricsInQueue();
|
|
152
|
+
clearInterval(this.intervalId);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Anonymize IP addresses.
|
|
157
|
+
*
|
|
158
|
+
* @param {array} stats - An RTCStatsReport organized into an array of strings.
|
|
159
|
+
* @returns {string}
|
|
160
|
+
*/
|
|
161
|
+
}, {
|
|
162
|
+
key: "anonymizeIp",
|
|
163
|
+
value: function anonymizeIp(stats) {
|
|
164
|
+
var data = JSON.parse(stats);
|
|
165
|
+
// on local and remote candidates, anonymize the last 4 bits.
|
|
166
|
+
if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
|
|
167
|
+
data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
|
|
168
|
+
data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
|
|
169
|
+
data.relatedAddress = CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
|
|
170
|
+
}
|
|
171
|
+
return (0, _stringify.default)(data);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Set a new connection id.
|
|
176
|
+
*
|
|
177
|
+
* @returns {void}
|
|
178
|
+
*/
|
|
179
|
+
}, {
|
|
180
|
+
key: "resetConnection",
|
|
181
|
+
value: function resetConnection() {
|
|
182
|
+
this.connectionId = _uuid.default.v4();
|
|
183
|
+
this.shouldSendMetricsOnNextStatsReport = true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Send metrics to the metrics service.
|
|
188
|
+
*
|
|
189
|
+
* @returns {void}
|
|
190
|
+
*/
|
|
191
|
+
}, {
|
|
192
|
+
key: "sendMetrics",
|
|
193
|
+
value: function sendMetrics() {
|
|
194
|
+
var metricsAttributes = {
|
|
195
|
+
type: 'webrtc',
|
|
196
|
+
version: '1.1.0',
|
|
197
|
+
userId: this.webex.internal.device.userId,
|
|
198
|
+
correlationId: this.correlationId,
|
|
199
|
+
connectionId: this.connectionId,
|
|
200
|
+
data: this.metricsQueue
|
|
201
|
+
};
|
|
202
|
+
if (this.meetingId) {
|
|
203
|
+
metricsAttributes.meetingId = this.meetingId;
|
|
204
|
+
} else if (this.callId) {
|
|
205
|
+
metricsAttributes.callId = this.callId;
|
|
206
|
+
}
|
|
207
|
+
this.webex.request({
|
|
208
|
+
method: 'POST',
|
|
209
|
+
service: 'unifiedTelemetry',
|
|
210
|
+
resource: 'metric/v2',
|
|
211
|
+
headers: {
|
|
212
|
+
type: 'webrtcMedia',
|
|
213
|
+
appId: _constants.default.APP_ID
|
|
214
|
+
},
|
|
215
|
+
body: {
|
|
216
|
+
metrics: [metricsAttributes]
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}]);
|
|
221
|
+
return RtcMetrics;
|
|
222
|
+
}();
|
|
223
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_uuid","_interopRequireDefault","require","CallDiagnosticUtils","_interopRequireWildcard","_constants","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","parseJsonPayload","payload","JSON","parse","_","RtcMetrics","exports","webex","_ref","correlationId","meetingId","callId","_classCallCheck2","_defineProperty2","intervalId","window","setInterval","sendMetricsInQueue","bind","resetConnection","_createClass2","key","value","updateCallId","metricsQueue","length","sendMetrics","sendNextMetrics","shouldSendMetricsOnNextStatsReport","addMetrics","data","name","map","anonymizeIp","push","parsedPayload","console","error","closeMetrics","clearInterval","stats","type","ip","anonymizeIPAddress","undefined","address","relatedAddress","_stringify","connectionId","uuid","v4","metricsAttributes","version","userId","internal","device","request","method","service","resource","headers","appId","RTC_METRICS","APP_ID","body","metrics"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport uuid from 'uuid';\nimport * as CallDiagnosticUtils from '../call-diagnostic/call-diagnostic-metrics.util';\nimport RTC_METRICS from './constants';\nimport {IdType, IMetricsAttributes} from '../metrics.types';\n\nconst parseJsonPayload = (payload: any[]): any | null => {\n try {\n if (payload && payload[0]) {\n return JSON.parse(payload[0]);\n }\n\n return null;\n } catch (_) {\n return null;\n }\n};\n\n/**\n * Rtc Metrics\n */\nexport default class RtcMetrics {\n /**\n * Array of MetricData items to be sent to the metrics service.\n */\n metricsQueue = [];\n\n intervalId: number;\n\n webex: any;\n\n meetingId?: string;\n\n callId?: string;\n\n correlationId: string;\n\n connectionId: string;\n\n shouldSendMetricsOnNextStatsReport: boolean;\n\n /**\n * Initialize the interval.\n *\n * @param {object} webex - The main `webex` object.\n * @param {IdType} Ids - Meeting or Calling id.\n * @param {string} correlationId - The correlation id.\n */\n constructor(webex, {meetingId, callId}: IdType, correlationId) {\n // `window` is used to prevent typescript from returning a NodeJS.Timer.\n this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);\n this.meetingId = meetingId;\n this.callId = callId;\n this.webex = webex;\n this.correlationId = correlationId;\n this.resetConnection();\n }\n\n /**\n * Updates the call identifier with the provided value.\n *\n * @param {string} callId - The new call identifier to set.\n * @returns {void}\n */\n public updateCallId(callId: string) {\n this.callId = callId;\n }\n\n /**\n * Check to see if the metrics queue has any items.\n *\n * @returns {void}\n */\n public sendMetricsInQueue() {\n if (this.metricsQueue.length) {\n this.sendMetrics();\n this.metricsQueue = [];\n }\n }\n\n /**\n * Forces sending metrics when we get the next stats-report\n *\n * This is useful for cases when something important happens that affects the media connection,\n * for example when we move from lobby into the meeting.\n *\n * @returns {void}\n */\n public sendNextMetrics() {\n this.shouldSendMetricsOnNextStatsReport = true;\n }\n\n /**\n * Add metrics items to the metrics queue.\n *\n * @param {object} data - An object with a payload array of metrics items.\n *\n * @returns {void}\n */\n addMetrics(data) {\n if (data.payload.length) {\n if (data.name === 'stats-report') {\n data.payload = data.payload.map(this.anonymizeIp);\n }\n\n this.metricsQueue.push(data);\n\n if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {\n // this is the first useful set of data (WCME gives it to us after 5s), send it out immediately\n // in case the user is unhappy and closes the browser early\n this.sendMetricsInQueue();\n this.shouldSendMetricsOnNextStatsReport = false;\n }\n\n try {\n // If a connection fails, send the rest of the metrics in queue and get a new connection id.\n const parsedPayload = parseJsonPayload(data.payload);\n if (\n data.name === 'onconnectionstatechange' &&\n parsedPayload &&\n parsedPayload.value === 'failed'\n ) {\n this.sendMetricsInQueue();\n this.resetConnection();\n }\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n /**\n * Clear the metrics interval.\n *\n * @returns {void}\n */\n closeMetrics() {\n this.sendMetricsInQueue();\n clearInterval(this.intervalId);\n }\n\n /**\n * Anonymize IP addresses.\n *\n * @param {array} stats - An RTCStatsReport organized into an array of strings.\n * @returns {string}\n */\n anonymizeIp(stats: string): string {\n const data = JSON.parse(stats);\n // on local and remote candidates, anonymize the last 4 bits.\n if (data.type === 'local-candidate' || data.type === 'remote-candidate') {\n data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;\n data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;\n data.relatedAddress =\n CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;\n }\n\n return JSON.stringify(data);\n }\n\n /**\n * Set a new connection id.\n *\n * @returns {void}\n */\n private resetConnection() {\n this.connectionId = uuid.v4();\n this.shouldSendMetricsOnNextStatsReport = true;\n }\n\n /**\n * Send metrics to the metrics service.\n *\n * @returns {void}\n */\n private sendMetrics() {\n const metricsAttributes: IMetricsAttributes = {\n type: 'webrtc',\n version: '1.1.0',\n userId: this.webex.internal.device.userId,\n correlationId: this.correlationId,\n connectionId: this.connectionId,\n data: this.metricsQueue,\n };\n\n if (this.meetingId) {\n metricsAttributes.meetingId = this.meetingId;\n } else if (this.callId) {\n metricsAttributes.callId = this.callId;\n }\n\n this.webex.request({\n method: 'POST',\n service: 'unifiedTelemetry',\n resource: 'metric/v2',\n headers: {\n type: 'webrtcMedia',\n appId: RTC_METRICS.APP_ID,\n },\n body: {\n metrics: [metricsAttributes],\n },\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import GenericMetrics from './generic-metrics';
|
|
2
|
-
import { EventPayload } from './metrics.types';
|
|
2
|
+
import { EventPayload, Table } from './metrics.types';
|
|
3
3
|
/**
|
|
4
4
|
* @description Util class to handle Buisness Metrics
|
|
5
5
|
* @export
|
|
@@ -7,13 +7,45 @@ import { EventPayload } from './metrics.types';
|
|
|
7
7
|
*/
|
|
8
8
|
export default class BusinessMetrics extends GenericMetrics {
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* unfortunately, the pinot team does not allow changes to the schema of wbxapp_callend_metrics
|
|
11
|
+
* so we have to shim this layer specifically for this
|
|
12
|
+
* https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table+wbxapp_callend_metrics
|
|
13
|
+
* @param {EventPayload} payload payload of the metric
|
|
14
|
+
* @returns {Promise<any>}
|
|
15
|
+
*/
|
|
16
|
+
private submitCallEndEvent;
|
|
17
|
+
/**
|
|
18
|
+
* Submit a buisness metric to our metrics endpoint, going to the default business_ucf table
|
|
19
|
+
* all event payload keys are converted into a hex string value
|
|
20
|
+
* unfortunately, the pinot team does not allow changes to the schema of business_metrics
|
|
21
|
+
* so we have to shim this layer specifically for this
|
|
22
|
+
* https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table%3A+business_metrics
|
|
23
|
+
* @param {string} name of the metric
|
|
24
|
+
* @param {EventPayload} payload payload of the metric
|
|
25
|
+
* @returns {Promise<any>}
|
|
26
|
+
*/
|
|
27
|
+
private submitBusinessMetricsEvent;
|
|
28
|
+
/**
|
|
29
|
+
* Submit a buisness metric to our metrics endpoint, going to the default business_ucf table
|
|
30
|
+
* all event payload keys are converted into a hex string value
|
|
31
|
+
* https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA
|
|
11
32
|
* @param {string} name of the metric
|
|
12
33
|
* @param {EventPayload} user payload of the metric
|
|
13
34
|
* @returns {Promise<any>}
|
|
14
35
|
*/
|
|
15
|
-
|
|
36
|
+
private submitDefaultEvent;
|
|
37
|
+
/**
|
|
38
|
+
* Submit a buisness metric to our metrics endpoint.
|
|
39
|
+
* routes to the correct table with the correct schema payload by table
|
|
40
|
+
* https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA
|
|
41
|
+
* @param {string} name of the metric, ignored if going to wbxapp_callend_metrics
|
|
42
|
+
* @param {EventPayload} payload user payload of the metric
|
|
43
|
+
* @param {Table} table optional - to submit the metric to and adapt the sent schema
|
|
44
|
+
* @returns {Promise<any>}
|
|
45
|
+
*/
|
|
46
|
+
submitBusinessEvent({ name, payload, table, }: {
|
|
16
47
|
name: string;
|
|
17
48
|
payload: EventPayload;
|
|
18
|
-
|
|
49
|
+
table?: Table;
|
|
50
|
+
}): Promise<void>;
|
|
19
51
|
}
|
|
@@ -66,7 +66,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
66
66
|
* @returns
|
|
67
67
|
*/
|
|
68
68
|
getOrigin(options: GetOriginOptions, meetingId?: string): {
|
|
69
|
-
name: "endpoint" | "addin" | "antares" | "appapi" | "beech" | "breakout" | "calendar" | "cb" | "cca" | "ccc" | "cloudproxy" | "edonus" | "givr" | "hecate" | "hedge" | "hesiod" | "homer" | "superhomer" | "l2sip" | "linus" | "locus" | "mbs" | "mcc" | "mcs" | "mercury" | "mes" | "mjs" | "mmp" | "mygdon" | "ngservice" | "orpheus" | "page" | "poros" | "publicapi" | "rhesos" | "terminus" | "tpgw" | "ucc" | "wdm" | "webexivr";
|
|
69
|
+
name: "endpoint" | "addin" | "antares" | "appapi" | "beech" | "breakout" | "calendar" | "cb" | "cca" | "ccc" | "cloudproxy" | "crc" | "edonus" | "givr" | "hecate" | "hedge" | "hesiod" | "homer" | "superhomer" | "l2sip" | "linus" | "locus" | "mbs" | "mcc" | "mcs" | "mercury" | "mes" | "mjs" | "mmp" | "mygdon" | "ngservice" | "orpheus" | "page" | "poros" | "publicapi" | "rhesos" | "terminus" | "tpgw" | "ucc" | "wdm" | "webexivr" | "meetingcontainer";
|
|
70
70
|
userAgent: string;
|
|
71
71
|
buildType?: "debug" | "test" | "prod" | "tap" | "analyzer-test";
|
|
72
72
|
upgradeChannel?: string;
|
|
@@ -137,6 +137,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
137
137
|
emmVendorId?: string;
|
|
138
138
|
isHybridMedia?: boolean;
|
|
139
139
|
originData?: {};
|
|
140
|
+
serviceVersion?: string;
|
|
140
141
|
additionalProperties?: false;
|
|
141
142
|
};
|
|
142
143
|
/**
|
|
@@ -146,6 +147,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
146
147
|
*/
|
|
147
148
|
getIdentifiers(options: GetIdentifiersOptions): {
|
|
148
149
|
attendeeId?: string;
|
|
150
|
+
participantId?: string;
|
|
149
151
|
breakoutGroupId?: string;
|
|
150
152
|
breakoutMoveId?: string;
|
|
151
153
|
breakoutSessionId?: string;
|
|
@@ -225,6 +227,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
225
227
|
additionalProperties?: false;
|
|
226
228
|
} | {
|
|
227
229
|
attendeeId?: string;
|
|
230
|
+
participantId?: string;
|
|
228
231
|
breakoutGroupId?: string;
|
|
229
232
|
breakoutMoveId?: string;
|
|
230
233
|
breakoutSessionId?: string;
|
|
@@ -96,6 +96,7 @@ export declare const ERROR_DESCRIPTIONS: {
|
|
|
96
96
|
ICE_AND_REACHABILITY_FAILED: string;
|
|
97
97
|
SDP_OFFER_CREATION_ERROR: string;
|
|
98
98
|
SDP_OFFER_CREATION_ERROR_MISSING_CODEC: string;
|
|
99
|
+
WDM_RESTRICTED_REGION: string;
|
|
99
100
|
};
|
|
100
101
|
export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
|
|
101
102
|
58400: number;
|
|
@@ -175,6 +176,8 @@ export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
|
|
|
175
176
|
100006: number;
|
|
176
177
|
100005: number;
|
|
177
178
|
100004: number;
|
|
179
|
+
4404002: number;
|
|
180
|
+
4404003: number;
|
|
178
181
|
};
|
|
179
182
|
export declare const CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD: Record<number, Partial<ClientEventError>>;
|
|
180
183
|
export declare const CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND = "js_sdk_call_diagnostic_event_failed_to_send";
|
package/dist/types/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-l
|
|
|
12
12
|
import BehavioralMetrics from './behavioral-metrics';
|
|
13
13
|
import OperationalMetrics from './operational-metrics';
|
|
14
14
|
import BusinessMetrics from './business-metrics';
|
|
15
|
+
import RtcMetrics from './rtcMetrics';
|
|
15
16
|
export { default, getOSNameInternal } from './metrics';
|
|
16
|
-
export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, };
|
|
17
|
+
export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, RtcMetrics, };
|
|
17
18
|
export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, PreComputedLatencies, };
|
|
@@ -8,8 +8,9 @@ export type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment'
|
|
|
8
8
|
export type ClientLaunchMethodType = NonNullable<RawEvent['origin']['clientInfo']>['clientLaunchMethod'];
|
|
9
9
|
export type BrowserLaunchMethodType = NonNullable<RawEvent['origin']['clientInfo']>['browserLaunchMethod'];
|
|
10
10
|
export type MetricEventProduct = 'webex' | 'wxcc_desktop';
|
|
11
|
-
export type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service';
|
|
12
|
-
export type MetricEventVerb = 'create' | '
|
|
11
|
+
export type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service' | 'api';
|
|
12
|
+
export type MetricEventVerb = 'abort' | 'accept' | 'activate' | 'apply' | 'answer' | 'authorize' | 'build' | 'cancel' | 'change' | 'click' | 'close' | 'complete' | 'connect' | 'create' | 'deactivate' | 'decrypt' | 'delete' | 'deliver' | 'destroy' | 'disable' | 'disconnect' | 'dismiss' | 'display' | 'download' | 'edit' | 'enable' | 'encrypt' | 'end' | 'expire' | 'fail' | 'fetch' | 'fire' | 'generate' | 'get' | 'hide' | 'hover' | 'ignore' | 'initialize' | 'initiate' | 'invalidate' | 'join' | 'list' | 'load' | 'login' | 'logout' | 'notify' | 'offer' | 'open' | 'press' | 'receive' | 'refer' | 'refresh' | 'register' | 'release' | 'reload' | 'reject' | 'request' | 'reset' | 'resize' | 'respond' | 'retry' | 'revoke' | 'save' | 'search' | 'select' | 'send' | 'set' | 'sign' | 'start' | 'submit' | 'switch' | 'sync' | 'toggle' | 'transfer' | 'unregister' | 'update' | 'upload' | 'use' | 'validate' | 'view' | 'visit' | 'wait' | 'warn' | 'exit';
|
|
13
|
+
export type MetricEventJoinFlowVersion = 'Other' | 'NewFTE';
|
|
13
14
|
export type SubmitClientEventOptions = {
|
|
14
15
|
meetingId?: string;
|
|
15
16
|
mediaConnections?: any[];
|
|
@@ -23,6 +24,7 @@ export type SubmitClientEventOptions = {
|
|
|
23
24
|
browserLaunchMethod?: BrowserLaunchMethodType;
|
|
24
25
|
webexConferenceIdStr?: string;
|
|
25
26
|
globalMeetingId?: string;
|
|
27
|
+
joinFlowVersion?: MetricEventJoinFlowVersion;
|
|
26
28
|
};
|
|
27
29
|
export type SubmitMQEOptions = {
|
|
28
30
|
meetingId: string;
|
|
@@ -55,6 +57,7 @@ export interface DeviceContext {
|
|
|
55
57
|
};
|
|
56
58
|
}
|
|
57
59
|
export type MetricType = 'behavioral' | 'operational' | 'business';
|
|
60
|
+
export type Table = 'wbxapp_callend_metrics' | 'business_metrics' | 'business_ucf' | 'default';
|
|
58
61
|
type InternalEventPayload = string | number | boolean;
|
|
59
62
|
export type EventPayload = Record<string, InternalEventPayload>;
|
|
60
63
|
export type BehavioralEventPayload = EventPayload;
|
|
@@ -137,4 +140,18 @@ export type BuildClientEventFetchRequestOptions = (args: {
|
|
|
137
140
|
options?: SubmitClientEventOptions;
|
|
138
141
|
}) => Promise<any>;
|
|
139
142
|
export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
|
|
143
|
+
export interface IdType {
|
|
144
|
+
meetingId?: string;
|
|
145
|
+
callId?: string;
|
|
146
|
+
}
|
|
147
|
+
export interface IMetricsAttributes {
|
|
148
|
+
type: string;
|
|
149
|
+
version: string;
|
|
150
|
+
userId: string;
|
|
151
|
+
correlationId: string;
|
|
152
|
+
connectionId: string;
|
|
153
|
+
data: any[];
|
|
154
|
+
meetingId?: string;
|
|
155
|
+
callId?: string;
|
|
156
|
+
}
|
|
140
157
|
export {};
|
|
@@ -3,10 +3,11 @@ import CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';
|
|
|
3
3
|
import BehavioralMetrics from './behavioral-metrics';
|
|
4
4
|
import OperationalMetrics from './operational-metrics';
|
|
5
5
|
import BusinessMetrics from './business-metrics';
|
|
6
|
-
import { RecursivePartial, MetricEventProduct, MetricEventAgent, MetricEventVerb, ClientEvent, FeatureEvent, EventPayload, MediaQualityEvent, InternalEvent, SubmitClientEventOptions } from './metrics.types';
|
|
6
|
+
import { RecursivePartial, MetricEventProduct, MetricEventAgent, MetricEventVerb, ClientEvent, FeatureEvent, EventPayload, MediaQualityEvent, InternalEvent, SubmitClientEventOptions, Table } from './metrics.types';
|
|
7
7
|
import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
|
|
8
8
|
/**
|
|
9
9
|
* Metrics plugin to centralize all types of metrics.
|
|
10
|
+
* https://confluence-eng-gpk2.cisco.com/conf/pages/viewpage.action?pageId=231011379
|
|
10
11
|
* @class
|
|
11
12
|
*/
|
|
12
13
|
declare class Metrics extends WebexPlugin {
|
|
@@ -85,10 +86,11 @@ declare class Metrics extends WebexPlugin {
|
|
|
85
86
|
* Buisness event
|
|
86
87
|
* @param args
|
|
87
88
|
*/
|
|
88
|
-
submitBusinessEvent({ name, payload }: {
|
|
89
|
+
submitBusinessEvent({ name, payload, table, }: {
|
|
89
90
|
name: string;
|
|
90
91
|
payload: EventPayload;
|
|
91
|
-
|
|
92
|
+
table?: Table;
|
|
93
|
+
}): Promise<void>;
|
|
92
94
|
/**
|
|
93
95
|
* Call Analyzer: Media Quality Event
|
|
94
96
|
* @param args
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { IdType } from '../metrics.types';
|
|
2
|
+
/**
|
|
3
|
+
* Rtc Metrics
|
|
4
|
+
*/
|
|
5
|
+
export default class RtcMetrics {
|
|
6
|
+
/**
|
|
7
|
+
* Array of MetricData items to be sent to the metrics service.
|
|
8
|
+
*/
|
|
9
|
+
metricsQueue: any[];
|
|
10
|
+
intervalId: number;
|
|
11
|
+
webex: any;
|
|
12
|
+
meetingId?: string;
|
|
13
|
+
callId?: string;
|
|
14
|
+
correlationId: string;
|
|
15
|
+
connectionId: string;
|
|
16
|
+
shouldSendMetricsOnNextStatsReport: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the interval.
|
|
19
|
+
*
|
|
20
|
+
* @param {object} webex - The main `webex` object.
|
|
21
|
+
* @param {IdType} Ids - Meeting or Calling id.
|
|
22
|
+
* @param {string} correlationId - The correlation id.
|
|
23
|
+
*/
|
|
24
|
+
constructor(webex: any, { meetingId, callId }: IdType, correlationId: any);
|
|
25
|
+
/**
|
|
26
|
+
* Updates the call identifier with the provided value.
|
|
27
|
+
*
|
|
28
|
+
* @param {string} callId - The new call identifier to set.
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
updateCallId(callId: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Check to see if the metrics queue has any items.
|
|
34
|
+
*
|
|
35
|
+
* @returns {void}
|
|
36
|
+
*/
|
|
37
|
+
sendMetricsInQueue(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Forces sending metrics when we get the next stats-report
|
|
40
|
+
*
|
|
41
|
+
* This is useful for cases when something important happens that affects the media connection,
|
|
42
|
+
* for example when we move from lobby into the meeting.
|
|
43
|
+
*
|
|
44
|
+
* @returns {void}
|
|
45
|
+
*/
|
|
46
|
+
sendNextMetrics(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Add metrics items to the metrics queue.
|
|
49
|
+
*
|
|
50
|
+
* @param {object} data - An object with a payload array of metrics items.
|
|
51
|
+
*
|
|
52
|
+
* @returns {void}
|
|
53
|
+
*/
|
|
54
|
+
addMetrics(data: any): void;
|
|
55
|
+
/**
|
|
56
|
+
* Clear the metrics interval.
|
|
57
|
+
*
|
|
58
|
+
* @returns {void}
|
|
59
|
+
*/
|
|
60
|
+
closeMetrics(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Anonymize IP addresses.
|
|
63
|
+
*
|
|
64
|
+
* @param {array} stats - An RTCStatsReport organized into an array of strings.
|
|
65
|
+
* @returns {string}
|
|
66
|
+
*/
|
|
67
|
+
anonymizeIp(stats: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* Set a new connection id.
|
|
70
|
+
*
|
|
71
|
+
* @returns {void}
|
|
72
|
+
*/
|
|
73
|
+
private resetConnection;
|
|
74
|
+
/**
|
|
75
|
+
* Send metrics to the metrics service.
|
|
76
|
+
*
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
private sendMetrics;
|
|
80
|
+
}
|
package/package.json
CHANGED
|
@@ -26,22 +26,22 @@
|
|
|
26
26
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
27
27
|
"@webex/jest-config-legacy": "0.0.0",
|
|
28
28
|
"@webex/legacy-tools": "0.0.0",
|
|
29
|
-
"@webex/test-helper-chai": "3.
|
|
30
|
-
"@webex/test-helper-mocha": "3.
|
|
31
|
-
"@webex/test-helper-mock-webex": "3.
|
|
32
|
-
"@webex/test-helper-test-users": "3.
|
|
29
|
+
"@webex/test-helper-chai": "3.6.0-next.1",
|
|
30
|
+
"@webex/test-helper-mocha": "3.6.0-next.1",
|
|
31
|
+
"@webex/test-helper-mock-webex": "3.6.0-next.1",
|
|
32
|
+
"@webex/test-helper-test-users": "3.6.0-next.1",
|
|
33
33
|
"eslint": "^8.24.0",
|
|
34
34
|
"prettier": "^2.7.1",
|
|
35
35
|
"sinon": "^9.2.4"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@webex/common": "3.
|
|
39
|
-
"@webex/common-timers": "3.
|
|
40
|
-
"@webex/event-dictionary-ts": "^1.0.
|
|
41
|
-
"@webex/internal-plugin-metrics": "3.
|
|
42
|
-
"@webex/test-helper-chai": "3.
|
|
43
|
-
"@webex/test-helper-mock-webex": "3.
|
|
44
|
-
"@webex/webex-core": "3.
|
|
38
|
+
"@webex/common": "3.6.0-next.1",
|
|
39
|
+
"@webex/common-timers": "3.6.0-next.1",
|
|
40
|
+
"@webex/event-dictionary-ts": "^1.0.1594",
|
|
41
|
+
"@webex/internal-plugin-metrics": "3.6.0-next.1",
|
|
42
|
+
"@webex/test-helper-chai": "3.6.0-next.1",
|
|
43
|
+
"@webex/test-helper-mock-webex": "3.6.0-next.1",
|
|
44
|
+
"@webex/webex-core": "3.6.0-next.1",
|
|
45
45
|
"ip-anonymize": "^0.1.0",
|
|
46
46
|
"lodash": "^4.17.21",
|
|
47
47
|
"uuid": "^3.3.2"
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"test:style": "eslint ./src/**/*.*",
|
|
55
55
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
56
56
|
},
|
|
57
|
-
"version": "3.
|
|
57
|
+
"version": "3.6.0-next.1"
|
|
58
58
|
}
|