diff --git a/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.test.ts b/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.test.ts index cdd5a27ee9500a..cd70b72420ec28 100644 --- a/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.test.ts +++ b/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.test.ts @@ -21,23 +21,23 @@ describe('AnalyticsService', () => { test('should register some context providers on creation', async () => { expect(analyticsClientMock.registerContextProvider).toHaveBeenCalledTimes(3); await expect( - firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[0][0].context$) - ).resolves.toMatchInlineSnapshot(` - Object { - "branch": "branch", - "buildNum": 100, - "buildSha": "buildSha", - "isDev": true, - "isDistributable": false, - "version": "version", - } - `); + await firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[0][0].context$) + ).toMatchInlineSnapshot(` + Object { + "branch": "branch", + "buildNum": 100, + "buildSha": "buildSha", + "isDev": true, + "isDistributable": false, + "version": "version", + } + `); await expect( - firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[1][0].context$) - ).resolves.toEqual({ session_id: expect.any(String) }); + await firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[1][0].context$) + ).toEqual({ session_id: expect.any(String) }); await expect( - firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[2][0].context$) - ).resolves.toEqual({ + await firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[2][0].context$) + ).toEqual({ preferred_language: 'en-US', preferred_languages: ['en-US', 'en'], user_agent: expect.any(String), @@ -210,8 +210,8 @@ describe('AnalyticsService', () => { const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); analyticsService.setup({ injectedMetadata }); await expect( - firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[3][0].context$) - ).resolves.toMatchInlineSnapshot(`undefined`); + await firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[3][0].context$) + ).toMatchInlineSnapshot(`undefined`); }); test('setup should register the elasticsearch info context provider (with info)', async () => { @@ -223,8 +223,8 @@ describe('AnalyticsService', () => { }); analyticsService.setup({ injectedMetadata }); await expect( - firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[3][0].context$) - ).resolves.toMatchInlineSnapshot(` + await firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[3][0].context$) + ).toMatchInlineSnapshot(` Object { "cluster_name": "cluster_name", "cluster_uuid": "cluster_uuid", diff --git a/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts b/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts index 84eb75df040985..9cad35d22134d1 100644 --- a/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts +++ b/packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts @@ -9,7 +9,7 @@ import { of } from 'rxjs'; import type { AnalyticsClient } from '@kbn/analytics-client'; import { createAnalytics } from '@kbn/analytics-client'; -import { registerMetricEventType } from '@kbn/ebt-tools'; +import { registerPerformanceMetricEventType } from '@kbn/ebt-tools'; import type { CoreContext } from '@kbn/core-base-browser-internal'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; import type { AnalyticsServiceSetup, AnalyticsServiceStart } from '@kbn/core-analytics-browser'; @@ -35,8 +35,8 @@ export class AnalyticsService { }); this.registerBuildInfoAnalyticsContext(core); - // Register special `metrics` type - registerMetricEventType(this.analyticsClient); + // Register special `performance_metrics` type + registerPerformanceMetricEventType(this.analyticsClient); // We may eventually move the following to the client's package since they are not Kibana-specific // and can benefit other consumers of the client. diff --git a/packages/core/analytics/core-analytics-server-internal/src/analytics_service.test.ts b/packages/core/analytics/core-analytics-server-internal/src/analytics_service.test.ts index 74d1b6e4119ee0..73fcc28cc1e54e 100644 --- a/packages/core/analytics/core-analytics-server-internal/src/analytics_service.test.ts +++ b/packages/core/analytics/core-analytics-server-internal/src/analytics_service.test.ts @@ -21,8 +21,8 @@ describe('AnalyticsService', () => { test('should register the context provider `build info` on creation', async () => { expect(analyticsClientMock.registerContextProvider).toHaveBeenCalledTimes(1); await expect( - firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[0][0].context$) - ).resolves.toMatchInlineSnapshot(` + await firstValueFrom(analyticsClientMock.registerContextProvider.mock.calls[0][0].context$) + ).toMatchInlineSnapshot(` Object { "branch": "main", "buildNum": 9007199254740991, diff --git a/packages/core/analytics/core-analytics-server-internal/src/analytics_service.ts b/packages/core/analytics/core-analytics-server-internal/src/analytics_service.ts index 7aaebe2235955e..aac8048f166db9 100644 --- a/packages/core/analytics/core-analytics-server-internal/src/analytics_service.ts +++ b/packages/core/analytics/core-analytics-server-internal/src/analytics_service.ts @@ -9,7 +9,7 @@ import { of } from 'rxjs'; import type { AnalyticsClient } from '@kbn/analytics-client'; import { createAnalytics } from '@kbn/analytics-client'; -import { registerMetricEventType } from '@kbn/ebt-tools'; +import { registerPerformanceMetricEventType } from '@kbn/ebt-tools'; import type { CoreContext } from '@kbn/core-base-server-internal'; import type { AnalyticsServiceSetup, @@ -31,7 +31,7 @@ export class AnalyticsService { this.registerBuildInfoAnalyticsContext(core); // Register special `metrics` type - registerMetricEventType(this.analyticsClient); + registerPerformanceMetricEventType(this.analyticsClient); } public preboot(): AnalyticsServicePreboot { diff --git a/packages/kbn-ebt-tools/src/metric_events/helpers.test.ts b/packages/kbn-ebt-tools/src/metric_events/helpers.test.ts index 376e5d926c2527..324a050ca802a6 100644 --- a/packages/kbn-ebt-tools/src/metric_events/helpers.test.ts +++ b/packages/kbn-ebt-tools/src/metric_events/helpers.test.ts @@ -8,13 +8,13 @@ import { createAnalytics, type AnalyticsClient } from '@kbn/analytics-client'; import { loggerMock } from '@kbn/logging-mocks'; -import { registerMetricEventType, reportMetricEvent } from './helpers'; +import { registerPerformanceMetricEventType, reportPerformanceMetricEvent } from './helpers'; import { METRIC_EVENT_SCHEMA } from './schema'; describe('metric event helpers', () => { let analyticsClient: AnalyticsClient; - describe('registerMetricEventType', () => { + describe('registerPerformanceMetricEventType', () => { beforeEach(() => { analyticsClient = createAnalytics({ isDev: true, // Explicitly setting `true` to ensure we have event validation to make sure the events sent pass our validation. @@ -23,34 +23,34 @@ describe('metric event helpers', () => { }); }); - test('registers the `metrics` eventType to the analytics client', () => { + test('registers the `performance_metric` eventType to the analytics client', () => { const registerEventTypeSpy = jest.spyOn(analyticsClient, 'registerEventType'); - expect(() => registerMetricEventType(analyticsClient)).not.toThrow(); + expect(() => registerPerformanceMetricEventType(analyticsClient)).not.toThrow(); expect(registerEventTypeSpy).toHaveBeenCalledWith({ - eventType: 'metric', + eventType: 'performance_metric', schema: METRIC_EVENT_SCHEMA, }); }); }); - describe('reportMetricEvent', () => { + describe('reportPerformanceMetricEvent', () => { beforeEach(() => { analyticsClient = createAnalytics({ isDev: true, // Explicitly setting `true` to ensure we have event validation to make sure the events sent pass our validation. sendTo: 'staging', logger: loggerMock.create(), }); - registerMetricEventType(analyticsClient); + registerPerformanceMetricEventType(analyticsClient); }); test('reports the minimum allowed event', () => { - reportMetricEvent(analyticsClient, { eventName: 'test-event' }); + reportPerformanceMetricEvent(analyticsClient, { eventName: 'test-event', duration: 1000 }); }); test('reports all the allowed fields in the event', () => { - reportMetricEvent(analyticsClient, { + reportPerformanceMetricEvent(analyticsClient, { eventName: 'test-event', meta: { my: { custom: { fields: 'here' } }, another_field: true }, status: 'something', @@ -70,26 +70,28 @@ describe('metric event helpers', () => { test('should fail if eventName is missing', () => { expect(() => - reportMetricEvent( + reportPerformanceMetricEvent( analyticsClient, // @ts-expect-error {} ) ).toThrowErrorMatchingInlineSnapshot(` - "Failed to validate payload coming from \\"Event Type 'metric'\\": - - [eventName]: {\\"expected\\":\\"string\\",\\"actual\\":\\"undefined\\",\\"value\\":\\"undefined\\"}" + "Failed to validate payload coming from \\"Event Type 'performance_metric'\\": + - [eventName]: {\\"expected\\":\\"string\\",\\"actual\\":\\"undefined\\",\\"value\\":\\"undefined\\"} + - [duration]: {\\"expected\\":\\"number\\",\\"actual\\":\\"undefined\\",\\"value\\":\\"undefined\\"}" `); }); test('should fail if any additional unknown keys are added', () => { expect(() => - reportMetricEvent(analyticsClient, { + reportPerformanceMetricEvent(analyticsClient, { eventName: 'test-event', + duration: 1000, // @ts-expect-error an_unknown_field: 'blah', }) ).toThrowErrorMatchingInlineSnapshot(` - "Failed to validate payload coming from \\"Event Type 'metric'\\": + "Failed to validate payload coming from \\"Event Type 'performance_metric'\\": - []: excess key 'an_unknown_field' found" `); }); diff --git a/packages/kbn-ebt-tools/src/metric_events/helpers.ts b/packages/kbn-ebt-tools/src/metric_events/helpers.ts index d385abb676cd89..f332402b60cb8e 100644 --- a/packages/kbn-ebt-tools/src/metric_events/helpers.ts +++ b/packages/kbn-ebt-tools/src/metric_events/helpers.ts @@ -9,16 +9,18 @@ import type { AnalyticsClient } from '@kbn/analytics-client'; import { type MetricEvent, METRIC_EVENT_SCHEMA } from './schema'; -const METRIC_EVENT_TYPE = 'metric'; +const PERFORMANCE_METRIC_EVENT_TYPE = 'performance_metric'; /** * Register the `metrics` event type * @param analytics The {@link AnalyticsClient} during the setup phase (it has the method `registerEventType`) * @private To be called only by core's Analytics Service */ -export function registerMetricEventType(analytics: Pick) { +export function registerPerformanceMetricEventType( + analytics: Pick +) { analytics.registerEventType({ - eventType: METRIC_EVENT_TYPE, + eventType: PERFORMANCE_METRIC_EVENT_TYPE, schema: METRIC_EVENT_SCHEMA, }); } @@ -28,9 +30,9 @@ export function registerMetricEventType(analytics: Pick, eventData: MetricEvent ) { - analytics.reportEvent(METRIC_EVENT_TYPE, eventData); + analytics.reportEvent(PERFORMANCE_METRIC_EVENT_TYPE, eventData); } diff --git a/packages/kbn-ebt-tools/src/metric_events/index.ts b/packages/kbn-ebt-tools/src/metric_events/index.ts index 1b9e5c762d7f42..95bbfeb2dad192 100644 --- a/packages/kbn-ebt-tools/src/metric_events/index.ts +++ b/packages/kbn-ebt-tools/src/metric_events/index.ts @@ -6,4 +6,7 @@ * Side Public License, v 1. */ export type { MetricEvent } from './schema'; -export { registerMetricEventType, reportMetricEvent } from './helpers'; +export { + registerPerformanceMetricEventType as registerPerformanceMetricEventType, + reportPerformanceMetricEvent, +} from './helpers'; diff --git a/packages/kbn-ebt-tools/src/metric_events/schema.ts b/packages/kbn-ebt-tools/src/metric_events/schema.ts index 3d572963b07db0..142cc6929e45b0 100644 --- a/packages/kbn-ebt-tools/src/metric_events/schema.ts +++ b/packages/kbn-ebt-tools/src/metric_events/schema.ts @@ -25,7 +25,7 @@ export interface MetricEvent { * @group Standardized fields * The time (in milliseconds) it took to run the entire action. */ - duration?: number; + duration: number; /** * @group Standardized fields * A status relevant to the action (i.e.: `failed`, `succeeded`). @@ -110,7 +110,7 @@ export const METRIC_EVENT_SCHEMA: RootSchema = { }, duration: { type: 'integer', - _meta: { description: 'The main event duration in ms', optional: true }, + _meta: { description: 'The main event duration in ms' }, }, status: { type: 'keyword', diff --git a/src/core/public/core_system.test.ts b/src/core/public/core_system.test.ts index 0cafa8ed6bd39e..32b51f9ec01822 100644 --- a/src/core/public/core_system.test.ts +++ b/src/core/public/core_system.test.ts @@ -287,7 +287,7 @@ describe('#start()', () => { it('reports the metric event kibana-loaded and clears marks', async () => { await startCore(); expect(analyticsServiceStartMock.reportEvent).toHaveBeenCalledTimes(2); - expect(analyticsServiceStartMock.reportEvent).toHaveBeenNthCalledWith(2, 'metric', { + expect(analyticsServiceStartMock.reportEvent).toHaveBeenNthCalledWith(2, 'performance_metric', { eventName: KIBANA_LOADED_EVENT, meta: { kibana_version: '1.2.3', @@ -320,7 +320,7 @@ describe('#start()', () => { await startCore(); expect(analyticsServiceStartMock.reportEvent).toHaveBeenCalledTimes(2); - expect(analyticsServiceStartMock.reportEvent).toHaveBeenNthCalledWith(2, 'metric', { + expect(analyticsServiceStartMock.reportEvent).toHaveBeenNthCalledWith(2, 'performance_metric', { eventName: KIBANA_LOADED_EVENT, meta: { kibana_version: '1.2.3', diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 34ad06766fabcd..2baa95ba844f2a 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -26,7 +26,7 @@ import { HttpService } from '@kbn/core-http-browser-internal'; import { UiSettingsService } from '@kbn/core-ui-settings-browser-internal'; import { DeprecationsService } from '@kbn/core-deprecations-browser-internal'; import { IntegrationsService } from '@kbn/core-integrations-browser-internal'; -import { reportMetricEvent } from '@kbn/ebt-tools'; +import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; import { fetchOptionalMemoryInfo } from './fetch_optional_memory_info'; import { CoreSetup, CoreStart } from '.'; import { ChromeService } from './chrome'; @@ -164,7 +164,7 @@ export class CoreSystem { }); const timing = this.getLoadMarksInfo(); - reportMetricEvent(analytics, { + reportPerformanceMetricEvent(analytics, { eventName: KIBANA_LOADED_EVENT, meta: { kibana_version: this.coreContext.env.packageInfo.version, diff --git a/src/core/server/server.ts b/src/core/server/server.ts index 6f1abccd454fd0..a7f40ed916b0e9 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -24,7 +24,7 @@ import { import { NodeService, nodeConfig } from '@kbn/core-node-server-internal'; import { AnalyticsService } from '@kbn/core-analytics-server-internal'; import type { AnalyticsServiceSetup, AnalyticsServiceStart } from '@kbn/core-analytics-server'; -import { reportMetricEvent } from '@kbn/ebt-tools'; +import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; import { EnvironmentService, pidConfig } from '@kbn/core-environment-server-internal'; import { ExecutionContextService, @@ -568,9 +568,9 @@ export class Server { const ups = this.uptimePerStep; - const toMs = (sec: number) => Math.round(sec * 100); + const toMs = (sec: number) => Math.round(sec * 1000); // Report the metric-shaped KIBANA_STARTED_EVENT. - reportMetricEvent(analyticsStart, { + reportPerformanceMetricEvent(analyticsStart, { eventName: KIBANA_STARTED_EVENT, duration: toMs(ups.start!.end - ups.constructor!.start), key1: 'time_to_constructor', diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx index c77a4b7d4769c0..527c90b3b48df0 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx @@ -12,7 +12,7 @@ import { I18nProvider } from '@kbn/i18n-react'; import uuid from 'uuid'; import { CoreStart, IUiSettingsClient, KibanaExecutionContext } from '@kbn/core/public'; import { Start as InspectorStartContract } from '@kbn/inspector-plugin/public'; -import { reportMetricEvent } from '@kbn/ebt-tools'; +import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; import { ControlGroupContainer } from '@kbn/controls-plugin/public'; import { Filter, TimeRange } from '@kbn/es-query'; @@ -166,7 +166,7 @@ export class DashboardContainer extends Container ebtUIHelper.getEvents(count, { - eventTypes: ['metric'], + eventTypes: ['performance_metric'], fromTimestamp, withTimeoutMs: 1000, filters: { 'properties.eventName': { eq: DASHBOARD_LOADED_EVENT } }, @@ -42,7 +42,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const events = await getEvents(Number.MAX_SAFE_INTEGER, options); expect(events.length).to.be(1); const event = events[0]; - expect(event.event_type).to.eql('metric'); + expect(event.event_type).to.eql('performance_metric'); expect(event.properties.eventName).to.eql(DASHBOARD_LOADED_EVENT); expect(event.context.applicationId).to.be('dashboards'); expect(event.context.page).to.be('app'); diff --git a/test/analytics/tests/instrumented_events/from_the_browser/loaded_kibana.ts b/test/analytics/tests/instrumented_events/from_the_browser/loaded_kibana.ts index 0c7f39d3617b0c..c336dc5edafd9b 100644 --- a/test/analytics/tests/instrumented_events/from_the_browser/loaded_kibana.ts +++ b/test/analytics/tests/instrumented_events/from_the_browser/loaded_kibana.ts @@ -31,12 +31,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should emit the new kibana-loaded events', async () => { const [event] = await ebtUIHelper.getEvents(1, { - eventTypes: ['metric'], + eventTypes: ['performance_metric'], filters: { 'properties.eventName': { eq: 'kibana_loaded' } }, }); // New event - expect(event.event_type).to.eql('metric'); + expect(event.event_type).to.eql('performance_metric'); expect(event.properties.eventName).to.eql('kibana_loaded'); // meta diff --git a/test/analytics/tests/instrumented_events/from_the_server/kibana_started.ts b/test/analytics/tests/instrumented_events/from_the_server/kibana_started.ts index c06e13ee476ee5..d1b59ce9d4e9c4 100644 --- a/test/analytics/tests/instrumented_events/from_the_server/kibana_started.ts +++ b/test/analytics/tests/instrumented_events/from_the_server/kibana_started.ts @@ -32,10 +32,10 @@ export default function ({ getService }: FtrProviderContext) { it('should emit the "kibana_started" metric event', async () => { const [event] = await ebtServerHelper.getEvents(1, { - eventTypes: ['metric'], + eventTypes: ['performance_metric'], filters: { 'properties.eventName': { eq: 'kibana_started' } }, }); - expect(event.event_type).to.eql('metric'); + expect(event.event_type).to.eql('performance_metric'); expect(event.properties.eventName).to.eql('kibana_started'); expect(event.properties.duration).to.be.a('number'); expect(event.properties.key1).to.eql('time_to_constructor');