@webex/internal-plugin-metrics 3.12.0-next.8 → 3.12.0-next.9
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-latencies.js +11 -4
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +1 -0
- package/package.json +2 -2
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +12 -4
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +44 -22
|
@@ -332,24 +332,31 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
|
|
|
332
332
|
}, {
|
|
333
333
|
key: "getStayLobbyTime",
|
|
334
334
|
value: function getStayLobbyTime() {
|
|
335
|
-
return this.getDiffBetweenTimestamps('client.
|
|
335
|
+
return this.getDiffBetweenTimestamps('client.lobby.entered', 'client.lobby.exited');
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
/**
|
|
339
339
|
* Stay lobby time capped by a certain timestamp.
|
|
340
340
|
* This is to handle the case where the target end timestamp could happen before the lobby is exited,
|
|
341
341
|
* for example media-engine.ready or client.ice.end
|
|
342
|
+
* This is supposed to be called AFTER the end timestamp happens
|
|
342
343
|
* @param endTimestampKey name of the target end event
|
|
343
344
|
* @returns - latency
|
|
344
345
|
*/
|
|
345
346
|
}, {
|
|
346
347
|
key: "getStayLobbyTimeCappedBy",
|
|
347
348
|
value: function getStayLobbyTimeCappedBy(endTimestampKey) {
|
|
348
|
-
var lobbyStartTimestamp = this.latencyTimestamps.get('client.
|
|
349
|
-
|
|
349
|
+
var lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)
|
|
350
|
+
|
|
351
|
+
if (typeof lobbyStartTimestamp !== 'number') {
|
|
352
|
+
// no lobby in the meeting, stayLobbyTime is 0
|
|
353
|
+
return 0;
|
|
354
|
+
}
|
|
355
|
+
var lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)
|
|
350
356
|
var maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist
|
|
351
357
|
|
|
352
|
-
if (typeof
|
|
358
|
+
if (typeof maximumEndTimestamp !== 'number') {
|
|
359
|
+
// the provided timestamp to be used as a cap should exist, return undefined if it doesn't
|
|
353
360
|
return undefined;
|
|
354
361
|
}
|
|
355
362
|
var endTimestamp = typeof lobbyEndTimestamp === 'number' ? Math.min(lobbyEndTimestamp, maximumEndTimestamp) : maximumEndTimestamp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_webexCore","require","_lodash","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","CallDiagnosticLatencies","exports","_WebexPlugin","_this","_classCallCheck2","_len","arguments","length","args","Array","_key","concat","_defineProperty2","latencyTimestamps","_map","precomputedLatencies","_inherits2","_createClass2","key","value","clearTimestamps","clear","setMeetingId","meetingId","getMeeting","webex","meetings","getBasicMeetingInformation","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","delete","saveLatency","accumulate","existingValue","get","measureLatency","callback","_this2","start","performance","now","finally","has","getDiffBetweenTimestamps","a","b","clampValues","end","diff","_ref2","_ref2$minimum","minimum","_ref2$maximum","maximum","MAX_INTEGER","clamp","getMeetingInfoReqResp","getShowInterstitialTime","getU2CTime","u2cLatency","Math","floor","getRegisterWDMDeviceJMT","getCallInitJoinReq","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getStayLobbyTimeCappedBy","endTimestampKey","lobbyStartTimestamp","lobbyEndTimestamp","maximumEndTimestamp","endTimestamp","min","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getClickToInterstitialWithUserDelay","clickToInterstitialWithUserDelayLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialClickJoinToIceEnd","stayLobbyTimeCappedByIceEnd","getTotalJMT","clickToInterstitial","interstitialClickJoinToJoinLocusResponse","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","interstitialShowedToJoinLocusResponse","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","interstitialClickJoinToMediaEngineReady","stayLobbyTimeCappedByMediaEngineReady","getTotalMediaJMTWithUserDelay","interstitialShowedToMediaEngineReady","getClientJMT","interstitialToJoinOk","joinConfJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getShareDuration","getExchangeCITokenJMT","exchangeCITokenJMT","getRefreshCaptchaReqResp","refreshCaptchaReqResp","getDownloadIntelligenceModelsReqResp","downloadIntelligenceModelsReqResp","getOtherAppApiReqResp","otherAppApiJMT","WebexPlugin"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {clamp} from 'lodash';\n\nimport {MetricEventNames, PreComputedLatencies} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies extends WebexPlugin {\n latencyTimestamps: Map<MetricEventNames, number>;\n precomputedLatencies: Map<PreComputedLatencies, number>;\n // meetingId that the current latencies are for\n private meetingId?: string;\n private MAX_INTEGER = 2147483647;\n\n /**\n * @constructor\n */\n constructor(...args) {\n super(...args);\n this.latencyTimestamps = new Map();\n this.precomputedLatencies = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n this.precomputedLatencies.clear();\n }\n\n /**\n * Associate current latencies with a meeting id\n * @param meetingId\n */\n private setMeetingId(meetingId: string) {\n this.meetingId = meetingId;\n }\n\n /**\n * Returns the meeting object associated with current latencies\n * @returns meeting object\n */\n private getMeeting() {\n if (this.meetingId) {\n // @ts-ignore\n return this.webex.meetings.getBasicMeetingInformation(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value - value\n * @param options - store options\n * @throws\n * @returns\n */\n public saveTimestamp({\n key,\n value = new Date().getTime(),\n options = {},\n }: {\n key: MetricEventNames;\n value?: number;\n options?: {meetingId?: string};\n }) {\n // save the meetingId so we can use the meeting object in latency calculations if needed\n const {meetingId} = options;\n if (meetingId) {\n this.setMeetingId(meetingId);\n }\n // for some events we're only interested in the first timestamp not last\n // as these events can happen multiple times\n if (\n key === 'client.media.rx.start' ||\n key === 'client.media.tx.start' ||\n key === 'internal.client.meetinginfo.request' ||\n key === 'internal.client.meetinginfo.response' ||\n key === 'client.media-engine.remote-sdp-received'\n ) {\n this.saveFirstTimestampOnly(key, value);\n } else {\n this.latencyTimestamps.set(key, value);\n // new offer/answer so reset the remote SDP timestamp\n if (key === 'client.media-engine.local-sdp-generated') {\n this.latencyTimestamps.delete('client.media-engine.remote-sdp-received');\n }\n }\n }\n\n /**\n * Store precomputed latency value\n * @param key - key\n * @param value - value\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @throws\n * @returns\n */\n public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {\n const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;\n this.precomputedLatencies.set(key, value + existingValue);\n }\n\n /**\n * Measure latency for a request\n * @param callback - callback for which you would like to measure latency\n * @param key - key\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @returns\n */\n public measureLatency(\n callback: () => Promise<unknown>,\n key: PreComputedLatencies,\n accumulate = false\n ) {\n const start = performance.now();\n\n return callback().finally(() => {\n this.saveLatency(key, performance.now() - start, accumulate);\n });\n }\n\n /**\n * Store only the first timestamp value for the given key\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n saveFirstTimestampOnly(key: MetricEventNames, value: number = new Date().getTime()) {\n if (this.latencyTimestamps.has(key)) {\n return;\n }\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(\n a: MetricEventNames,\n b: MetricEventNames,\n clampValues?: {minimum?: number; maximum?: number}\n ) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n\n if (typeof start !== 'number' || typeof end !== 'number') {\n return undefined;\n }\n\n const diff = end - start;\n\n const {minimum = 0, maximum = this.MAX_INTEGER} = clampValues || {};\n\n return clamp(diff, minimum, maximum);\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response',\n {maximum: 1200000}\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * getU2CTime\n * @returns - latency\n */\n public getU2CTime() {\n const u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');\n\n return typeof u2cLatency === 'number' ? Math.floor(u2cLatency) : undefined;\n }\n\n /**\n * Device Register Time\n * @returns - latency\n */\n public getRegisterWDMDeviceJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.register.device.request',\n 'internal.register.device.response'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request',\n {maximum: 1200000}\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.request',\n 'client.locus.join.response',\n {maximum: 1200000}\n );\n }\n\n /**\n * Time taken to do turn discovery\n * @returns - latency\n */\n public getTurnDiscoveryTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.add-media.turn-discovery.start',\n 'internal.client.add-media.turn-discovery.end'\n );\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received',\n {maximum: 1200000}\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end', {maximum: 1200000});\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.lobby.exited');\n }\n\n /**\n * Stay lobby time capped by a certain timestamp.\n * This is to handle the case where the target end timestamp could happen before the lobby is exited,\n * for example media-engine.ready or client.ice.end\n * @param endTimestampKey name of the target end event\n * @returns - latency\n */\n public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {\n const lobbyStartTimestamp = this.latencyTimestamps.get('client.locus.join.response'); // must exist\n const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist\n const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist\n\n if (typeof lobbyStartTimestamp !== 'number' || typeof maximumEndTimestamp !== 'number') {\n return undefined;\n }\n\n const endTimestamp =\n typeof lobbyEndTimestamp === 'number'\n ? Math.min(lobbyEndTimestamp, maximumEndTimestamp)\n : maximumEndTimestamp;\n\n return clamp(endTimestamp - lobbyStartTimestamp, 0, this.MAX_INTEGER);\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n const latency = this.precomputedLatencies.get('internal.client.pageJMT');\n\n return typeof latency === 'number' ? clamp(latency, 0, this.MAX_INTEGER) : undefined;\n }\n\n /**\n * Download Time JMT\n * @returns - latency\n */\n public getDownloadTimeJMT() {\n const latency = this.precomputedLatencies.get('internal.download.time');\n\n return typeof latency === 'number' ? clamp(latency, 0, this.MAX_INTEGER) : undefined;\n }\n\n /**\n * Click To Interstitial\n * @returns - latency\n */\n public getClickToInterstitial() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial'\n );\n\n if (typeof clickToInterstitialLatency === 'number') {\n return clamp(clickToInterstitialLatency, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Click To Interstitial With User Delay\n * @returns - latency\n */\n public getClickToInterstitialWithUserDelay() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial.with.user.delay'\n );\n\n if (typeof clickToInterstitialWithUserDelayLatency === 'number') {\n return clamp(clickToInterstitialWithUserDelayLatency, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Call Init To MediaEngineReady\n * @returns - latency\n */\n public getCallInitMediaEngineReady() {\n return this.getInterstitialToMediaOKJMT();\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.ice.end'\n );\n const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');\n\n if (\n typeof interstitialClickJoinToIceEnd === 'number' &&\n typeof stayLobbyTimeCappedByIceEnd === 'number'\n ) {\n return clamp(\n interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitial + interstitialClickJoinToJoinLocusResponse,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Total JMT With User Delay\n * @returns - latency\n */\n public getTotalJMTWithUserDelay() {\n const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();\n const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.response'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return clamp(joinReqResp + ICESetupTime, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToMediaEngineReady === 'number' &&\n typeof stayLobbyTimeCappedByMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitial +\n interstitialClickJoinToMediaEngineReady -\n stayLobbyTimeCappedByMediaEngineReady,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT With User Delay\n * @returns - latency\n */\n public getTotalMediaJMTWithUserDelay() {\n const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();\n const interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToMediaEngineReady,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (typeof interstitialToJoinOk === 'number' && typeof joinConfJMT === 'number') {\n return clamp(interstitialToJoinOk - joinConfJMT, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Total latency for all get cluster request.\n */\n public getReachabilityClustersReqResp() {\n const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');\n\n return typeof reachablityClusterReqResp === 'number'\n ? clamp(Math.floor(reachablityClusterReqResp), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Time from share initiation to share stop (ms).\n */\n public getShareDuration() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.share.initiated',\n 'internal.client.share.stopped'\n );\n }\n\n /**\n * Total latency for all exchange ci token.\n */\n public getExchangeCITokenJMT() {\n const exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');\n\n return typeof exchangeCITokenJMT === 'number'\n ? clamp(Math.floor(exchangeCITokenJMT), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Total latency for all refresh captcha requests.\n */\n public getRefreshCaptchaReqResp() {\n const refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');\n\n return typeof refreshCaptchaReqResp === 'number'\n ? clamp(Math.floor(refreshCaptchaReqResp), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Get the latency for downloading intelligence models.\n * @returns - latency\n */\n public getDownloadIntelligenceModelsReqResp() {\n const downloadIntelligenceModelsReqResp = this.precomputedLatencies.get(\n 'internal.api.fetch.intelligence.models'\n );\n\n return typeof downloadIntelligenceModelsReqResp === 'number'\n ? clamp(Math.floor(downloadIntelligenceModelsReqResp), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Get the total latency for all other app API requests.\n * Excludes meeting info, because it's measured separately.\n * @returns - latency\n */\n public getOtherAppApiReqResp() {\n const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');\n\n return otherAppApiJMT > 0 ? clamp(Math.floor(otherAppApiJMT), 0, this.MAX_INTEGER) : undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_webexCore","require","_lodash","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","CallDiagnosticLatencies","exports","_WebexPlugin","_this","_classCallCheck2","_len","arguments","length","args","Array","_key","concat","_defineProperty2","latencyTimestamps","_map","precomputedLatencies","_inherits2","_createClass2","key","value","clearTimestamps","clear","setMeetingId","meetingId","getMeeting","webex","meetings","getBasicMeetingInformation","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","delete","saveLatency","accumulate","existingValue","get","measureLatency","callback","_this2","start","performance","now","finally","has","getDiffBetweenTimestamps","a","b","clampValues","end","diff","_ref2","_ref2$minimum","minimum","_ref2$maximum","maximum","MAX_INTEGER","clamp","getMeetingInfoReqResp","getShowInterstitialTime","getU2CTime","u2cLatency","Math","floor","getRegisterWDMDeviceJMT","getCallInitJoinReq","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getStayLobbyTimeCappedBy","endTimestampKey","lobbyStartTimestamp","lobbyEndTimestamp","maximumEndTimestamp","endTimestamp","min","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getClickToInterstitialWithUserDelay","clickToInterstitialWithUserDelayLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialClickJoinToIceEnd","stayLobbyTimeCappedByIceEnd","getTotalJMT","clickToInterstitial","interstitialClickJoinToJoinLocusResponse","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","interstitialShowedToJoinLocusResponse","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","interstitialClickJoinToMediaEngineReady","stayLobbyTimeCappedByMediaEngineReady","getTotalMediaJMTWithUserDelay","interstitialShowedToMediaEngineReady","getClientJMT","interstitialToJoinOk","joinConfJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getShareDuration","getExchangeCITokenJMT","exchangeCITokenJMT","getRefreshCaptchaReqResp","refreshCaptchaReqResp","getDownloadIntelligenceModelsReqResp","downloadIntelligenceModelsReqResp","getOtherAppApiReqResp","otherAppApiJMT","WebexPlugin"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {clamp} from 'lodash';\n\nimport {MetricEventNames, PreComputedLatencies} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies extends WebexPlugin {\n latencyTimestamps: Map<MetricEventNames, number>;\n precomputedLatencies: Map<PreComputedLatencies, number>;\n // meetingId that the current latencies are for\n private meetingId?: string;\n private MAX_INTEGER = 2147483647;\n\n /**\n * @constructor\n */\n constructor(...args) {\n super(...args);\n this.latencyTimestamps = new Map();\n this.precomputedLatencies = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n this.precomputedLatencies.clear();\n }\n\n /**\n * Associate current latencies with a meeting id\n * @param meetingId\n */\n private setMeetingId(meetingId: string) {\n this.meetingId = meetingId;\n }\n\n /**\n * Returns the meeting object associated with current latencies\n * @returns meeting object\n */\n private getMeeting() {\n if (this.meetingId) {\n // @ts-ignore\n return this.webex.meetings.getBasicMeetingInformation(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value - value\n * @param options - store options\n * @throws\n * @returns\n */\n public saveTimestamp({\n key,\n value = new Date().getTime(),\n options = {},\n }: {\n key: MetricEventNames;\n value?: number;\n options?: {meetingId?: string};\n }) {\n // save the meetingId so we can use the meeting object in latency calculations if needed\n const {meetingId} = options;\n if (meetingId) {\n this.setMeetingId(meetingId);\n }\n // for some events we're only interested in the first timestamp not last\n // as these events can happen multiple times\n if (\n key === 'client.media.rx.start' ||\n key === 'client.media.tx.start' ||\n key === 'internal.client.meetinginfo.request' ||\n key === 'internal.client.meetinginfo.response' ||\n key === 'client.media-engine.remote-sdp-received'\n ) {\n this.saveFirstTimestampOnly(key, value);\n } else {\n this.latencyTimestamps.set(key, value);\n // new offer/answer so reset the remote SDP timestamp\n if (key === 'client.media-engine.local-sdp-generated') {\n this.latencyTimestamps.delete('client.media-engine.remote-sdp-received');\n }\n }\n }\n\n /**\n * Store precomputed latency value\n * @param key - key\n * @param value - value\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @throws\n * @returns\n */\n public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {\n const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;\n this.precomputedLatencies.set(key, value + existingValue);\n }\n\n /**\n * Measure latency for a request\n * @param callback - callback for which you would like to measure latency\n * @param key - key\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @returns\n */\n public measureLatency(\n callback: () => Promise<unknown>,\n key: PreComputedLatencies,\n accumulate = false\n ) {\n const start = performance.now();\n\n return callback().finally(() => {\n this.saveLatency(key, performance.now() - start, accumulate);\n });\n }\n\n /**\n * Store only the first timestamp value for the given key\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n saveFirstTimestampOnly(key: MetricEventNames, value: number = new Date().getTime()) {\n if (this.latencyTimestamps.has(key)) {\n return;\n }\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(\n a: MetricEventNames,\n b: MetricEventNames,\n clampValues?: {minimum?: number; maximum?: number}\n ) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n\n if (typeof start !== 'number' || typeof end !== 'number') {\n return undefined;\n }\n\n const diff = end - start;\n\n const {minimum = 0, maximum = this.MAX_INTEGER} = clampValues || {};\n\n return clamp(diff, minimum, maximum);\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response',\n {maximum: 1200000}\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * getU2CTime\n * @returns - latency\n */\n public getU2CTime() {\n const u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');\n\n return typeof u2cLatency === 'number' ? Math.floor(u2cLatency) : undefined;\n }\n\n /**\n * Device Register Time\n * @returns - latency\n */\n public getRegisterWDMDeviceJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.register.device.request',\n 'internal.register.device.response'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request',\n {maximum: 1200000}\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.request',\n 'client.locus.join.response',\n {maximum: 1200000}\n );\n }\n\n /**\n * Time taken to do turn discovery\n * @returns - latency\n */\n public getTurnDiscoveryTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.add-media.turn-discovery.start',\n 'internal.client.add-media.turn-discovery.end'\n );\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received',\n {maximum: 1200000}\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end', {maximum: 1200000});\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps('client.lobby.entered', 'client.lobby.exited');\n }\n\n /**\n * Stay lobby time capped by a certain timestamp.\n * This is to handle the case where the target end timestamp could happen before the lobby is exited,\n * for example media-engine.ready or client.ice.end\n * This is supposed to be called AFTER the end timestamp happens\n * @param endTimestampKey name of the target end event\n * @returns - latency\n */\n public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {\n const lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)\n\n if (typeof lobbyStartTimestamp !== 'number') {\n // no lobby in the meeting, stayLobbyTime is 0\n return 0;\n }\n\n const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)\n const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist\n\n if (typeof maximumEndTimestamp !== 'number') {\n // the provided timestamp to be used as a cap should exist, return undefined if it doesn't\n return undefined;\n }\n\n const endTimestamp =\n typeof lobbyEndTimestamp === 'number'\n ? Math.min(lobbyEndTimestamp, maximumEndTimestamp)\n : maximumEndTimestamp;\n\n return clamp(endTimestamp - lobbyStartTimestamp, 0, this.MAX_INTEGER);\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n const latency = this.precomputedLatencies.get('internal.client.pageJMT');\n\n return typeof latency === 'number' ? clamp(latency, 0, this.MAX_INTEGER) : undefined;\n }\n\n /**\n * Download Time JMT\n * @returns - latency\n */\n public getDownloadTimeJMT() {\n const latency = this.precomputedLatencies.get('internal.download.time');\n\n return typeof latency === 'number' ? clamp(latency, 0, this.MAX_INTEGER) : undefined;\n }\n\n /**\n * Click To Interstitial\n * @returns - latency\n */\n public getClickToInterstitial() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial'\n );\n\n if (typeof clickToInterstitialLatency === 'number') {\n return clamp(clickToInterstitialLatency, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Click To Interstitial With User Delay\n * @returns - latency\n */\n public getClickToInterstitialWithUserDelay() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial.with.user.delay'\n );\n\n if (typeof clickToInterstitialWithUserDelayLatency === 'number') {\n return clamp(clickToInterstitialWithUserDelayLatency, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Call Init To MediaEngineReady\n * @returns - latency\n */\n public getCallInitMediaEngineReady() {\n return this.getInterstitialToMediaOKJMT();\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.ice.end'\n );\n const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');\n\n if (\n typeof interstitialClickJoinToIceEnd === 'number' &&\n typeof stayLobbyTimeCappedByIceEnd === 'number'\n ) {\n return clamp(\n interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitial + interstitialClickJoinToJoinLocusResponse,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Total JMT With User Delay\n * @returns - latency\n */\n public getTotalJMTWithUserDelay() {\n const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();\n const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.response'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return clamp(joinReqResp + ICESetupTime, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToMediaEngineReady === 'number' &&\n typeof stayLobbyTimeCappedByMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitial +\n interstitialClickJoinToMediaEngineReady -\n stayLobbyTimeCappedByMediaEngineReady,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT With User Delay\n * @returns - latency\n */\n public getTotalMediaJMTWithUserDelay() {\n const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();\n const interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToMediaEngineReady,\n 0,\n this.MAX_INTEGER\n );\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (typeof interstitialToJoinOk === 'number' && typeof joinConfJMT === 'number') {\n return clamp(interstitialToJoinOk - joinConfJMT, 0, this.MAX_INTEGER);\n }\n\n return undefined;\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Total latency for all get cluster request.\n */\n public getReachabilityClustersReqResp() {\n const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');\n\n return typeof reachablityClusterReqResp === 'number'\n ? clamp(Math.floor(reachablityClusterReqResp), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Time from share initiation to share stop (ms).\n */\n public getShareDuration() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.share.initiated',\n 'internal.client.share.stopped'\n );\n }\n\n /**\n * Total latency for all exchange ci token.\n */\n public getExchangeCITokenJMT() {\n const exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');\n\n return typeof exchangeCITokenJMT === 'number'\n ? clamp(Math.floor(exchangeCITokenJMT), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Total latency for all refresh captcha requests.\n */\n public getRefreshCaptchaReqResp() {\n const refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');\n\n return typeof refreshCaptchaReqResp === 'number'\n ? clamp(Math.floor(refreshCaptchaReqResp), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Get the latency for downloading intelligence models.\n * @returns - latency\n */\n public getDownloadIntelligenceModelsReqResp() {\n const downloadIntelligenceModelsReqResp = this.precomputedLatencies.get(\n 'internal.api.fetch.intelligence.models'\n );\n\n return typeof downloadIntelligenceModelsReqResp === 'number'\n ? clamp(Math.floor(downloadIntelligenceModelsReqResp), 0, this.MAX_INTEGER)\n : undefined;\n }\n\n /**\n * Get the total latency for all other app API requests.\n * Excludes meeting info, because it's measured separately.\n * @returns - latency\n */\n public getOtherAppApiReqResp() {\n const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');\n\n return otherAppApiJMT > 0 ? clamp(Math.floor(otherAppApiJMT), 0, this.MAX_INTEGER) : undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/metrics.js
CHANGED
|
@@ -153,6 +153,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
153
153
|
* Stay lobby time capped by a certain timestamp.
|
|
154
154
|
* This is to handle the case where the target end timestamp could happen before the lobby is exited,
|
|
155
155
|
* for example media-engine.ready or client.ice.end
|
|
156
|
+
* This is supposed to be called AFTER the end timestamp happens
|
|
156
157
|
* @param endTimestampKey name of the target end event
|
|
157
158
|
* @returns - latency
|
|
158
159
|
*/
|
package/package.json
CHANGED
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@webex/common-timers": "3.11.0-next.1",
|
|
41
41
|
"@webex/test-helper-chai": "3.11.0-next.1",
|
|
42
42
|
"@webex/test-helper-mock-webex": "3.11.0-next.1",
|
|
43
|
-
"@webex/webex-core": "3.12.0-next.
|
|
43
|
+
"@webex/webex-core": "3.12.0-next.9",
|
|
44
44
|
"ip-anonymize": "^0.1.0",
|
|
45
45
|
"lodash": "^4.17.21",
|
|
46
46
|
"uuid": "^3.3.2"
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"test:style": "eslint ./src/**/*.*",
|
|
54
54
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
55
55
|
},
|
|
56
|
-
"version": "3.12.0-next.
|
|
56
|
+
"version": "3.12.0-next.9"
|
|
57
57
|
}
|
|
@@ -303,22 +303,30 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
303
303
|
* @returns - latency
|
|
304
304
|
*/
|
|
305
305
|
public getStayLobbyTime() {
|
|
306
|
-
return this.getDiffBetweenTimestamps('client.
|
|
306
|
+
return this.getDiffBetweenTimestamps('client.lobby.entered', 'client.lobby.exited');
|
|
307
307
|
}
|
|
308
308
|
|
|
309
309
|
/**
|
|
310
310
|
* Stay lobby time capped by a certain timestamp.
|
|
311
311
|
* This is to handle the case where the target end timestamp could happen before the lobby is exited,
|
|
312
312
|
* for example media-engine.ready or client.ice.end
|
|
313
|
+
* This is supposed to be called AFTER the end timestamp happens
|
|
313
314
|
* @param endTimestampKey name of the target end event
|
|
314
315
|
* @returns - latency
|
|
315
316
|
*/
|
|
316
317
|
public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {
|
|
317
|
-
const lobbyStartTimestamp = this.latencyTimestamps.get('client.
|
|
318
|
-
|
|
318
|
+
const lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)
|
|
319
|
+
|
|
320
|
+
if (typeof lobbyStartTimestamp !== 'number') {
|
|
321
|
+
// no lobby in the meeting, stayLobbyTime is 0
|
|
322
|
+
return 0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)
|
|
319
326
|
const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist
|
|
320
327
|
|
|
321
|
-
if (typeof
|
|
328
|
+
if (typeof maximumEndTimestamp !== 'number') {
|
|
329
|
+
// the provided timestamp to be used as a cap should exist, return undefined if it doesn't
|
|
322
330
|
return undefined;
|
|
323
331
|
}
|
|
324
332
|
|
|
@@ -509,7 +509,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
509
509
|
|
|
510
510
|
it('calculates getStayLobbyTime correctly', () => {
|
|
511
511
|
cdl.saveTimestamp({
|
|
512
|
-
key: 'client.
|
|
512
|
+
key: 'client.lobby.entered',
|
|
513
513
|
value: 10,
|
|
514
514
|
});
|
|
515
515
|
cdl.saveTimestamp({
|
|
@@ -520,44 +520,44 @@ describe('internal-plugin-metrics', () => {
|
|
|
520
520
|
});
|
|
521
521
|
|
|
522
522
|
describe('getStayLobbyTimeCappedBy', () => {
|
|
523
|
-
it('returns
|
|
523
|
+
it('returns 0 when lobbyStartTimestamp is missing', () => {
|
|
524
524
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 100});
|
|
525
|
-
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'),
|
|
525
|
+
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), 0);
|
|
526
526
|
});
|
|
527
527
|
|
|
528
528
|
it('returns undefined when endTimestampKey is missing', () => {
|
|
529
|
-
cdl.saveTimestamp({key: 'client.
|
|
529
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 10});
|
|
530
530
|
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), undefined);
|
|
531
531
|
});
|
|
532
532
|
|
|
533
533
|
it('uses maximumEndTimestamp when lobby end does not exist', () => {
|
|
534
|
-
cdl.saveTimestamp({key: 'client.
|
|
534
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 10});
|
|
535
535
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
536
536
|
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), 40);
|
|
537
537
|
});
|
|
538
538
|
|
|
539
539
|
it('uses lobby end when it is before maximumEndTimestamp', () => {
|
|
540
|
-
cdl.saveTimestamp({key: 'client.
|
|
540
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 10});
|
|
541
541
|
cdl.saveTimestamp({key: 'client.lobby.exited', value: 30});
|
|
542
542
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
543
543
|
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), 20);
|
|
544
544
|
});
|
|
545
545
|
|
|
546
546
|
it('uses maximumEndTimestamp when lobby end is after it', () => {
|
|
547
|
-
cdl.saveTimestamp({key: 'client.
|
|
547
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 10});
|
|
548
548
|
cdl.saveTimestamp({key: 'client.lobby.exited', value: 60});
|
|
549
549
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
550
550
|
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), 40);
|
|
551
551
|
});
|
|
552
552
|
|
|
553
553
|
it('clamps to 0 when result would be negative', () => {
|
|
554
|
-
cdl.saveTimestamp({key: 'client.
|
|
554
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 100});
|
|
555
555
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
556
556
|
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), 0);
|
|
557
557
|
});
|
|
558
558
|
|
|
559
559
|
it('clamps to MAX_INTEGER when result is very large', () => {
|
|
560
|
-
cdl.saveTimestamp({key: 'client.
|
|
560
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 0});
|
|
561
561
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 2147483648});
|
|
562
562
|
assert.deepEqual(cdl.getStayLobbyTimeCappedBy('client.media-engine.ready'), 2147483647);
|
|
563
563
|
});
|
|
@@ -852,7 +852,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
852
852
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
853
853
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
854
854
|
// interstitialClickJoinToMediaEngineReady = 50 - 10 = 40
|
|
855
|
-
cdl.saveTimestamp({key: 'client.
|
|
855
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 20});
|
|
856
856
|
cdl.saveTimestamp({key: 'client.lobby.exited', value: 30});
|
|
857
857
|
// stayLobbyTimeCappedByMediaEngineReady = min(30, 50) - 20 = 10
|
|
858
858
|
// total = 3 + 40 - 10 = 33
|
|
@@ -866,11 +866,9 @@ describe('internal-plugin-metrics', () => {
|
|
|
866
866
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
867
867
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
868
868
|
// interstitialClickJoinToMediaEngineReady = 40
|
|
869
|
-
|
|
870
|
-
//
|
|
871
|
-
|
|
872
|
-
// total = 3 + 40 - 30 = 13
|
|
873
|
-
assert.deepEqual(cdl.getTotalMediaJMT(), 13);
|
|
869
|
+
// no client.lobby.entered → stayLobbyTimeCappedByMediaEngineReady = 0
|
|
870
|
+
// total = 3 + 40 - 0 = 43
|
|
871
|
+
assert.deepEqual(cdl.getTotalMediaJMT(), 43);
|
|
874
872
|
});
|
|
875
873
|
|
|
876
874
|
it('calculates getTotalMediaJMT correctly with lobby exiting after media-engine.ready', () => {
|
|
@@ -880,7 +878,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
880
878
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
881
879
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
882
880
|
// interstitialClickJoinToMediaEngineReady = 40
|
|
883
|
-
cdl.saveTimestamp({key: 'client.
|
|
881
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 20});
|
|
884
882
|
cdl.saveTimestamp({key: 'client.lobby.exited', value: 60});
|
|
885
883
|
// stayLobbyTimeCappedByMediaEngineReady = min(60, 50) - 20 = 30
|
|
886
884
|
// total = 3 + 40 - 30 = 13
|
|
@@ -892,7 +890,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
892
890
|
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
893
891
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
894
892
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 4294967400});
|
|
895
|
-
cdl.saveTimestamp({key: 'client.
|
|
893
|
+
cdl.saveTimestamp({key: 'client.lobby.entered', value: 28});
|
|
896
894
|
cdl.saveTimestamp({key: 'client.lobby.exited', value: 30});
|
|
897
895
|
assert.deepEqual(cdl.getTotalMediaJMT(), 2147483647);
|
|
898
896
|
});
|
|
@@ -905,6 +903,18 @@ describe('internal-plugin-metrics', () => {
|
|
|
905
903
|
assert.deepEqual(cdl.getTotalMediaJMT(), undefined);
|
|
906
904
|
});
|
|
907
905
|
|
|
906
|
+
it('calculates getTotalMediaJMT correctly when there is no lobby and stayLobbyTime defaults to 0', () => {
|
|
907
|
+
cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
|
|
908
|
+
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
909
|
+
// clickToInterstitial = 8 - 5 = 3
|
|
910
|
+
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
911
|
+
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
912
|
+
// interstitialClickJoinToMediaEngineReady = 50 - 10 = 40
|
|
913
|
+
// no client.lobby.entered → stayLobbyTimeCappedByMediaEngineReady = 0
|
|
914
|
+
// total = 3 + 40 - 0 = 43
|
|
915
|
+
assert.deepEqual(cdl.getTotalMediaJMT(), 43);
|
|
916
|
+
});
|
|
917
|
+
|
|
908
918
|
it('calculates getTotalMediaJMTWithUserDelay correctly', () => {
|
|
909
919
|
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 7);
|
|
910
920
|
// clickToInterstitialWithUserDelay = 7
|
|
@@ -1058,7 +1068,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1058
1068
|
value: 4,
|
|
1059
1069
|
});
|
|
1060
1070
|
cdl.saveTimestamp({
|
|
1061
|
-
key: 'client.
|
|
1071
|
+
key: 'client.lobby.entered',
|
|
1062
1072
|
value: 10,
|
|
1063
1073
|
});
|
|
1064
1074
|
cdl.saveTimestamp({
|
|
@@ -1078,7 +1088,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1078
1088
|
value: 4,
|
|
1079
1089
|
});
|
|
1080
1090
|
cdl.saveTimestamp({
|
|
1081
|
-
key: 'client.
|
|
1091
|
+
key: 'client.lobby.entered',
|
|
1082
1092
|
value: 10,
|
|
1083
1093
|
});
|
|
1084
1094
|
cdl.saveTimestamp({
|
|
@@ -1098,14 +1108,26 @@ describe('internal-plugin-metrics', () => {
|
|
|
1098
1108
|
value: 4,
|
|
1099
1109
|
});
|
|
1100
1110
|
cdl.saveTimestamp({
|
|
1101
|
-
key: 'client.
|
|
1102
|
-
value:
|
|
1111
|
+
key: 'client.ice.end',
|
|
1112
|
+
value: 14,
|
|
1113
|
+
});
|
|
1114
|
+
// no client.lobby.entered → stayLobbyTimeCappedByIceEnd = 0
|
|
1115
|
+
// result = (14 - 4) - 0 = 10
|
|
1116
|
+
assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
|
|
1117
|
+
});
|
|
1118
|
+
|
|
1119
|
+
it('calculates getInterstitialToMediaOKJMT correctly when there is no lobby and stayLobbyTime defaults to 0', () => {
|
|
1120
|
+
cdl.saveTimestamp({
|
|
1121
|
+
key: 'internal.client.interstitial-window.click.joinbutton',
|
|
1122
|
+
value: 4,
|
|
1103
1123
|
});
|
|
1104
1124
|
cdl.saveTimestamp({
|
|
1105
1125
|
key: 'client.ice.end',
|
|
1106
1126
|
value: 14,
|
|
1107
1127
|
});
|
|
1108
|
-
|
|
1128
|
+
// no client.lobby.entered → stayLobbyTimeCappedByIceEnd = 0
|
|
1129
|
+
// result = (14 - 4) - 0 = 10
|
|
1130
|
+
assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
|
|
1109
1131
|
});
|
|
1110
1132
|
|
|
1111
1133
|
it('calculates getShareDuration correctly', () => {
|