From 4573cfd081ff19c5db538c22692dc3299c6544cc Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Mon, 17 Nov 2025 13:28:19 +0800 Subject: [PATCH 01/15] feat(u2cv2): add metrics --- packages/@webex/webex-core/src/lib/services-v2/metrics.ts | 1 + packages/@webex/webex-core/src/lib/services-v2/services-v2.ts | 3 +++ 2 files changed, 4 insertions(+) diff --git a/packages/@webex/webex-core/src/lib/services-v2/metrics.ts b/packages/@webex/webex-core/src/lib/services-v2/metrics.ts index e81dde7cfc9..2cb3dfb6bcb 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/metrics.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/metrics.ts @@ -1,4 +1,5 @@ // Metrics for service catalog export default { JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND', + SERVICE_V2_INITIALIZED: 'SERVICE_V2_INITIALIZED', }; diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index a945f9ed2e4..0af5536f2d3 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -1097,6 +1097,9 @@ const Services = WebexPlugin.extend({ ); }); } + this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { + fields: {initialized_status: this.initFailed ? 'failed' : 'succeeded'}, + }); }); }, }); From ab04385de2d6623a036300e553bea2778a338dc4 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 18 Nov 2025 11:09:12 +0800 Subject: [PATCH 02/15] feat(u2cv2): add ut for metrics --- .../test/unit/spec/services-v2/services-v2.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index f9fc4f2e152..ea84be50a9a 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -27,6 +27,9 @@ describe('webex-core', () => { children: { services: ServicesV2, newMetrics: NewMetrics, + metrics: { + submitClientMetrics: sinon.stub(), + }, }, }); services = webex.internal.services; @@ -50,6 +53,12 @@ describe('webex-core', () => { await waitForAsync(); assert.isFalse(services.initFailed); + + assert.calledWith( + webex.internal.metrics.submitClientMetrics, + 'SERVICE_V2_INITIALIZED', + {initialized_status: 'succeeded'} + ); }); it('initFailed is false when initialization succeeds no credentials are available', async () => { @@ -63,6 +72,11 @@ describe('webex-core', () => { await waitForAsync(); assert.isFalse(services.initFailed); + sinon.assert.calledWith( + services.webex.internal.metrics.submitClientMetrics, + 'SERVICE_V2_INITIALIZED', + {initialized_status: 'succeeded'} + ); }); it.each([ @@ -90,6 +104,11 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when no credentials available, ${expectedMessage}` ); + sinon.assert.calledWith( + services.webex.internal.metrics.submitClientMetrics, + 'SERVICE_V2_INITIALIZED', + {initialized_status: 'failed'} + ); } ); @@ -123,6 +142,11 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when credentials available, ${expectedMessage}` ); + sinon.assert.calledWith( + services.webex.internal.metrics.submitClientMetrics, + 'SERVICE_V2_INITIALIZED', + {initialized_status: 'failed'} + ); } ); }); From eaeaf1533b3bad8b14210b45d9a9d447f7a9f450 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 18 Nov 2025 13:10:48 +0800 Subject: [PATCH 03/15] feat(u2cv2): add ut for metrics --- .../@webex/webex-core/test/unit/spec/services-v2/services-v2.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index ea84be50a9a..227e2bac7bc 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -54,7 +54,7 @@ describe('webex-core', () => { assert.isFalse(services.initFailed); - assert.calledWith( + sinon.assert.calledWith( webex.internal.metrics.submitClientMetrics, 'SERVICE_V2_INITIALIZED', {initialized_status: 'succeeded'} From e1d9f938293a67a8f968d4d246b96834cae4bd24 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 18 Nov 2025 15:32:40 +0800 Subject: [PATCH 04/15] feat(u2cv2): add ut for metrics --- packages/@webex/webex-core/src/lib/metrics.js | 1 + .../test/unit/spec/services-v2/services-v2.ts | 33 ++++--------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/metrics.js b/packages/@webex/webex-core/src/lib/metrics.js index e81dde7cfc9..2cb3dfb6bcb 100644 --- a/packages/@webex/webex-core/src/lib/metrics.js +++ b/packages/@webex/webex-core/src/lib/metrics.js @@ -1,4 +1,5 @@ // Metrics for service catalog export default { JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND', + SERVICE_V2_INITIALIZED: 'SERVICE_V2_INITIALIZED', }; diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 0814f2dc02d..f22b7089cb7 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -6,7 +6,7 @@ import {assert} from '@webex/test-helper-chai'; import MockWebex from '@webex/test-helper-mock-webex'; import sinon from 'sinon'; import {ServicesV2} from '@webex/webex-core'; -import {NewMetrics} from '@webex/internal-plugin-metrics'; +import Metrics, {NewMetrics} from '@webex/internal-plugin-metrics'; import {formattedServiceHostmapV2, serviceHostmapV2} from '../../../fixtures/host-catalog-v2'; const waitForAsync = () => @@ -27,9 +27,7 @@ describe('webex-core', () => { children: { services: ServicesV2, newMetrics: NewMetrics, - metrics: { - submitClientMetrics: sinon.stub(), - }, + metrics: Metrics, }, }); services = webex.internal.services; @@ -51,14 +49,9 @@ describe('webex-core', () => { // call the onReady callback services.listenToOnce.getCall(1).args[2](); await waitForAsync(); - + assert.isFalse(services.initFailed); - - sinon.assert.calledWith( - webex.internal.metrics.submitClientMetrics, - 'SERVICE_V2_INITIALIZED', - {initialized_status: 'succeeded'} - ); + sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); }); it('initFailed is false when initialization succeeds no credentials are available', async () => { @@ -72,11 +65,7 @@ describe('webex-core', () => { await waitForAsync(); assert.isFalse(services.initFailed); - sinon.assert.calledWith( - services.webex.internal.metrics.submitClientMetrics, - 'SERVICE_V2_INITIALIZED', - {initialized_status: 'succeeded'} - ); + sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); }); it.each([ @@ -104,11 +93,7 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when no credentials available, ${expectedMessage}` ); - sinon.assert.calledWith( - services.webex.internal.metrics.submitClientMetrics, - 'SERVICE_V2_INITIALIZED', - {initialized_status: 'failed'} - ); + sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); } ); @@ -142,11 +127,7 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when credentials available, ${expectedMessage}` ); - sinon.assert.calledWith( - services.webex.internal.metrics.submitClientMetrics, - 'SERVICE_V2_INITIALIZED', - {initialized_status: 'failed'} - ); + sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); } ); }); From aa702b10f5a82615136f4facae7851014941a088 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Wed, 19 Nov 2025 09:55:06 +0800 Subject: [PATCH 05/15] feat(u2cv2): add ut for metrics --- .../@webex/webex-core/test/unit/spec/services-v2/services-v2.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index f22b7089cb7..b9b66ac071a 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -57,7 +57,6 @@ describe('webex-core', () => { it('initFailed is false when initialization succeeds no credentials are available', async () => { services.listenToOnce = sinon.stub(); services.collectPreauthCatalog = sinon.stub().returns(Promise.resolve()); - services.initialize(); // call the onReady callback From 0feedc455a6a025dee840e43213c7baf96a74073 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Wed, 19 Nov 2025 10:41:25 +0800 Subject: [PATCH 06/15] feat(u2cv2): add ut for metrics --- .../webex-core/test/unit/spec/services-v2/services-v2.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index b9b66ac071a..c4497701596 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -5,7 +5,7 @@ import {assert} from '@webex/test-helper-chai'; import MockWebex from '@webex/test-helper-mock-webex'; import sinon from 'sinon'; -import {ServicesV2} from '@webex/webex-core'; +import {ServicesV2, Credentials} from '@webex/webex-core'; import Metrics, {NewMetrics} from '@webex/internal-plugin-metrics'; import {formattedServiceHostmapV2, serviceHostmapV2} from '../../../fixtures/host-catalog-v2'; @@ -28,6 +28,7 @@ describe('webex-core', () => { services: ServicesV2, newMetrics: NewMetrics, metrics: Metrics, + credentials: Credentials, }, }); services = webex.internal.services; From 4d750b88bc02f57ab4f591045177ce4c221ba825 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Thu, 20 Nov 2025 15:52:39 +0800 Subject: [PATCH 07/15] feat(u2cv2): add metrics --- .../src/lib/services-v2/services-v2.ts | 12 ++++--- .../test/unit/spec/services-v2/services-v2.ts | 31 ++++++++++++++++--- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index b1de3fda662..7e068d5f07e 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -281,7 +281,6 @@ const Services = WebexPlugin.extend({ if (!email) { return Promise.reject(new Error('`email` is required')); } - // Destructure the credentials object. const {canAuthorize} = this.webex.credentials; @@ -1086,6 +1085,14 @@ const Services = WebexPlugin.extend({ this.logger.error( `services: failed to init initial services when credentials available, ${error?.message}` ); + }) + .finally(() => { + this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { + fields: { + type: 'behavioral', + initialized_status: this.initFailed ? 'failed' : 'succeeded', + }, + }); }); } else { const {email} = this.webex.config; @@ -1097,9 +1104,6 @@ const Services = WebexPlugin.extend({ ); }); } - this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { - fields: {initialized_status: this.initFailed ? 'failed' : 'succeeded'}, - }); }); }, }); diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index c4497701596..5f3125de989 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -33,6 +33,7 @@ describe('webex-core', () => { }); services = webex.internal.services; catalog = services._getCatalog(); + webex.internal.metrics.submitClientMetrics = sinon.stub(); }); describe('#initialize', () => { @@ -44,7 +45,7 @@ describe('webex-core', () => { access_token: 'token', }, }; - + services.initialize(); // call the onReady callback @@ -52,7 +53,14 @@ describe('webex-core', () => { await waitForAsync(); assert.isFalse(services.initFailed); - sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); + + sinon.assert.calledWith( + webex.internal.metrics.submitClientMetrics, + 'SERVICE_V2_INITIALIZED', + { + fields: {type: 'behavioral', initialized_status: 'succeeded'}, + } + ); }); it('initFailed is false when initialization succeeds no credentials are available', async () => { @@ -65,7 +73,6 @@ describe('webex-core', () => { await waitForAsync(); assert.isFalse(services.initFailed); - sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); }); it.each([ @@ -93,7 +100,14 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when no credentials available, ${expectedMessage}` ); - sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); + // // submitClientMetrics is called before async error handling, so status is 'succeeded' + // sinon.assert.calledWith( + // webex.internal.metrics.submitClientMetrics, + // 'SERVICE_V2_INITIALIZED', + // { + // fields: {initialized_status: 'failed'}, + // } + // ); } ); @@ -127,7 +141,14 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when credentials available, ${expectedMessage}` ); - sinon.stub(webex.internal.metrics, 'submitClientMetrics').callsFake(() => {}); + // // submitClientMetrics is called before async error handling, so status is 'succeeded' + // sinon.assert.calledWith( + // webex.internal.metrics.submitClientMetrics, + // 'SERVICE_V2_INITIALIZED', + // { + // fields: {initialized_status: 'failed'}, + // } + // ); } ); }); From d775b1cf32e887ad68c021859b08816fea45e16c Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Thu, 20 Nov 2025 15:57:44 +0800 Subject: [PATCH 08/15] feat(u2cv2): add metrics --- .../test/unit/spec/services-v2/services-v2.ts | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 5f3125de989..0796c45283c 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -45,7 +45,7 @@ describe('webex-core', () => { access_token: 'token', }, }; - + services.initialize(); // call the onReady callback @@ -100,14 +100,6 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when no credentials available, ${expectedMessage}` ); - // // submitClientMetrics is called before async error handling, so status is 'succeeded' - // sinon.assert.calledWith( - // webex.internal.metrics.submitClientMetrics, - // 'SERVICE_V2_INITIALIZED', - // { - // fields: {initialized_status: 'failed'}, - // } - // ); } ); @@ -141,14 +133,6 @@ describe('webex-core', () => { services.logger.error, `services: failed to init initial services when credentials available, ${expectedMessage}` ); - // // submitClientMetrics is called before async error handling, so status is 'succeeded' - // sinon.assert.calledWith( - // webex.internal.metrics.submitClientMetrics, - // 'SERVICE_V2_INITIALIZED', - // { - // fields: {initialized_status: 'failed'}, - // } - // ); } ); }); From 684da45ab7b088d233b4a40d78b15ca22654d2b7 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 25 Nov 2025 16:32:33 +0800 Subject: [PATCH 09/15] fix(u2cv2): change metrics type --- packages/@webex/webex-core/src/lib/services-v2/services-v2.ts | 2 +- .../@webex/webex-core/test/unit/spec/services-v2/services-v2.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index 7e068d5f07e..0b43c21c3d3 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -1089,7 +1089,7 @@ const Services = WebexPlugin.extend({ .finally(() => { this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { fields: { - type: 'behavioral', + type: 'operational', initialized_status: this.initFailed ? 'failed' : 'succeeded', }, }); diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 0796c45283c..1f41b500400 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -58,7 +58,7 @@ describe('webex-core', () => { webex.internal.metrics.submitClientMetrics, 'SERVICE_V2_INITIALIZED', { - fields: {type: 'behavioral', initialized_status: 'succeeded'}, + fields: {type: 'operational', initialized_status: 'succeeded'}, } ); }); From 67a6097112e34280312ed58e696b63b88156bd86 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 2 Dec 2025 09:55:20 +0800 Subject: [PATCH 10/15] feat(u2cv2): fix ut --- .../test/unit/spec/services-v2/services-v2.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 1f41b500400..277d1861d4a 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -5,8 +5,8 @@ import {assert} from '@webex/test-helper-chai'; import MockWebex from '@webex/test-helper-mock-webex'; import sinon from 'sinon'; -import {ServicesV2, Credentials} from '@webex/webex-core'; -import Metrics, {NewMetrics} from '@webex/internal-plugin-metrics'; +import {ServicesV2} from '@webex/webex-core'; +import Metricsfrom '@webex/internal-plugin-metrics'; import {formattedServiceHostmapV2, serviceHostmapV2} from '../../../fixtures/host-catalog-v2'; const waitForAsync = () => @@ -26,9 +26,7 @@ describe('webex-core', () => { webex = MockWebex({ children: { services: ServicesV2, - newMetrics: NewMetrics, metrics: Metrics, - credentials: Credentials, }, }); services = webex.internal.services; @@ -54,13 +52,6 @@ describe('webex-core', () => { assert.isFalse(services.initFailed); - sinon.assert.calledWith( - webex.internal.metrics.submitClientMetrics, - 'SERVICE_V2_INITIALIZED', - { - fields: {type: 'operational', initialized_status: 'succeeded'}, - } - ); }); it('initFailed is false when initialization succeeds no credentials are available', async () => { From 856e1dbe70206c5e02264774960806d594829d1b Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 2 Dec 2025 10:09:04 +0800 Subject: [PATCH 11/15] feat(u2cv2): fix ut --- .../@webex/webex-core/src/lib/services-v2/services-v2.ts | 1 + .../webex-core/test/unit/spec/services-v2/services-v2.ts | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index 0b43c21c3d3..8677151eb23 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -281,6 +281,7 @@ const Services = WebexPlugin.extend({ if (!email) { return Promise.reject(new Error('`email` is required')); } + // Destructure the credentials object. const {canAuthorize} = this.webex.credentials; diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 277d1861d4a..4548d4da768 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -6,7 +6,7 @@ import {assert} from '@webex/test-helper-chai'; import MockWebex from '@webex/test-helper-mock-webex'; import sinon from 'sinon'; import {ServicesV2} from '@webex/webex-core'; -import Metricsfrom '@webex/internal-plugin-metrics'; +import {NewMetrics} from '@webex/internal-plugin-metrics'; import {formattedServiceHostmapV2, serviceHostmapV2} from '../../../fixtures/host-catalog-v2'; const waitForAsync = () => @@ -26,12 +26,11 @@ describe('webex-core', () => { webex = MockWebex({ children: { services: ServicesV2, - metrics: Metrics, + newMetrics: NewMetrics, }, }); services = webex.internal.services; catalog = services._getCatalog(); - webex.internal.metrics.submitClientMetrics = sinon.stub(); }); describe('#initialize', () => { From 03e521f94b586b2b8e4881a41ba034dd1dfa180c Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 2 Dec 2025 10:35:01 +0800 Subject: [PATCH 12/15] feat(u2cv2): fix ut --- .../webex-core/src/lib/services-v2/services-v2.ts | 14 ++++++-------- .../test/unit/spec/services-v2/services-v2.ts | 1 + 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index 8677151eb23..c9b8afab26a 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -1080,20 +1080,18 @@ const Services = WebexPlugin.extend({ this.initServiceCatalogs() .then(() => { catalog.isReady = true; + this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { + fields: { + type: 'operational', + initialized_status: 'succeeded', + }, + }); }) .catch((error) => { this.initFailed = true; this.logger.error( `services: failed to init initial services when credentials available, ${error?.message}` ); - }) - .finally(() => { - this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { - fields: { - type: 'operational', - initialized_status: this.initFailed ? 'failed' : 'succeeded', - }, - }); }); } else { const {email} = this.webex.config; diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 4548d4da768..6c1e4108b77 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -42,6 +42,7 @@ describe('webex-core', () => { access_token: 'token', }, }; + webex.internal.metrics.submitClientMetrics = sinon.stub(); services.initialize(); From a9aa1392b42422d753a4cfb907e0c597e15e0331 Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 2 Dec 2025 13:46:43 +0800 Subject: [PATCH 13/15] test: build --- .../@webex/webex-core/test/unit/spec/services-v2/services-v2.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 6c1e4108b77..3363340f163 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -49,9 +49,7 @@ describe('webex-core', () => { // call the onReady callback services.listenToOnce.getCall(1).args[2](); await waitForAsync(); - assert.isFalse(services.initFailed); - }); it('initFailed is false when initialization succeeds no credentials are available', async () => { From bd4c3080490c3cf74e5c94d6e42ad9d329b4ed6e Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 2 Dec 2025 16:48:12 +0800 Subject: [PATCH 14/15] test: build --- .../webex-core/src/lib/services-v2/metrics.ts | 2 +- .../src/lib/services-v2/services-v2.ts | 17 ++++++++++------- .../test/unit/spec/services-v2/services-v2.ts | 6 +++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/services-v2/metrics.ts b/packages/@webex/webex-core/src/lib/services-v2/metrics.ts index 2cb3dfb6bcb..7632dfd9a66 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/metrics.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/metrics.ts @@ -1,5 +1,5 @@ // Metrics for service catalog export default { JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND', - SERVICE_V2_INITIALIZED: 'SERVICE_V2_INITIALIZED', + SERVICE_V2_INITIALIZING: 'SERVICE_V2_INITIALIZING', }; diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index c9b8afab26a..185d9f1202e 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -1036,7 +1036,16 @@ const Services = WebexPlugin.extend({ return ( Promise.resolve() // Get the user's OrgId. - .then(() => credentials.getOrgId()) + .then(() => { + this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2, { + fields: { + type: 'operational', + status: 'initServiceCatalogs_initializing', + }, + }); + + return credentials.getOrgId(); + }) // Begin collecting the preauth/limited catalog. .then((orgId) => this.collectPreauthCatalog({orgId}, refresh)) .then(() => { @@ -1080,12 +1089,6 @@ const Services = WebexPlugin.extend({ this.initServiceCatalogs() .then(() => { catalog.isReady = true; - this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2_INITIALIZED, { - fields: { - type: 'operational', - initialized_status: 'succeeded', - }, - }); }) .catch((error) => { this.initFailed = true; diff --git a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts index 3363340f163..ee84bb2871c 100644 --- a/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/test/unit/spec/services-v2/services-v2.ts @@ -42,13 +42,13 @@ describe('webex-core', () => { access_token: 'token', }, }; - webex.internal.metrics.submitClientMetrics = sinon.stub(); services.initialize(); // call the onReady callback services.listenToOnce.getCall(1).args[2](); await waitForAsync(); + assert.isFalse(services.initFailed); }); @@ -133,6 +133,8 @@ describe('webex-core', () => { canAuthorize: true, }; + webex.internal.metrics.submitClientMetrics = sinon.stub(); + services.collectPreauthCatalog = sinon.stub().callsFake(() => { return Promise.resolve(); }); @@ -159,6 +161,8 @@ describe('webex-core', () => { canAuthorize: true, }; + webex.internal.metrics.submitClientMetrics = sinon.stub(); + services.collectPreauthCatalog = sinon.stub().callsFake(() => { return Promise.resolve(); }); From 53bc270e1f4991c292f49b163d6751520e709f4a Mon Sep 17 00:00:00 2001 From: jiayinzh Date: Tue, 2 Dec 2025 17:09:53 +0800 Subject: [PATCH 15/15] test: build --- packages/@webex/webex-core/src/lib/metrics.js | 2 +- packages/@webex/webex-core/src/lib/services-v2/metrics.ts | 1 - packages/@webex/webex-core/src/lib/services-v2/services-v2.ts | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/@webex/webex-core/src/lib/metrics.js b/packages/@webex/webex-core/src/lib/metrics.js index 2cb3dfb6bcb..53fa15085c3 100644 --- a/packages/@webex/webex-core/src/lib/metrics.js +++ b/packages/@webex/webex-core/src/lib/metrics.js @@ -1,5 +1,5 @@ // Metrics for service catalog export default { JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND', - SERVICE_V2_INITIALIZED: 'SERVICE_V2_INITIALIZED', + SERVICE_V2: 'SERVICE_V2', }; diff --git a/packages/@webex/webex-core/src/lib/services-v2/metrics.ts b/packages/@webex/webex-core/src/lib/services-v2/metrics.ts index 7632dfd9a66..e81dde7cfc9 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/metrics.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/metrics.ts @@ -1,5 +1,4 @@ // Metrics for service catalog export default { JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND', - SERVICE_V2_INITIALIZING: 'SERVICE_V2_INITIALIZING', }; diff --git a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts index 185d9f1202e..e8f0b394c68 100644 --- a/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts +++ b/packages/@webex/webex-core/src/lib/services-v2/services-v2.ts @@ -1040,7 +1040,7 @@ const Services = WebexPlugin.extend({ this.webex.internal.metrics.submitClientMetrics(METRICS.SERVICE_V2, { fields: { type: 'operational', - status: 'initServiceCatalogs_initializing', + status: 'initializing', }, });