From eee7cd31c2268b3aa56fb93d8e5ac171a338f87f Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 4 Nov 2024 09:42:11 +0100 Subject: [PATCH 01/17] Add foundation to run apm tests Migrate agent_explorer test Update latest_agent_versions test --- .../agent_explorer/agent_explorer.spec.ts | 21 ++- .../apis/observability/apm/index.ts | 55 ++++++++ .../configs/serverless/oblt.index.ts | 1 + .../serverless/oblt.serverless.config.ts | 1 + .../configs/stateful/oblt.index.ts | 1 + .../configs/stateful/oblt.stateful.config.ts | 1 + .../default_configs/serverless.config.base.ts | 2 + .../default_configs/stateful.config.base.ts | 2 + .../deployment_agnostic/services/apm_api.ts | 121 ++++++++++++++++++ .../deployment_agnostic/services/index.ts | 6 + .../deployment_agnostic/services/registry.ts | 97 ++++++++++++++ .../services/synthtrace.ts | 46 +++++++ 12 files changed, 347 insertions(+), 7 deletions(-) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/agent_explorer/agent_explorer.spec.ts (90%) create mode 100644 x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts create mode 100644 x-pack/test/api_integration/deployment_agnostic/services/apm_api.ts create mode 100644 x-pack/test/api_integration/deployment_agnostic/services/registry.ts create mode 100644 x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts diff --git a/x-pack/test/apm_api_integration/tests/agent_explorer/agent_explorer.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts similarity index 90% rename from x-pack/test/apm_api_integration/tests/agent_explorer/agent_explorer.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts index 95e71167aaab4..5ea2697eb2eb8 100644 --- a/x-pack/test/apm_api_integration/tests/agent_explorer/agent_explorer.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts @@ -8,13 +8,14 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { APIClientRequestParamsOf } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { keyBy } from 'lodash'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; -export default function ApiTest({ getService }: FtrProviderContext) { +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apiApi = getService('apmApi'); const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2021-01-01T00:00:00.000Z').getTime(); const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; @@ -27,7 +28,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { APIClientRequestParamsOf<'GET /internal/apm/get_agents_per_service'>['params'] > ) { - return await apmApiClient.readUser({ + const client = await apiApi.createApmApiClient(); + return await client.readUser({ endpoint: 'GET /internal/apm/get_agents_per_service', params: { query: { @@ -42,7 +44,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); } - registry.when('Agent explorer when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('Agent explorer when data is not loaded', () => { it('handles empty state', async () => { const { status, body } = await callApi(); @@ -51,9 +53,14 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - registry.when('Agent explorer', { config: 'basic', archives: [] }, () => { + registry.when('Agent explorer', () => { describe('when data is loaded', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + before(async () => { + const version = (await synthtrace.apmSynthtraceKibanaClient.installApmPackage()).version; + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(version); + const serviceOtelJava = apm .service({ name: otelJavaServiceName, diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts new file mode 100644 index 0000000000000..9758e0c50a2d2 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import globby from 'globby'; +import path from 'path'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; + +const cwd = path.join(__dirname); +const envGrepFiles = process.env.APM_TEST_GREP_FILES as string; + +function getGlobPattern() { + try { + const envGrepFilesParsed = JSON.parse(envGrepFiles as string) as string[]; + return envGrepFilesParsed.map((pattern) => { + return pattern.includes('spec') ? `**/${pattern}**` : `**/${pattern}**.spec.ts`; + }); + } catch (e) { + // ignore + } + return '**/*.spec.ts'; +} + +export default function apmApiIntegrationTests({ + getService, + loadTestFile, +}: DeploymentAgnosticFtrProviderContext) { + // DO NOT SKIP + // Skipping here will skip the entire apm api test suite + // Instead skip (flaky) tests individually + // Failing: See https://github.com/elastic/kibana/issues/176948 + describe('APM API tests', function () { + const registry = getService('registry'); + const filePattern = getGlobPattern(); + const tests = globby.sync(filePattern, { cwd }); + + if (envGrepFiles) { + // eslint-disable-next-line no-console + console.log( + `\nCommand "--grep-files=${filePattern}" matched ${tests.length} file(s):\n${tests + .map((name) => ` - ${name}`) + .join('\n')}\n` + ); + } + + tests.forEach((testName) => { + describe(testName, () => { + loadTestFile(require.resolve(`./${testName}`)); + registry.run(); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts index d9ee2daa42aac..70bf555062c77 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.index.ts @@ -19,5 +19,6 @@ export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) loadTestFile(require.resolve('../../apis/painless_lab')); loadTestFile(require.resolve('../../apis/saved_objects_management')); loadTestFile(require.resolve('../../apis/observability/slo')); + loadTestFile(require.resolve('../../apis/observability/apm')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts index 245663416243f..e1864f0444ab0 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts @@ -10,6 +10,7 @@ import { createServerlessTestConfig } from '../../default_configs/serverless.con export default createServerlessTestConfig({ serverlessProject: 'oblt', testFiles: [require.resolve('./oblt.index.ts')], + servicesRequiredForTestAnalysis: ['registry'], junit: { reportName: 'Serverless Observability - Deployment-agnostic API Integration Tests', }, diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts index a467264698e57..5f38067fa3f18 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.index.ts @@ -13,5 +13,6 @@ export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) loadTestFile(require.resolve('../../apis/observability/alerting')); loadTestFile(require.resolve('../../apis/observability/dataset_quality')); loadTestFile(require.resolve('../../apis/observability/slo')); + loadTestFile(require.resolve('../../apis/observability/apm')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts index 7b3cf3a7f1818..2c2e33a126b54 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts @@ -9,6 +9,7 @@ import { createStatefulTestConfig } from '../../default_configs/stateful.config. export default createStatefulTestConfig({ testFiles: [require.resolve('./oblt.index.ts')], + servicesRequiredForTestAnalysis: ['registry'], junit: { reportName: 'Stateful Observability - Deployment-agnostic API Integration Tests', }, diff --git a/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts b/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts index e7df37f5aa312..353021aa343a3 100644 --- a/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts +++ b/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts @@ -16,6 +16,7 @@ interface CreateTestConfigOptions { esServerArgs?: string[]; kbnServerArgs?: string[]; services?: T; + servicesRequiredForTestAnalysis?: string[]; testFiles: string[]; junit: { reportName: string }; suiteTags?: { include?: string[]; exclude?: string[] }; @@ -85,6 +86,7 @@ export function createServerlessTestConfig { kbnServerArgs?: string[]; services?: T; testFiles: string[]; + servicesRequiredForTestAnalysis?: string[]; junit: { reportName: string }; suiteTags?: { include?: string[]; exclude?: string[] }; } @@ -100,6 +101,7 @@ export function createStatefulTestConfig( + options: { + type?: 'form-data'; + endpoint: TEndpoint; + spaceId?: string; + } & APIClientRequestParamsOf & { + params?: { query?: { _inspect?: boolean } }; + } + ): Promise> => { + const { endpoint, type } = options; + + const params = 'params' in options ? (options.params as Record) : {}; + + const roleAuthc = await samlAuth.createM2mApiKeyWithRoleScope(role); + + const headers: Record = { + ...samlAuth.getInternalRequestHeader(), + ...roleAuthc.apiKeyHeader, + }; + + const { method, pathname, version } = formatRequest(endpoint, params.path); + const pathnameWithSpaceId = options.spaceId ? `/s/${options.spaceId}${pathname}` : pathname; + const url = format({ pathname: pathnameWithSpaceId, query: params?.query }); + + // eslint-disable-next-line no-console + console.debug(`Calling APM API: ${method.toUpperCase()} ${url}`); + + if (version) { + headers['Elastic-Api-Version'] = version; + } + + let res: request.Response; + if (type === 'form-data') { + const fields: Array<[string, any]> = Object.entries(params.body); + const formDataRequest = supertestWithoutAuth[method](url) + .set(headers) + .set('Content-type', 'multipart/form-data'); + + for (const field of fields) { + void formDataRequest.field(field[0], field[1]); + } + + res = await formDataRequest; + } else if (params.body) { + res = await supertestWithoutAuth[method](url).send(params.body).set(headers); + } else { + res = await supertestWithoutAuth[method](url).set(headers); + } + + // supertest doesn't throw on http errors + if (res?.status !== 200) { + throw new ApmApiError(res, endpoint); + } + + return res; + }; +} + +type ApiErrorResponse = Omit & { + body: { + statusCode: number; + error: string; + message: string; + attributes: object; + }; +}; + +export type ApmApiSupertest = ReturnType; + +export class ApmApiError extends Error { + res: ApiErrorResponse; + + constructor(res: request.Response, endpoint: string) { + super( + `Unhandled ApmApiError. +Status: "${res.status}" +Endpoint: "${endpoint}" +Body: ${JSON.stringify(res.body)}` + ); + + this.res = res; + } +} + +export interface SupertestReturnType { + status: number; + body: APIReturnType; +} + +export function ApmApiProvider(context: DeploymentAgnosticFtrProviderContext) { + return { + async createApmApiClient() { + return { + readUser: createApmApiClient(context, 'viewer'), + adminUser: createApmApiClient(context, 'admin'), + writeUser: createApmApiClient(context, 'editor'), + }; + }, + }; +} diff --git a/x-pack/test/api_integration/deployment_agnostic/services/index.ts b/x-pack/test/api_integration/deployment_agnostic/services/index.ts index bea63ea216c93..a37469988b7d0 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/index.ts @@ -13,6 +13,9 @@ import { PackageApiProvider } from './package_api'; import { RoleScopedSupertestProvider, SupertestWithRoleScope } from './role_scoped_supertest'; import { SloApiProvider } from './slo_api'; import { LogsSynthtraceEsClientProvider } from './logs_synthtrace_es_client'; +import { SynthtraceProvider } from './synthtrace'; +import { RegistryProvider } from './registry'; +import { ApmApiProvider } from './apm_api'; export type { InternalRequestHeader, @@ -31,6 +34,9 @@ export const services = { roleScopedSupertest: RoleScopedSupertestProvider, logsSynthtraceEsClient: LogsSynthtraceEsClientProvider, // create a new deployment-agnostic service and load here + synthtrace: SynthtraceProvider, + apmApi: ApmApiProvider, + registry: RegistryProvider, }; export type SupertestWithRoleScopeType = SupertestWithRoleScope; diff --git a/x-pack/test/api_integration/deployment_agnostic/services/registry.ts b/x-pack/test/api_integration/deployment_agnostic/services/registry.ts new file mode 100644 index 0000000000000..b1e03a92094ed --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/services/registry.ts @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { groupBy } from 'lodash'; +import callsites from 'callsites'; +import { joinByKey } from '@kbn/observability-utils/array/join_by_key'; +import { maybe } from '@kbn/apm-plugin/common/utils/maybe'; + +export function RegistryProvider() { + const callbacks: Array<{ + runs: Array<{ + cb: () => void; + }>; + }> = []; + + let running: boolean = false; + + function when(title: string, callback: () => void, skip?: boolean) { + if (running) { + throw new Error("Can't add tests when running"); + } + + const frame = maybe(callsites()[1]); + + const file = frame?.getFileName(); + + if (!file) { + throw new Error('Could not infer file for suite'); + } + + callbacks.push({ + runs: [ + { + cb: () => { + const suite: ReturnType = (skip ? describe.skip : describe)( + title, + () => { + callback(); + } + ) as any; + + suite.file = file; + suite.eachTest((test) => { + test.file = file; + }); + }, + }, + ], + }); + } + + when.skip = (title: string, callback: () => void) => { + when(title, callback, true); + }; + + const registry = { + when, + run: () => { + running = true; + + const groups = joinByKey(callbacks, [], (a, b) => ({ + ...a, + ...b, + runs: a.runs.concat(b.runs), + })); + + callbacks.length = 0; + + const byConfig = groupBy(groups, 'config'); + + Object.keys(byConfig).forEach((config) => { + const groupsForConfig = byConfig[config]; + // register suites for other configs, but skip them so tests are marked as such + // and their snapshots are not marked as obsolete + describe(config, () => { + groupsForConfig.forEach((group) => { + const { runs } = group; + + describe(config, () => { + runs.forEach((run) => { + run.cb(); + }); + }); + }); + }); + }); + + running = false; + }, + }; + + return registry; +} diff --git a/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts b/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts new file mode 100644 index 0000000000000..1ab2692095ca3 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ApmSynthtraceKibanaClient, createLogger, LogLevel } from '@kbn/apm-synthtrace'; +import url, { format, UrlObject } from 'url'; + +import { getLogsSynthtraceEsClient } from '../../../common/utils/synthtrace/logs_es_client'; +import { getApmSynthtraceEsClient } from '../../../common/utils/synthtrace/apm_es_client'; +import type { DeploymentAgnosticFtrProviderContext } from '../ftr_provider_context'; + +function getSynthtraceKibanaClient(kibanaServerUrl: string) { + const kibanaServerUrlWithAuth = url + .format({ + ...url.parse(kibanaServerUrl), + }) + .slice(0, -1); + + const kibanaClient = new ApmSynthtraceKibanaClient({ + target: kibanaServerUrlWithAuth, + logger: createLogger(LogLevel.debug), + }); + + return kibanaClient; +} + +export function SynthtraceProvider({ getService }: DeploymentAgnosticFtrProviderContext) { + const client = getService('es'); + const config = getService('config'); + + const servers = config.get('servers'); + const kibanaServer = servers.kibana as UrlObject; + const kibanaServerUrl = format(kibanaServer); + const apmSynthtraceKibanaClient = getSynthtraceKibanaClient(kibanaServerUrl); + + return { + apmSynthtraceKibanaClient, + createLogsSynthtraceEsClient: () => getLogsSynthtraceEsClient(client), + async createApmSynthtraceEsClient(packageVersion: string) { + return getApmSynthtraceEsClient({ client, packageVersion }); + }, + }; +} From 5857da270aff222977cbe0b51d3630fc6f63aa1b Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 4 Nov 2024 14:27:21 +0100 Subject: [PATCH 02/17] Force Git to recognize latest_agent_versions.spec.ts as moved --- .../apm}/agent_explorer/latest_agent_versions.spec.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/agent_explorer/latest_agent_versions.spec.ts (100%) diff --git a/x-pack/test/apm_api_integration/tests/agent_explorer/latest_agent_versions.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts similarity index 100% rename from x-pack/test/apm_api_integration/tests/agent_explorer/latest_agent_versions.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts From c45c66213a683d27e22691d1bf268c4bd77f0e6a Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 4 Nov 2024 14:29:37 +0100 Subject: [PATCH 03/17] Updated latest_agent_versions.spec.ts after moving --- .../latest_agent_versions.spec.ts | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts index 00e3fedf4620c..94c4ba08008fe 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts @@ -6,45 +6,42 @@ */ import { ElasticApmAgentLatestVersion } from '@kbn/apm-plugin/common/agent_explorer'; import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; -export default function ApiTest({ getService }: FtrProviderContext) { +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); + const apiApi = getService('apmApi'); const nodeAgentName = 'nodejs'; const unlistedAgentName = 'unlistedAgent'; async function callApi() { + const apmApiClient = await apiApi.createApmApiClient(); return await apmApiClient.readUser({ endpoint: 'GET /internal/apm/get_latest_agent_versions', }); } - registry.when( - 'Agent latest versions when configuration is defined', - { config: 'basic', archives: [] }, - () => { - it('returns a version when agent is listed in the file', async () => { - const { status, body } = await callApi(); - expect(status).to.be(200); + registry.when('Agent latest versions when configuration is defined', () => { + it('returns a version when agent is listed in the file', async () => { + const { status, body } = await callApi(); + expect(status).to.be(200); - const agents = body.data; + const agents = body.data; - const nodeAgent = agents[nodeAgentName] as ElasticApmAgentLatestVersion; - expect(nodeAgent?.latest_version).not.to.be(undefined); - }); + const nodeAgent = agents[nodeAgentName] as ElasticApmAgentLatestVersion; + expect(nodeAgent?.latest_version).not.to.be(undefined); + }); - it('returns undefined when agent is not listed in the file', async () => { - const { status, body } = await callApi(); - expect(status).to.be(200); + it('returns undefined when agent is not listed in the file', async () => { + const { status, body } = await callApi(); + expect(status).to.be(200); - const agents = body.data; + const agents = body.data; - // @ts-ignore - const unlistedAgent = agents[unlistedAgentName] as ElasticApmAgentLatestVersion; - expect(unlistedAgent?.latest_version).to.be(undefined); - }); - } - ); + // @ts-ignore + const unlistedAgent = agents[unlistedAgentName] as ElasticApmAgentLatestVersion; + expect(unlistedAgent?.latest_version).to.be(undefined); + }); + }); } From 66f5e4cf5be0a8d02359d42b6b442229ea857bad Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:47:20 +0000 Subject: [PATCH 04/17] [CI] Auto-commit changed files from 'node scripts/lint_ts_projects --fix' --- x-pack/test/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 2ba14ceb1218c..8fa19baa5f21a 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -187,6 +187,7 @@ "@kbn/alerting-types", "@kbn/ai-assistant-common", "@kbn/core-deprecations-common", - "@kbn/usage-collection-plugin" + "@kbn/usage-collection-plugin", + "@kbn/observability-utils" ] } From 17fb5e21f914dc0e4a0a383d8c4b57ebb81ca441 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 4 Nov 2024 15:18:30 +0100 Subject: [PATCH 05/17] Simplify apmApi --- .../apm/agent_explorer/agent_explorer.spec.ts | 5 ++--- .../apm/agent_explorer/latest_agent_versions.spec.ts | 3 +-- .../deployment_agnostic/services/apm_api.ts | 10 +++------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts index 5ea2697eb2eb8..3549e9e622373 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts @@ -13,7 +13,7 @@ import { keyBy } from 'lodash'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { - const apiApi = getService('apmApi'); + const apmApiClient = getService('apmApi'); const registry = getService('registry'); const synthtrace = getService('synthtrace'); @@ -28,8 +28,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon APIClientRequestParamsOf<'GET /internal/apm/get_agents_per_service'>['params'] > ) { - const client = await apiApi.createApmApiClient(); - return await client.readUser({ + return await apmApiClient.readUser({ endpoint: 'GET /internal/apm/get_agents_per_service', params: { query: { diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts index 94c4ba08008fe..c939e8911fc10 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts @@ -10,13 +10,12 @@ import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provi export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const registry = getService('registry'); - const apiApi = getService('apmApi'); + const apmApiClient = getService('apmApi'); const nodeAgentName = 'nodejs'; const unlistedAgentName = 'unlistedAgent'; async function callApi() { - const apmApiClient = await apiApi.createApmApiClient(); return await apmApiClient.readUser({ endpoint: 'GET /internal/apm/get_latest_agent_versions', }); diff --git a/x-pack/test/api_integration/deployment_agnostic/services/apm_api.ts b/x-pack/test/api_integration/deployment_agnostic/services/apm_api.ts index 0de6427000c5f..2cfbbc5264598 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/apm_api.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/apm_api.ts @@ -110,12 +110,8 @@ export interface SupertestReturnType { export function ApmApiProvider(context: DeploymentAgnosticFtrProviderContext) { return { - async createApmApiClient() { - return { - readUser: createApmApiClient(context, 'viewer'), - adminUser: createApmApiClient(context, 'admin'), - writeUser: createApmApiClient(context, 'editor'), - }; - }, + readUser: createApmApiClient(context, 'viewer'), + adminUser: createApmApiClient(context, 'admin'), + writeUser: createApmApiClient(context, 'editor'), }; } From 4d684c60a0ba0bc32bf1b6a81eea3a80756936b4 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 4 Nov 2024 15:24:43 +0100 Subject: [PATCH 06/17] Symplify createApmSynthtraceEsClient --- .../observability/apm/agent_explorer/agent_explorer.spec.ts | 3 +-- .../api_integration/deployment_agnostic/services/synthtrace.ts | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts index 3549e9e622373..073f3c65634e8 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/agent_explorer.spec.ts @@ -57,8 +57,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon let apmSynthtraceEsClient: ApmSynthtraceEsClient; before(async () => { - const version = (await synthtrace.apmSynthtraceKibanaClient.installApmPackage()).version; - apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(version); + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); const serviceOtelJava = apm .service({ diff --git a/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts b/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts index 1ab2692095ca3..eda492ff37a43 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/synthtrace.ts @@ -39,7 +39,8 @@ export function SynthtraceProvider({ getService }: DeploymentAgnosticFtrProvider return { apmSynthtraceKibanaClient, createLogsSynthtraceEsClient: () => getLogsSynthtraceEsClient(client), - async createApmSynthtraceEsClient(packageVersion: string) { + async createApmSynthtraceEsClient() { + const packageVersion = (await apmSynthtraceKibanaClient.installApmPackage()).version; return getApmSynthtraceEsClient({ client, packageVersion }); }, }; From 4870a81b1a53fe696c033b4342d4d14122190243 Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Tue, 5 Nov 2024 18:19:31 +0200 Subject: [PATCH 07/17] [APM] Migrate `/mobile` API tests to deployment agnostic folder --- .../mobile/crashes/crash_group_list.spec.ts | 17 ++++++++----- .../apm}/mobile/crashes/distribution.spec.ts | 17 ++++++++----- .../apm}/mobile/crashes/generate_data.ts | 0 .../apm}/mobile/errors/generate_data.ts | 0 .../mobile/errors/group_id_samples.spec.ts | 14 +++++------ .../apm}/mobile/generate_mobile_data.ts | 0 ...obile_detailed_statistics_by_field.spec.ts | 24 ++++++++++--------- .../apm}/mobile/mobile_filters.spec.ts | 12 +++++----- .../mobile_http_requests_timeseries.spec.ts | 12 +++++----- .../apm}/mobile/mobile_location_stats.spec.ts | 12 +++++----- .../mobile_main_statistics_by_field.spec.ts | 12 +++++----- .../mobile/mobile_most_used_chart.spec.ts | 12 +++++----- .../mobile/mobile_sessions_timeseries.spec.ts | 12 +++++----- .../apm}/mobile/mobile_stats.spec.ts | 12 +++++----- .../apm}/mobile/mobile_terms_by_field.spec.ts | 12 +++++----- 15 files changed, 90 insertions(+), 78 deletions(-) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/crashes/crash_group_list.spec.ts (89%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/crashes/distribution.spec.ts (92%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/crashes/generate_data.ts (100%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/errors/generate_data.ts (100%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/errors/group_id_samples.spec.ts (92%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/generate_mobile_data.ts (100%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_detailed_statistics_by_field.spec.ts (87%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_filters.spec.ts (93%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_http_requests_timeseries.spec.ts (93%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_location_stats.spec.ts (96%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_main_statistics_by_field.spec.ts (95%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_most_used_chart.spec.ts (89%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_sessions_timeseries.spec.ts (90%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_stats.spec.ts (95%) rename x-pack/test/{apm_api_integration/tests => api_integration/deployment_agnostic/apis/observability/apm}/mobile/mobile_terms_by_field.spec.ts (93%) diff --git a/x-pack/test/apm_api_integration/tests/mobile/crashes/crash_group_list.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts similarity index 89% rename from x-pack/test/apm_api_integration/tests/mobile/crashes/crash_group_list.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts index a36036b3ec8e2..e89ed64a294c4 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/crashes/crash_group_list.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts @@ -11,15 +11,16 @@ import { APIReturnType, } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; type ErrorGroups = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics'>['errorGroups']; -export default function ApiTest({ getService }: FtrProviderContext) { +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const serviceName = 'synth-swift'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -45,7 +46,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); } - registry.when('when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('when data is not loaded', () => { it('handles empty state', async () => { const response = await callApi(); expect(response.status).to.be(200); @@ -54,8 +55,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177651 - registry.when.skip('when data is loaded', { config: 'basic', archives: [] }, () => { + registry.when.skip('when data is loaded', () => { describe('errors group', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + const appleTransaction = { name: 'GET /apple 🍎 ', successRate: 75, @@ -73,6 +76,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { .service({ name: serviceName, environment: 'production', agentName: 'swift' }) .instance('instance-a'); + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + await apmSynthtraceEsClient.index([ timerange(start, end) .interval('1m') diff --git a/x-pack/test/apm_api_integration/tests/mobile/crashes/distribution.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts similarity index 92% rename from x-pack/test/apm_api_integration/tests/mobile/crashes/distribution.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts index 2fabce70d2696..d2e052709fbcd 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/crashes/distribution.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts @@ -11,17 +11,19 @@ import { APIClientRequestParamsOf, APIReturnType, } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; + import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; import { config, generateData } from './generate_data'; type ErrorsDistribution = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/crashes/distribution'>; -export default function ApiTest({ getService }: FtrProviderContext) { +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const serviceName = 'synth-swift'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -51,7 +53,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { return response; } - registry.when('when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('when data is not loaded', () => { it('handles the empty state', async () => { const response = await callApi(); expect(response.status).to.be(200); @@ -61,10 +63,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177652 - registry.when.skip('when data is loaded', { config: 'basic', archives: [] }, () => { + registry.when.skip('when data is loaded', () => { describe('errors distribution', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + const { appleTransaction, bananaTransaction } = config; before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); await generateData({ serviceName, start, end, apmSynthtraceEsClient }); }); diff --git a/x-pack/test/apm_api_integration/tests/mobile/crashes/generate_data.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/generate_data.ts similarity index 100% rename from x-pack/test/apm_api_integration/tests/mobile/crashes/generate_data.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/generate_data.ts diff --git a/x-pack/test/apm_api_integration/tests/mobile/errors/generate_data.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/generate_data.ts similarity index 100% rename from x-pack/test/apm_api_integration/tests/mobile/errors/generate_data.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/generate_data.ts diff --git a/x-pack/test/apm_api_integration/tests/mobile/errors/group_id_samples.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts similarity index 92% rename from x-pack/test/apm_api_integration/tests/mobile/errors/group_id_samples.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts index 129cbe2a71809..22b8b2ac77d31 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/errors/group_id_samples.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts @@ -10,7 +10,7 @@ import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; import { orderBy } from 'lodash'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { getErrorGroupingKey } from '@kbn/apm-synthtrace-client/src/lib/apm/instance'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; import { config, generateData } from './generate_data'; type ErrorGroupSamples = @@ -19,10 +19,10 @@ type ErrorGroupSamples = type ErrorSampleDetails = APIReturnType<'GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}'>; -export default function ApiTest({ getService }: FtrProviderContext) { +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -67,7 +67,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { return response; } - registry.when('when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('when data is not loaded', () => { it('handles the empty state', async () => { const response = await callErrorGroupSamplesApi({ groupId: 'foo' }); expect(response.status).to.be(200); @@ -76,7 +76,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177654 - registry.when.skip('when samples data is loaded', { config: 'basic', archives: [] }, () => { + registry.when.skip('when samples data is loaded', () => { const { bananaTransaction } = config; describe('error group id', () => { before(async () => { @@ -105,7 +105,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177665 - registry.when.skip('when error sample data is loaded', { config: 'basic', archives: [] }, () => { + registry.when.skip('when error sample data is loaded', () => { describe('error sample id', () => { before(async () => { await generateData({ serviceName, start, end, apmSynthtraceEsClient }); diff --git a/x-pack/test/apm_api_integration/tests/mobile/generate_mobile_data.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/generate_mobile_data.ts similarity index 100% rename from x-pack/test/apm_api_integration/tests/mobile/generate_mobile_data.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/generate_mobile_data.ts diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_detailed_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts similarity index 87% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_detailed_statistics_by_field.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts index a8912989e295b..18ef0ac999e7e 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_detailed_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts @@ -10,16 +10,18 @@ import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_value import { isEmpty } from 'lodash'; import moment from 'moment'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; import { generateMobileData, SERVICE_VERSIONS } from './generate_mobile_data'; type MobileDetailedStatisticsResponse = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/detailed_statistics'>; -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -58,7 +60,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when( 'Mobile detailed statistics when data is not loaded', - { config: 'basic', archives: [] }, + () => { describe('when no data', () => { it('handles empty state', async () => { @@ -73,11 +75,11 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); // FLAKY: https://github.com/elastic/kibana/issues/177388 - registry.when.skip( - 'Mobile detailed statistics when data is loaded', - { config: 'basic', archives: [] }, - () => { + registry.when.skip('Mobile detailed statistics when data is loaded', () => { + describe('Mobile detailed statistics', () => { before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + await generateMobileData({ apmSynthtraceEsClient, start, @@ -133,6 +135,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); }); - } - ); + }); + }); } diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_filters.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts similarity index 93% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_filters.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts index edebde9f0d439..178632f8ae026 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_filters.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts @@ -10,7 +10,7 @@ import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; type MobileFilters = APIReturnType<'GET /internal/apm/services/{serviceName}/mobile/filters'>; @@ -133,10 +133,10 @@ async function generateData({ ]); } -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -166,7 +166,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { .then(({ body }) => body); } - registry.when('Mobile filters when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('Mobile filters when data is not loaded', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileFilters({ serviceName: 'foo' }); @@ -178,7 +178,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177389 - registry.when.skip('Mobile filters', { config: 'basic', archives: [] }, () => { + registry.when.skip('Mobile filters', () => { before(async () => { await generateData({ apmSynthtraceEsClient, diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_http_requests_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts similarity index 93% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_http_requests_timeseries.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts index ccd4ddd23ca53..c6239eadb5dde 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_http_requests_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts @@ -7,13 +7,13 @@ import expect from '@kbn/expect'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; import { generateMobileData } from './generate_mobile_data'; -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T02:00:00.000Z').getTime(); @@ -49,7 +49,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when.skip( 'Mobile HTTP requests without data loaded', - { config: 'basic', archives: [] }, + () => { describe('when no data', () => { it('handles empty state', async () => { @@ -65,7 +65,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/177390 registry.when.skip( 'Mobile HTTP requests with data loaded', - { config: 'basic', archives: [] }, + () => { before(async () => { await generateMobileData({ diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts similarity index 96% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts index ec82de406e0e0..20cc883253f41 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts @@ -10,7 +10,7 @@ import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; type MobileLocationStats = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/location/stats'>; @@ -176,10 +176,10 @@ async function generateData({ ]); } -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -212,7 +212,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { .then(({ body }) => body); } - registry.when('Location stats when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('Location stats when data is not loaded', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileLocationStats({ serviceName: 'foo' }); @@ -233,7 +233,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177396 - registry.when.skip('Location stats', { config: 'basic', archives: [] }, () => { + registry.when.skip('Location stats', () => { before(async () => { await generateData({ apmSynthtraceEsClient, diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_main_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts similarity index 95% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_main_statistics_by_field.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts index 945ed5970e000..a5a78f8c12b32 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_main_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts @@ -9,7 +9,7 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; const GALAXY_DURATION = 500; const HUAWEI_DURATION = 20; @@ -126,10 +126,10 @@ async function generateData({ ]); } -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -164,7 +164,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when( 'Mobile main statistics when data is not loaded', - { config: 'basic', archives: [] }, + () => { describe('when no data', () => { it('handles empty state', async () => { @@ -179,7 +179,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); // FLAKY: https://github.com/elastic/kibana/issues/177395 - registry.when.skip('Mobile main statistics', { config: 'basic', archives: [] }, () => { + registry.when.skip('Mobile main statistics', () => { before(async () => { await generateData({ apmSynthtraceEsClient, diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_most_used_chart.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts similarity index 89% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_most_used_chart.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts index cde19d07344d6..154e546939c05 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_most_used_chart.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts @@ -8,16 +8,16 @@ import expect from '@kbn/expect'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; import { generateMobileData } from './generate_mobile_data'; type MostUsedCharts = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/most_used_charts'>; -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -52,7 +52,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when( 'Most used charts when data is not loaded', - { config: 'basic', archives: [] }, + () => { describe('when no data', () => { it('handles empty state', async () => { @@ -65,7 +65,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); // FLAKY: https://github.com/elastic/kibana/issues/177394 - registry.when.skip('Mobile stats', { config: 'basic', archives: [] }, () => { + registry.when.skip('Mobile stats', () => { before(async () => { await generateMobileData({ apmSynthtraceEsClient, diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_sessions_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts similarity index 90% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_sessions_timeseries.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts index f7f3092935c31..60de95479f610 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_sessions_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts @@ -7,13 +7,13 @@ import expect from '@kbn/expect'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; import { generateMobileData } from './generate_mobile_data'; -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T02:00:00.000Z').getTime(); @@ -47,7 +47,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); } - registry.when.skip('without data loaded', { config: 'basic', archives: [] }, () => { + registry.when.skip('without data loaded', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getSessionsChart({ serviceName: 'foo' }); @@ -59,7 +59,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177393 - registry.when.skip('with data loaded', { config: 'basic', archives: [] }, () => { + registry.when.skip('with data loaded', () => { before(async () => { await generateMobileData({ apmSynthtraceEsClient, diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts similarity index 95% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts index 0b1e71471a2b4..3aa208dc4c5c9 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts @@ -11,7 +11,7 @@ import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import { meanBy, sumBy } from 'lodash'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; type MobileStats = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/stats'>; @@ -134,10 +134,10 @@ async function generateData({ ]); } -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -170,7 +170,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { .then(({ body }) => body); } - registry.when('Mobile stats when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('Mobile stats when data is not loaded', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileStats({ serviceName: 'foo' }); @@ -185,7 +185,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177392 - registry.when.skip('Mobile stats', { config: 'basic', archives: [] }, () => { + registry.when.skip('Mobile stats', () => { before(async () => { await generateData({ apmSynthtraceEsClient, diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_terms_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts similarity index 93% rename from x-pack/test/apm_api_integration/tests/mobile/mobile_terms_by_field.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts index 3ccdba0a24236..c8dc0a583c5a3 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_terms_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts @@ -9,7 +9,7 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; // we generate 3 transactions per each mobile device // timerange 15min, interval 5m, rate 1 @@ -124,10 +124,10 @@ async function generateData({ ]); } -export default function ApiTest({ getService }: FtrProviderContext) { - const apmApiClient = getService('apmApiClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); const registry = getService('registry'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); + const synthtrace = getService('synthtrace'); const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -163,7 +163,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { .then(({ body }) => body); } - registry.when('Mobile terms when data is not loaded', { config: 'basic', archives: [] }, () => { + registry.when('Mobile terms when data is not loaded', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileTermsByField({ @@ -186,7 +186,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // FLAKY: https://github.com/elastic/kibana/issues/177498 - registry.when.skip('Mobile terms', { config: 'basic', archives: [] }, () => { + registry.when.skip('Mobile terms', () => { before(async () => { await generateData({ apmSynthtraceEsClient, From 9a19a9bb5a454367331d6e149d63cd6fa7b5b25e Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Wed, 6 Nov 2024 21:00:40 +0200 Subject: [PATCH 08/17] Remove registry service --- .../apis/observability/apm/index.ts | 1 + .../mobile/crashes/crash_group_list.spec.ts | 191 ++++++++------- .../apm/mobile/crashes/distribution.spec.ts | 221 +++++++++--------- .../mobile/errors/group_id_samples.spec.ts | 189 +++++++-------- .../apis/observability/apm/mobile/index.ts | 25 ++ ...obile_detailed_statistics_by_field.spec.ts | 29 +-- .../apm/mobile/mobile_filters.spec.ts | 33 ++- .../mobile_http_requests_timeseries.spec.ts | 136 +++++------ .../apm/mobile/mobile_location_stats.spec.ts | 177 +++++++------- .../mobile_main_statistics_by_field.spec.ts | 132 ++++++----- .../apm/mobile/mobile_most_used_chart.spec.ts | 82 +++---- .../mobile/mobile_sessions_timeseries.spec.ts | 112 ++++----- .../apm/mobile/mobile_stats.spec.ts | 181 +++++++------- .../apm/mobile/mobile_terms_by_field.spec.ts | 111 ++++----- 14 files changed, 823 insertions(+), 797 deletions(-) create mode 100644 x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts index a62c11d40b1af..1f5606a96538a 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts @@ -12,5 +12,6 @@ export default function apmApiIntegrationTests({ }: DeploymentAgnosticFtrProviderContext) { describe('APM', function () { loadTestFile(require.resolve('./agent_explorer')); + loadTestFile(require.resolve('./mobile')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts index e89ed64a294c4..3e46b0c725c86 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts @@ -18,7 +18,6 @@ type ErrorGroups = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics'>['errorGroups']; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { - const registry = getService('registry'); const apmApiClient = getService('apmApi'); const synthtrace = getService('synthtrace'); @@ -46,115 +45,115 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); } - registry.when('when data is not loaded', () => { + describe('Crash group list', () => { it('handles empty state', async () => { const response = await callApi(); expect(response.status).to.be(200); expect(response.body.errorGroups).to.empty(); }); - }); - // FLAKY: https://github.com/elastic/kibana/issues/177651 - registry.when.skip('when data is loaded', () => { - describe('errors group', () => { - let apmSynthtraceEsClient: ApmSynthtraceEsClient; + // FLAKY: https://github.com/elastic/kibana/issues/177651 + describe.skip('when data is loaded', () => { + describe('errors group', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; - const appleTransaction = { - name: 'GET /apple 🍎 ', - successRate: 75, - failureRate: 25, - }; + const appleTransaction = { + name: 'GET /apple 🍎 ', + successRate: 75, + failureRate: 25, + }; - const bananaTransaction = { - name: 'GET /banana 🍌', - successRate: 50, - failureRate: 50, - }; + const bananaTransaction = { + name: 'GET /banana 🍌', + successRate: 50, + failureRate: 50, + }; - before(async () => { - const serviceInstance = apm - .service({ name: serviceName, environment: 'production', agentName: 'swift' }) - .instance('instance-a'); + before(async () => { + const serviceInstance = apm + .service({ name: serviceName, environment: 'production', agentName: 'swift' }) + .instance('instance-a'); - apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); - await apmSynthtraceEsClient.index([ - timerange(start, end) - .interval('1m') - .rate(appleTransaction.successRate) - .generator((timestamp) => - serviceInstance - .transaction({ transactionName: appleTransaction.name }) - .timestamp(timestamp) - .duration(1000) - .success() - ), - timerange(start, end) - .interval('1m') - .rate(appleTransaction.failureRate) - .generator((timestamp) => - serviceInstance - .transaction({ transactionName: appleTransaction.name }) - .errors( - serviceInstance - .crash({ - message: 'crash 1', - }) - .timestamp(timestamp) - ) - .duration(1000) - .timestamp(timestamp) - .failure() - ), - timerange(start, end) - .interval('1m') - .rate(bananaTransaction.successRate) - .generator((timestamp) => - serviceInstance - .transaction({ transactionName: bananaTransaction.name }) - .timestamp(timestamp) - .duration(1000) - .success() - ), - timerange(start, end) - .interval('1m') - .rate(bananaTransaction.failureRate) - .generator((timestamp) => - serviceInstance - .transaction({ transactionName: bananaTransaction.name }) - .errors( - serviceInstance - .crash({ - message: 'crash 2', - }) - .timestamp(timestamp) - ) - .duration(1000) - .timestamp(timestamp) - .failure() - ), - ]); - }); + await apmSynthtraceEsClient.index([ + timerange(start, end) + .interval('1m') + .rate(appleTransaction.successRate) + .generator((timestamp) => + serviceInstance + .transaction({ transactionName: appleTransaction.name }) + .timestamp(timestamp) + .duration(1000) + .success() + ), + timerange(start, end) + .interval('1m') + .rate(appleTransaction.failureRate) + .generator((timestamp) => + serviceInstance + .transaction({ transactionName: appleTransaction.name }) + .errors( + serviceInstance + .crash({ + message: 'crash 1', + }) + .timestamp(timestamp) + ) + .duration(1000) + .timestamp(timestamp) + .failure() + ), + timerange(start, end) + .interval('1m') + .rate(bananaTransaction.successRate) + .generator((timestamp) => + serviceInstance + .transaction({ transactionName: bananaTransaction.name }) + .timestamp(timestamp) + .duration(1000) + .success() + ), + timerange(start, end) + .interval('1m') + .rate(bananaTransaction.failureRate) + .generator((timestamp) => + serviceInstance + .transaction({ transactionName: bananaTransaction.name }) + .errors( + serviceInstance + .crash({ + message: 'crash 2', + }) + .timestamp(timestamp) + ) + .duration(1000) + .timestamp(timestamp) + .failure() + ), + ]); + }); - after(() => apmSynthtraceEsClient.clean()); + after(() => apmSynthtraceEsClient.clean()); - describe('returns the correct data', () => { - let errorGroups: ErrorGroups; - before(async () => { - const response = await callApi(); - errorGroups = response.body.errorGroups; - }); - it('returns correct number of crashes', () => { - expect(errorGroups.length).to.equal(2); - expect(errorGroups.map((error) => error.name).sort()).to.eql(['crash 1', 'crash 2']); - }); + describe('returns the correct data', () => { + let errorGroups: ErrorGroups; + before(async () => { + const response = await callApi(); + errorGroups = response.body.errorGroups; + }); + it('returns correct number of crashes', () => { + expect(errorGroups.length).to.equal(2); + expect(errorGroups.map((error) => error.name).sort()).to.eql(['crash 1', 'crash 2']); + }); - it('returns correct occurrences', () => { - const numberOfBuckets = 15; - expect(errorGroups.map((error) => error.occurrences).sort()).to.eql([ - appleTransaction.failureRate * numberOfBuckets, - bananaTransaction.failureRate * numberOfBuckets, - ]); + it('returns correct occurrences', () => { + const numberOfBuckets = 15; + expect(errorGroups.map((error) => error.occurrences).sort()).to.eql([ + appleTransaction.failureRate * numberOfBuckets, + bananaTransaction.failureRate * numberOfBuckets, + ]); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts index d2e052709fbcd..05907597d011a 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts @@ -21,7 +21,6 @@ type ErrorsDistribution = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/crashes/distribution'>; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { - const registry = getService('registry'); const apmApiClient = getService('apmApi'); const synthtrace = getService('synthtrace'); @@ -53,153 +52,153 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon return response; } - registry.when('when data is not loaded', () => { + describe('Distribution', () => { it('handles the empty state', async () => { const response = await callApi(); expect(response.status).to.be(200); expect(response.body.currentPeriod.length).to.be(0); expect(response.body.previousPeriod.length).to.be(0); }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177652 - registry.when.skip('when data is loaded', () => { - describe('errors distribution', () => { - let apmSynthtraceEsClient: ApmSynthtraceEsClient; - - const { appleTransaction, bananaTransaction } = config; - before(async () => { - apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); - await generateData({ serviceName, start, end, apmSynthtraceEsClient }); - }); - after(() => apmSynthtraceEsClient.clean()); + // FLAKY: https://github.com/elastic/kibana/issues/177652 + describe.skip('when data is loaded', () => { + describe('errors distribution', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; - describe('without comparison', () => { - let errorsDistribution: ErrorsDistribution; + const { appleTransaction, bananaTransaction } = config; before(async () => { - const response = await callApi(); - errorsDistribution = response.body; + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + await generateData({ serviceName, start, end, apmSynthtraceEsClient }); }); - it('displays combined number of occurrences', () => { - const countSum = sumBy(errorsDistribution.currentPeriod, 'y'); - const numberOfBuckets = 15; - expect(countSum).to.equal( - (appleTransaction.failureRate + bananaTransaction.failureRate) * numberOfBuckets - ); - }); + after(() => apmSynthtraceEsClient.clean()); - describe('displays correct start in errors distribution chart', () => { - let errorsDistributionWithComparison: ErrorsDistribution; + describe('without comparison', () => { + let errorsDistribution: ErrorsDistribution; before(async () => { - const responseWithComparison = await callApi({ - query: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - offset: '15m', - }, - }); - errorsDistributionWithComparison = responseWithComparison.body; + const response = await callApi(); + errorsDistribution = response.body; }); - it('has same start time when comparison is enabled', () => { - expect(first(errorsDistribution.currentPeriod)?.x).to.equal( - first(errorsDistributionWithComparison.currentPeriod)?.x + + it('displays combined number of occurrences', () => { + const countSum = sumBy(errorsDistribution.currentPeriod, 'y'); + const numberOfBuckets = 15; + expect(countSum).to.equal( + (appleTransaction.failureRate + bananaTransaction.failureRate) * numberOfBuckets ); }); - }); - }); - describe('displays occurrences for type "apple transaction" only', () => { - let errorsDistribution: ErrorsDistribution; - before(async () => { - const response = await callApi({ - query: { kuery: `error.exception.type:"${appleTransaction.name}"` }, + describe('displays correct start in errors distribution chart', () => { + let errorsDistributionWithComparison: ErrorsDistribution; + before(async () => { + const responseWithComparison = await callApi({ + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + offset: '15m', + }, + }); + errorsDistributionWithComparison = responseWithComparison.body; + }); + it('has same start time when comparison is enabled', () => { + expect(first(errorsDistribution.currentPeriod)?.x).to.equal( + first(errorsDistributionWithComparison.currentPeriod)?.x + ); + }); }); - errorsDistribution = response.body; - }); - it('displays combined number of occurrences', () => { - const countSum = sumBy(errorsDistribution.currentPeriod, 'y'); - const numberOfBuckets = 15; - expect(countSum).to.equal(appleTransaction.failureRate * numberOfBuckets); }); - }); - describe('with comparison', () => { - describe('when data is returned', () => { + describe('displays occurrences for type "apple transaction" only', () => { let errorsDistribution: ErrorsDistribution; before(async () => { - const fiveMinutes = 5 * 60 * 1000; const response = await callApi({ - query: { - start: new Date(end - fiveMinutes).toISOString(), - end: new Date(end).toISOString(), - offset: '5m', - }, + query: { kuery: `error.exception.type:"${appleTransaction.name}"` }, }); errorsDistribution = response.body; }); - it('returns some data', () => { - const hasCurrentPeriodData = errorsDistribution.currentPeriod.some(({ y }) => - isFiniteNumber(y) - ); + it('displays combined number of occurrences', () => { + const countSum = sumBy(errorsDistribution.currentPeriod, 'y'); + const numberOfBuckets = 15; + expect(countSum).to.equal(appleTransaction.failureRate * numberOfBuckets); + }); + }); - const hasPreviousPeriodData = errorsDistribution.previousPeriod.some(({ y }) => - isFiniteNumber(y) - ); + describe('with comparison', () => { + describe('when data is returned', () => { + let errorsDistribution: ErrorsDistribution; + before(async () => { + const fiveMinutes = 5 * 60 * 1000; + const response = await callApi({ + query: { + start: new Date(end - fiveMinutes).toISOString(), + end: new Date(end).toISOString(), + offset: '5m', + }, + }); + errorsDistribution = response.body; + }); + it('returns some data', () => { + const hasCurrentPeriodData = errorsDistribution.currentPeriod.some(({ y }) => + isFiniteNumber(y) + ); - expect(hasCurrentPeriodData).to.equal(true); - expect(hasPreviousPeriodData).to.equal(true); - }); + const hasPreviousPeriodData = errorsDistribution.previousPeriod.some(({ y }) => + isFiniteNumber(y) + ); - it('has same start time for both periods', () => { - expect(first(errorsDistribution.currentPeriod)?.x).to.equal( - first(errorsDistribution.previousPeriod)?.x - ); - }); + expect(hasCurrentPeriodData).to.equal(true); + expect(hasPreviousPeriodData).to.equal(true); + }); - it('has same end time for both periods', () => { - expect(last(errorsDistribution.currentPeriod)?.x).to.equal( - last(errorsDistribution.previousPeriod)?.x - ); - }); + it('has same start time for both periods', () => { + expect(first(errorsDistribution.currentPeriod)?.x).to.equal( + first(errorsDistribution.previousPeriod)?.x + ); + }); - it('returns same number of buckets for both periods', () => { - expect(errorsDistribution.currentPeriod.length).to.equal( - errorsDistribution.previousPeriod.length - ); - }); - }); + it('has same end time for both periods', () => { + expect(last(errorsDistribution.currentPeriod)?.x).to.equal( + last(errorsDistribution.previousPeriod)?.x + ); + }); - describe('when no data is returned', () => { - let errorsDistribution: ErrorsDistribution; - before(async () => { - const response = await callApi({ - query: { - start: '2021-01-03T00:00:00.000Z', - end: '2021-01-03T00:15:00.000Z', - offset: '1d', - }, + it('returns same number of buckets for both periods', () => { + expect(errorsDistribution.currentPeriod.length).to.equal( + errorsDistribution.previousPeriod.length + ); }); - errorsDistribution = response.body; }); - it('has same start time for both periods', () => { - expect(first(errorsDistribution.currentPeriod)?.x).to.equal( - first(errorsDistribution.previousPeriod)?.x - ); - }); + describe('when no data is returned', () => { + let errorsDistribution: ErrorsDistribution; + before(async () => { + const response = await callApi({ + query: { + start: '2021-01-03T00:00:00.000Z', + end: '2021-01-03T00:15:00.000Z', + offset: '1d', + }, + }); + errorsDistribution = response.body; + }); - it('has same end time for both periods', () => { - expect(last(errorsDistribution.currentPeriod)?.x).to.equal( - last(errorsDistribution.previousPeriod)?.x - ); - }); + it('has same start time for both periods', () => { + expect(first(errorsDistribution.currentPeriod)?.x).to.equal( + first(errorsDistribution.previousPeriod)?.x + ); + }); - it('returns same number of buckets for both periods', () => { - expect(errorsDistribution.currentPeriod.length).to.equal( - errorsDistribution.previousPeriod.length - ); + it('has same end time for both periods', () => { + expect(last(errorsDistribution.currentPeriod)?.x).to.equal( + last(errorsDistribution.previousPeriod)?.x + ); + }); + + it('returns same number of buckets for both periods', () => { + expect(errorsDistribution.currentPeriod.length).to.equal( + errorsDistribution.previousPeriod.length + ); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts index 22b8b2ac77d31..0c659349ad570 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts @@ -8,6 +8,7 @@ import expect from '@kbn/expect'; import { timerange } from '@kbn/apm-synthtrace-client'; import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; import { orderBy } from 'lodash'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { getErrorGroupingKey } from '@kbn/apm-synthtrace-client/src/lib/apm/instance'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; @@ -20,7 +21,6 @@ type ErrorSampleDetails = APIReturnType<'GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}'>; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { - const registry = getService('registry'); const apmApiClient = getService('apmApi'); const synthtrace = getService('synthtrace'); @@ -67,122 +67,129 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon return response; } - registry.when('when data is not loaded', () => { + describe('Group id samples', () => { it('handles the empty state', async () => { const response = await callErrorGroupSamplesApi({ groupId: 'foo' }); expect(response.status).to.be(200); expect(response.body.occurrencesCount).to.be(0); }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177654 - registry.when.skip('when samples data is loaded', () => { - const { bananaTransaction } = config; - describe('error group id', () => { - before(async () => { - await generateData({ serviceName, start, end, apmSynthtraceEsClient }); - }); - after(() => apmSynthtraceEsClient.clean()); + // FLAKY: https://github.com/elastic/kibana/issues/177654 + describe.skip('when samples data is loaded', () => { + const { bananaTransaction } = config; + describe('error group id', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; - describe('return correct data', () => { - let errorsSamplesResponse: ErrorGroupSamples; before(async () => { - const response = await callErrorGroupSamplesApi({ - groupId: '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03', - }); - errorsSamplesResponse = response.body; + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + await generateData({ serviceName, start, end, apmSynthtraceEsClient }); }); - it('displays correct number of occurrences', () => { - const numberOfBuckets = 15; - expect(errorsSamplesResponse.occurrencesCount).to.equal( - bananaTransaction.failureRate * numberOfBuckets - ); + after(() => apmSynthtraceEsClient.clean()); + + describe('return correct data', () => { + let errorsSamplesResponse: ErrorGroupSamples; + before(async () => { + const response = await callErrorGroupSamplesApi({ + groupId: '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03', + }); + errorsSamplesResponse = response.body; + }); + + it('displays correct number of occurrences', () => { + const numberOfBuckets = 15; + expect(errorsSamplesResponse.occurrencesCount).to.equal( + bananaTransaction.failureRate * numberOfBuckets + ); + }); }); }); }); - }); - // FLAKY: https://github.com/elastic/kibana/issues/177665 - registry.when.skip('when error sample data is loaded', () => { - describe('error sample id', () => { - before(async () => { - await generateData({ serviceName, start, end, apmSynthtraceEsClient }); - }); + // FLAKY: https://github.com/elastic/kibana/issues/177665 + describe.skip('when error sample data is loaded', () => { + describe('error sample id', () => { + before(async () => { + await generateData({ serviceName, start, end, apmSynthtraceEsClient }); + }); - after(() => apmSynthtraceEsClient.clean()); + after(() => apmSynthtraceEsClient.clean()); - describe('return correct data', () => { - let errorSampleDetailsResponse: ErrorSampleDetails; - before(async () => { - const errorsSamplesResponse = await callErrorGroupSamplesApi({ - groupId: '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03', - }); + describe('return correct data', () => { + let errorSampleDetailsResponse: ErrorSampleDetails; + before(async () => { + const errorsSamplesResponse = await callErrorGroupSamplesApi({ + groupId: '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03', + }); - const errorId = errorsSamplesResponse.body.errorSampleIds[0]; + const errorId = errorsSamplesResponse.body.errorSampleIds[0]; - const response = await callErrorSampleDetailsApi(errorId); - errorSampleDetailsResponse = response.body; - }); + const response = await callErrorSampleDetailsApi(errorId); + errorSampleDetailsResponse = response.body; + }); - it('displays correct error grouping_key', () => { - expect(errorSampleDetailsResponse.error.error.grouping_key).to.equal( - '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03' - ); - }); + it('displays correct error grouping_key', () => { + expect(errorSampleDetailsResponse.error.error.grouping_key).to.equal( + '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03' + ); + }); - it('displays correct error message', () => { - expect(errorSampleDetailsResponse.error.error.exception?.[0].message).to.equal('Error 1'); + it('displays correct error message', () => { + expect(errorSampleDetailsResponse.error.error.exception?.[0].message).to.equal( + 'Error 1' + ); + }); }); }); - }); - describe('with sampled and unsampled transactions', () => { - let errorGroupSamplesResponse: ErrorGroupSamples; - - before(async () => { - const instance = service(serviceName, 'production', 'go').instance('a'); - const errorMessage = 'Error 1'; - const groupId = getErrorGroupingKey(errorMessage); - - await apmSynthtraceEsClient.index([ - timerange(start, end) - .interval('15m') - .rate(1) - .generator((timestamp) => { - return [ - instance - .transaction('GET /api/foo') - .duration(100) - .timestamp(timestamp) - .sample(false) - .errors( - instance.error({ message: errorMessage }).timestamp(timestamp), - instance.error({ message: errorMessage }).timestamp(timestamp + 1) - ), - instance - .transaction('GET /api/foo') - .duration(100) - .timestamp(timestamp) - .sample(true) - .errors(instance.error({ message: errorMessage }).timestamp(timestamp)), - ]; - }), - ]); - - errorGroupSamplesResponse = (await callErrorGroupSamplesApi({ groupId })).body; - }); + describe('with sampled and unsampled transactions', () => { + let errorGroupSamplesResponse: ErrorGroupSamples; - after(() => apmSynthtraceEsClient.clean()); + before(async () => { + const instance = service(serviceName, 'production', 'go').instance('a'); + const errorMessage = 'Error 1'; + const groupId = getErrorGroupingKey(errorMessage); + + await apmSynthtraceEsClient.index([ + timerange(start, end) + .interval('15m') + .rate(1) + .generator((timestamp) => { + return [ + instance + .transaction('GET /api/foo') + .duration(100) + .timestamp(timestamp) + .sample(false) + .errors( + instance.error({ message: errorMessage }).timestamp(timestamp), + instance.error({ message: errorMessage }).timestamp(timestamp + 1) + ), + instance + .transaction('GET /api/foo') + .duration(100) + .timestamp(timestamp) + .sample(true) + .errors(instance.error({ message: errorMessage }).timestamp(timestamp)), + ]; + }), + ]); + + errorGroupSamplesResponse = (await callErrorGroupSamplesApi({ groupId })).body; + }); - it('returns the errors in the correct order (sampled first, then unsampled)', () => { - const idsOfErrors = errorGroupSamplesResponse.errorSampleIds.map((id) => parseInt(id, 10)); + after(() => apmSynthtraceEsClient.clean()); - // this checks whether the order of indexing is different from the order that is returned - // if it is not, scoring/sorting is broken - expect(errorGroupSamplesResponse.errorSampleIds.length).to.be(3); - expect(idsOfErrors).to.not.eql(orderBy(idsOfErrors)); + it('returns the errors in the correct order (sampled first, then unsampled)', () => { + const idsOfErrors = errorGroupSamplesResponse.errorSampleIds.map((id) => + parseInt(id, 10) + ); + + // this checks whether the order of indexing is different from the order that is returned + // if it is not, scoring/sorting is broken + expect(errorGroupSamplesResponse.errorSampleIds.length).to.be(3); + expect(idsOfErrors).to.not.eql(orderBy(idsOfErrors)); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts new file mode 100644 index 0000000000000..e2a12408e22d1 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('agent_explorer', () => { + loadTestFile(require.resolve('./crashes/crash_group_list.spec.ts')); + loadTestFile(require.resolve('./crashes/distribution.spec.ts')); + loadTestFile(require.resolve('./errors/group_id_samples.spec.ts')); + loadTestFile(require.resolve('./mobile_detailed_statistics_by_field.spec.ts')); + loadTestFile(require.resolve('./mobile_filters.spec.ts')); + loadTestFile(require.resolve('./mobile_http_requests_timeseries.spec.ts')); + loadTestFile(require.resolve('./mobile_location_stats.spec.ts')); + loadTestFile(require.resolve('./mobile_main_statistics_by_field.spec.ts')); + loadTestFile(require.resolve('./mobile_most_used_chart.spec.ts')); + loadTestFile(require.resolve('./mobile_sessions_timeseries.spec.ts')); + loadTestFile(require.resolve('./mobile_stats.spec.ts')); + loadTestFile(require.resolve('./mobile_terms_by_field.spec.ts')); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts index 18ef0ac999e7e..fffb267ff3490 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts @@ -19,7 +19,7 @@ type MobileDetailedStatisticsResponse = export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); let apmSynthtraceEsClient: ApmSynthtraceEsClient; @@ -58,25 +58,20 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when( - 'Mobile detailed statistics when data is not loaded', - - () => { - describe('when no data', () => { - it('handles empty state', async () => { - const response = await getMobileDetailedStatisticsByField({ - serviceName: 'foo', - field: 'service.version', - }); - expect(response).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); + describe('Mobile detailed statistics ', () => { + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await getMobileDetailedStatisticsByField({ + serviceName: 'foo', + field: 'service.version', }); + expect(response).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); }); - } - ); + }); + + // FLAKY: https://github.com/elastic/kibana/issues/177388 - // FLAKY: https://github.com/elastic/kibana/issues/177388 - registry.when.skip('Mobile detailed statistics when data is loaded', () => { - describe('Mobile detailed statistics', () => { + describe.skip('when data is loaded', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts index 178632f8ae026..da988052cb293 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts @@ -7,8 +7,8 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; @@ -135,8 +135,9 @@ async function generateData({ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -166,7 +167,8 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when('Mobile filters when data is not loaded', () => { + // FLAKY: https://github.com/elastic/kibana/issues/177389 + describe.skip('Mobile filters', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileFilters({ serviceName: 'foo' }); @@ -175,30 +177,25 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177389 - registry.when.skip('Mobile filters', () => { - before(async () => { - await generateData({ - apmSynthtraceEsClient, - start, - end, - }); - }); - - after(() => apmSynthtraceEsClient.clean()); describe('when data is loaded', () => { - let response: MobileFilters; - before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + + await generateData({ + apmSynthtraceEsClient, + start, + end, + }); response = await getMobileFilters({ serviceName: 'synth-android', environment: 'production', }); }); + after(() => apmSynthtraceEsClient.clean()); + let response: MobileFilters; + it('returns correct filters for device', () => { response.mobileFilters.map(({ key, options }) => { if (key === 'device') { diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts index c6239eadb5dde..d792bbb09c7c9 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts @@ -7,13 +7,15 @@ import expect from '@kbn/expect'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; import { generateMobileData } from './generate_mobile_data'; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T02:00:00.000Z').getTime(); @@ -47,27 +49,20 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); } - registry.when.skip( - 'Mobile HTTP requests without data loaded', - - () => { - describe('when no data', () => { - it('handles empty state', async () => { - const response = await getHttpRequestsChart({ serviceName: 'foo' }); - expect(response.body.currentPeriod.timeseries).to.eql([]); - expect(response.body.previousPeriod.timeseries).to.eql([]); - expect(response.status).to.be(200); - }); + describe('Mobile HTTP requests ', () => { + describe('when no data', () => { + it('handles empty state', async () => { + const response = await getHttpRequestsChart({ serviceName: 'foo' }); + expect(response.body.currentPeriod.timeseries).to.eql([]); + expect(response.body.previousPeriod.timeseries).to.eql([]); + expect(response.status).to.be(200); }); - } - ); - - // FLAKY: https://github.com/elastic/kibana/issues/177390 - registry.when.skip( - 'Mobile HTTP requests with data loaded', - - () => { + }); + // FLAKY: https://github.com/elastic/kibana/issues/177390 + describe.skip('when data is loaded', () => { before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + await generateMobileData({ apmSynthtraceEsClient, start, @@ -76,68 +71,63 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); after(() => apmSynthtraceEsClient.clean()); - - describe('when data is loaded', () => { - it('returns timeseries for http requests chart', async () => { - const response = await getHttpRequestsChart({ - serviceName: 'synth-android', - offset: '1d', - }); - - expect(response.status).to.be(200); - expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( - true - ); - expect(response.body.previousPeriod.timeseries[0].y).to.eql(0); + it('returns timeseries for http requests chart', async () => { + const response = await getHttpRequestsChart({ + serviceName: 'synth-android', + offset: '1d', }); - it('returns only current period timeseries when offset is not available', async () => { - const response = await getHttpRequestsChart({ serviceName: 'synth-android' }); + expect(response.status).to.be(200); + expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( + true + ); + expect(response.body.previousPeriod.timeseries[0].y).to.eql(0); + }); + + it('returns only current period timeseries when offset is not available', async () => { + const response = await getHttpRequestsChart({ serviceName: 'synth-android' }); - expect(response.status).to.be(200); - expect( - response.body.currentPeriod.timeseries.some((item) => item.y === 0 && item.x) - ).to.eql(true); + expect(response.status).to.be(200); + expect( + response.body.currentPeriod.timeseries.some((item) => item.y === 0 && item.x) + ).to.eql(true); + + expect(response.body.currentPeriod.timeseries[0].y).to.eql(7); + expect(response.body.previousPeriod.timeseries).to.eql([]); + }); + }); - expect(response.body.currentPeriod.timeseries[0].y).to.eql(7); - expect(response.body.previousPeriod.timeseries).to.eql([]); + describe('when filters are applied', () => { + it('returns empty state for filters', async () => { + const response = await getHttpRequestsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `app.version:"none"`, }); + + expect(response.status).to.be(200); + expect(response.body.currentPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); + expect(response.body.previousPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); }); - describe('when filters are applied', () => { - it('returns empty state for filters', async () => { - const response = await getHttpRequestsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `app.version:"none"`, - }); - - expect(response.status).to.be(200); - expect(response.body.currentPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); - expect(response.body.previousPeriod.timeseries.every((item) => item.y === 0)).to.eql( - true - ); + it('returns the correct values when filter is applied', async () => { + const response = await getHttpRequestsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `network.connection.type:"wifi"`, }); - it('returns the correct values when filter is applied', async () => { - const response = await getHttpRequestsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `network.connection.type:"wifi"`, - }); - - const ntcCell = await getHttpRequestsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `network.connection.type:"cell"`, - }); - - expect(response.status).to.be(200); - expect(ntcCell.status).to.be(200); - expect(response.body.currentPeriod.timeseries[0].y).to.eql(5); - expect(ntcCell.body.currentPeriod.timeseries[0].y).to.eql(2); + const ntcCell = await getHttpRequestsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `network.connection.type:"cell"`, }); + + expect(response.status).to.be(200); + expect(ntcCell.status).to.be(200); + expect(response.body.currentPeriod.timeseries[0].y).to.eql(5); + expect(ntcCell.body.currentPeriod.timeseries[0].y).to.eql(2); }); - } - ); + }); + }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts index 20cc883253f41..7aa1ad4f01462 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; @@ -178,8 +178,9 @@ async function generateData({ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -212,7 +213,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when('Location stats when data is not loaded', () => { + describe('Location stats', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileLocationStats({ serviceName: 'foo' }); @@ -230,111 +231,113 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon ); }); }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177396 - registry.when.skip('Location stats', () => { - before(async () => { - await generateData({ - apmSynthtraceEsClient, - start, - end, - }); - }); - - after(() => apmSynthtraceEsClient.clean()); - - describe('when data is loaded', () => { - let response: MobileLocationStats; + // FLAKY: https://github.com/elastic/kibana/issues/177396 + describe.skip('Location stats with data', () => { before(async () => { - response = await getMobileLocationStats({ - serviceName: 'synth-android', - environment: 'production', + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + + await generateData({ + apmSynthtraceEsClient, + start, + end, }); }); - it('returns location for most sessions', () => { - const { location } = response.currentPeriod.mostSessions; - expect(location).to.be('China'); - }); + after(() => apmSynthtraceEsClient.clean()); - it('returns location for most requests', () => { - const { location } = response.currentPeriod.mostRequests; - expect(location).to.be('China'); - }); + describe('when data is loaded', () => { + let response: MobileLocationStats; - it('returns location for most crashes', () => { - const { location } = response.currentPeriod.mostCrashes; - expect(location).to.be('China'); - }); + before(async () => { + response = await getMobileLocationStats({ + serviceName: 'synth-android', + environment: 'production', + }); + }); - it('returns location for most launches', () => { - const { location } = response.currentPeriod.mostLaunches; - expect(location).to.be('China'); - }); - }); + it('returns location for most sessions', () => { + const { location } = response.currentPeriod.mostSessions; + expect(location).to.be('China'); + }); - describe('when filters are applied', () => { - it('returns empty state for filters with no results', async () => { - const response = await getMobileLocationStats({ - serviceName: 'synth-android', - environment: 'production', - kuery: `app.version:"none"`, + it('returns location for most requests', () => { + const { location } = response.currentPeriod.mostRequests; + expect(location).to.be('China'); }); - expect(response.currentPeriod.mostSessions.value).to.eql(0); - expect(response.currentPeriod.mostRequests.value).to.eql(0); - expect(response.currentPeriod.mostCrashes.value).to.eql(0); - expect(response.currentPeriod.mostLaunches.value).to.eql(0); + it('returns location for most crashes', () => { + const { location } = response.currentPeriod.mostCrashes; + expect(location).to.be('China'); + }); - expect(response.currentPeriod.mostSessions.timeseries.every((item) => item.y === 0)).to.eql( - true - ); - expect(response.currentPeriod.mostRequests.timeseries.every((item) => item.y === 0)).to.eql( - true - ); - expect(response.currentPeriod.mostCrashes.timeseries.every((item) => item.y === 0)).to.eql( - true - ); - expect(response.currentPeriod.mostLaunches.timeseries.every((item) => item.y === 0)).to.eql( - true - ); + it('returns location for most launches', () => { + const { location } = response.currentPeriod.mostLaunches; + expect(location).to.be('China'); + }); }); - it('returns the correct values when single filter is applied', async () => { - const response = await getMobileLocationStats({ - serviceName: 'synth-android', - environment: 'production', - kuery: `service.version:"1.1"`, + describe('when filters are applied', () => { + it('returns empty state for filters with no results', async () => { + const response = await getMobileLocationStats({ + serviceName: 'synth-android', + environment: 'production', + kuery: `app.version:"none"`, + }); + + expect(response.currentPeriod.mostSessions.value).to.eql(0); + expect(response.currentPeriod.mostRequests.value).to.eql(0); + expect(response.currentPeriod.mostCrashes.value).to.eql(0); + expect(response.currentPeriod.mostLaunches.value).to.eql(0); + + expect( + response.currentPeriod.mostSessions.timeseries.every((item) => item.y === 0) + ).to.eql(true); + expect( + response.currentPeriod.mostRequests.timeseries.every((item) => item.y === 0) + ).to.eql(true); + expect( + response.currentPeriod.mostCrashes.timeseries.every((item) => item.y === 0) + ).to.eql(true); + expect( + response.currentPeriod.mostLaunches.timeseries.every((item) => item.y === 0) + ).to.eql(true); }); - expect(response.currentPeriod.mostSessions.timeseries[0].y).to.eql(1); - expect(response.currentPeriod.mostCrashes.timeseries[0].y).to.eql(1); - expect(response.currentPeriod.mostRequests.timeseries[0].y).to.eql(1); - expect(response.currentPeriod.mostLaunches.timeseries[0].y).to.eql(1); + it('returns the correct values when single filter is applied', async () => { + const response = await getMobileLocationStats({ + serviceName: 'synth-android', + environment: 'production', + kuery: `service.version:"1.1"`, + }); - expect(response.currentPeriod.mostSessions.value).to.eql(3); - expect(response.currentPeriod.mostRequests.value).to.eql(3); - expect(response.currentPeriod.mostCrashes.value).to.eql(3); - expect(response.currentPeriod.mostLaunches.value).to.eql(3); - }); + expect(response.currentPeriod.mostSessions.timeseries[0].y).to.eql(1); + expect(response.currentPeriod.mostCrashes.timeseries[0].y).to.eql(1); + expect(response.currentPeriod.mostRequests.timeseries[0].y).to.eql(1); + expect(response.currentPeriod.mostLaunches.timeseries[0].y).to.eql(1); - it('returns the correct values when multiple filters are applied', async () => { - const response = await getMobileLocationStats({ - serviceName: 'synth-android', - kuery: `service.version:"1.1" and service.environment: "production"`, + expect(response.currentPeriod.mostSessions.value).to.eql(3); + expect(response.currentPeriod.mostRequests.value).to.eql(3); + expect(response.currentPeriod.mostCrashes.value).to.eql(3); + expect(response.currentPeriod.mostLaunches.value).to.eql(3); }); - expect(response.currentPeriod.mostSessions.timeseries[0].y).to.eql(1); - expect(response.currentPeriod.mostCrashes.timeseries[0].y).to.eql(1); - expect(response.currentPeriod.mostRequests.timeseries[0].y).to.eql(1); - expect(response.currentPeriod.mostLaunches.timeseries[0].y).to.eql(1); + it('returns the correct values when multiple filters are applied', async () => { + const response = await getMobileLocationStats({ + serviceName: 'synth-android', + kuery: `service.version:"1.1" and service.environment: "production"`, + }); - expect(response.currentPeriod.mostSessions.value).to.eql(3); - expect(response.currentPeriod.mostRequests.value).to.eql(3); - expect(response.currentPeriod.mostCrashes.value).to.eql(3); - expect(response.currentPeriod.mostLaunches.value).to.eql(3); + expect(response.currentPeriod.mostSessions.timeseries[0].y).to.eql(1); + expect(response.currentPeriod.mostCrashes.timeseries[0].y).to.eql(1); + expect(response.currentPeriod.mostRequests.timeseries[0].y).to.eql(1); + expect(response.currentPeriod.mostLaunches.timeseries[0].y).to.eql(1); + + expect(response.currentPeriod.mostSessions.value).to.eql(3); + expect(response.currentPeriod.mostRequests.value).to.eql(3); + expect(response.currentPeriod.mostCrashes.value).to.eql(3); + expect(response.currentPeriod.mostLaunches.value).to.eql(3); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts index a5a78f8c12b32..243f4529d08f0 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts @@ -4,10 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; @@ -128,8 +127,9 @@ async function generateData({ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -162,91 +162,89 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when( - 'Mobile main statistics when data is not loaded', - - () => { - describe('when no data', () => { - it('handles empty state', async () => { - const response = await getMobileMainStatisticsByField({ - serviceName: 'foo', - field: 'service.version', - }); - expect(response.mainStatistics.length).to.be(0); + describe('Mobile main statistics', () => { + describe('when no data', () => { + it('handles empty state', async () => { + const response = await getMobileMainStatisticsByField({ + serviceName: 'foo', + field: 'service.version', }); - }); - } - ); - - // FLAKY: https://github.com/elastic/kibana/issues/177395 - registry.when.skip('Mobile main statistics', () => { - before(async () => { - await generateData({ - apmSynthtraceEsClient, - start, - end, + expect(response.mainStatistics.length).to.be(0); }); }); - after(() => apmSynthtraceEsClient.clean()); + // FLAKY: https://github.com/elastic/kibana/issues/177395 + describe.skip('Mobile main statistics', () => { + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); - describe('when data is loaded', () => { - const huaweiLatency = calculateLatency(HUAWEI_DURATION); - const galaxyLatency = calculateLatency(GALAXY_DURATION); - const huaweiThroughput = calculateThroughput({ start, end }); - const galaxyThroughput = calculateThroughput({ start, end }); - - it('returns the correct data for App version', async () => { - const response = await getMobileMainStatisticsByField({ - serviceName: 'synth-android', - environment: 'production', - field: 'service.version', + await generateData({ + apmSynthtraceEsClient, + start, + end, }); - const fieldValues = response.mainStatistics.map((item) => item.name); + }); + + after(() => apmSynthtraceEsClient.clean()); - expect(fieldValues).to.be.eql(SERVICE_VERSIONS); + describe('when data is loaded', () => { + const huaweiLatency = calculateLatency(HUAWEI_DURATION); + const galaxyLatency = calculateLatency(GALAXY_DURATION); + const huaweiThroughput = calculateThroughput({ start, end }); + const galaxyThroughput = calculateThroughput({ start, end }); - const latencyValues = response.mainStatistics.map((item) => item.latency); + it('returns the correct data for App version', async () => { + const response = await getMobileMainStatisticsByField({ + serviceName: 'synth-android', + environment: 'production', + field: 'service.version', + }); + const fieldValues = response.mainStatistics.map((item) => item.name); - expect(latencyValues).to.be.eql([galaxyLatency, huaweiLatency]); + expect(fieldValues).to.be.eql(SERVICE_VERSIONS); - const throughputValues = response.mainStatistics.map((item) => item.throughput); - expect(throughputValues).to.be.eql([galaxyThroughput, huaweiThroughput]); - }); - it('returns the correct data for Os version', async () => { - const response = await getMobileMainStatisticsByField({ - serviceName: 'synth-android', - environment: 'production', - field: 'host.os.version', + const latencyValues = response.mainStatistics.map((item) => item.latency); + + expect(latencyValues).to.be.eql([galaxyLatency, huaweiLatency]); + + const throughputValues = response.mainStatistics.map((item) => item.throughput); + expect(throughputValues).to.be.eql([galaxyThroughput, huaweiThroughput]); }); + it('returns the correct data for Os version', async () => { + const response = await getMobileMainStatisticsByField({ + serviceName: 'synth-android', + environment: 'production', + field: 'host.os.version', + }); - const fieldValues = response.mainStatistics.map((item) => item.name); + const fieldValues = response.mainStatistics.map((item) => item.name); - expect(fieldValues).to.be.eql(OS_VERSIONS); + expect(fieldValues).to.be.eql(OS_VERSIONS); - const latencyValues = response.mainStatistics.map((item) => item.latency); + const latencyValues = response.mainStatistics.map((item) => item.latency); - expect(latencyValues).to.be.eql([galaxyLatency, huaweiLatency]); + expect(latencyValues).to.be.eql([galaxyLatency, huaweiLatency]); - const throughputValues = response.mainStatistics.map((item) => item.throughput); - expect(throughputValues).to.be.eql([galaxyThroughput, huaweiThroughput]); - }); - it('returns the correct data for Devices', async () => { - const response = await getMobileMainStatisticsByField({ - serviceName: 'synth-android', - environment: 'production', - field: 'device.model.identifier', + const throughputValues = response.mainStatistics.map((item) => item.throughput); + expect(throughputValues).to.be.eql([galaxyThroughput, huaweiThroughput]); }); - const fieldValues = response.mainStatistics.map((item) => item.name); + it('returns the correct data for Devices', async () => { + const response = await getMobileMainStatisticsByField({ + serviceName: 'synth-android', + environment: 'production', + field: 'device.model.identifier', + }); + const fieldValues = response.mainStatistics.map((item) => item.name); - expect(fieldValues).to.be.eql(['HUAWEI P2-0000', 'SM-G973F']); + expect(fieldValues).to.be.eql(['HUAWEI P2-0000', 'SM-G973F']); - const latencyValues = response.mainStatistics.map((item) => item.latency); + const latencyValues = response.mainStatistics.map((item) => item.latency); - expect(latencyValues).to.be.eql([huaweiLatency, galaxyLatency]); + expect(latencyValues).to.be.eql([huaweiLatency, galaxyLatency]); - const throughputValues = response.mainStatistics.map((item) => item.throughput); - expect(throughputValues).to.be.eql([huaweiThroughput, galaxyThroughput]); + const throughputValues = response.mainStatistics.map((item) => item.throughput); + expect(throughputValues).to.be.eql([huaweiThroughput, galaxyThroughput]); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts index 154e546939c05..6b35f7ee4f970 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import expect from '@kbn/expect'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; @@ -16,8 +17,9 @@ type MostUsedCharts = export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -50,55 +52,53 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when( - 'Most used charts when data is not loaded', + describe('Most used charts', () => { + describe('when no data', () => { + it('handles empty state', async () => { + const response: MostUsedCharts = await getMobileMostUsedCharts({ serviceName: 'foo' }); + expect(response.mostUsedCharts.length).to.eql(4); + expect(response.mostUsedCharts.every((chart) => chart.options.length === 0)).to.eql(true); + }); + }); - () => { - describe('when no data', () => { - it('handles empty state', async () => { - const response: MostUsedCharts = await getMobileMostUsedCharts({ serviceName: 'foo' }); - expect(response.mostUsedCharts.length).to.eql(4); - expect(response.mostUsedCharts.every((chart) => chart.options.length === 0)).to.eql(true); + // FLAKY: https://github.com/elastic/kibana/issues/177394 + describe.skip('Mobile stats', () => { + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + + await generateMobileData({ + apmSynthtraceEsClient, + start, + end, }); }); - } - ); - // FLAKY: https://github.com/elastic/kibana/issues/177394 - registry.when.skip('Mobile stats', () => { - before(async () => { - await generateMobileData({ - apmSynthtraceEsClient, - start, - end, - }); - }); + after(() => apmSynthtraceEsClient.clean()); - after(() => apmSynthtraceEsClient.clean()); + describe('when data is loaded', () => { + let response: MostUsedCharts; - describe('when data is loaded', () => { - let response: MostUsedCharts; - - before(async () => { - response = await getMobileMostUsedCharts({ - serviceName: 'synth-android', - environment: 'production', + before(async () => { + response = await getMobileMostUsedCharts({ + serviceName: 'synth-android', + environment: 'production', + }); }); - }); - it('should get the top 5 and the other option only', () => { - const deviceOptions = response.mostUsedCharts.find( - (chart) => chart.key === 'device' - )?.options; - expect(deviceOptions?.length).to.eql(6); - expect(deviceOptions?.find((option) => option.key === 'other')).to.not.be(undefined); - }); + it('should get the top 5 and the other option only', () => { + const deviceOptions = response.mostUsedCharts.find( + (chart) => chart.key === 'device' + )?.options; + expect(deviceOptions?.length).to.eql(6); + expect(deviceOptions?.find((option) => option.key === 'other')).to.not.be(undefined); + }); - it('should get network connection type object from span events', () => { - const nctOptions = response.mostUsedCharts.find( - (chart) => chart.key === 'netConnectionType' - )?.options; - expect(nctOptions?.length).to.eql(2); + it('should get network connection type object from span events', () => { + const nctOptions = response.mostUsedCharts.find( + (chart) => chart.key === 'netConnectionType' + )?.options; + expect(nctOptions?.length).to.eql(2); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts index 60de95479f610..2ff66ae8bcb11 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import expect from '@kbn/expect'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; @@ -12,8 +13,9 @@ import { generateMobileData } from './generate_mobile_data'; export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T02:00:00.000Z').getTime(); @@ -47,7 +49,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); } - registry.when.skip('without data loaded', () => { + describe.skip('Sessions charts', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getSessionsChart({ serviceName: 'foo' }); @@ -56,72 +58,76 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.status).to.be(200); }); }); - }); - // FLAKY: https://github.com/elastic/kibana/issues/177393 - registry.when.skip('with data loaded', () => { - before(async () => { - await generateMobileData({ - apmSynthtraceEsClient, - start, - end, - }); - }); + // FLAKY: https://github.com/elastic/kibana/issues/177393 + describe.skip('with data loaded', () => { + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); - after(() => apmSynthtraceEsClient.clean()); + await generateMobileData({ + apmSynthtraceEsClient, + start, + end, + }); + }); - describe('when data is loaded', () => { - it('returns timeseries for sessions chart', async () => { - const response = await getSessionsChart({ serviceName: 'synth-android', offset: '1d' }); + after(() => apmSynthtraceEsClient.clean()); - expect(response.status).to.be(200); - expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( - true - ); + describe('when data is loaded', () => { + it('returns timeseries for sessions chart', async () => { + const response = await getSessionsChart({ serviceName: 'synth-android', offset: '1d' }); - expect(response.body.currentPeriod.timeseries[0].y).to.eql(6); - expect(response.body.previousPeriod.timeseries[0].y).to.eql(0); - }); + expect(response.status).to.be(200); + expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( + true + ); - it('returns only current period timeseries when offset is not available', async () => { - const response = await getSessionsChart({ serviceName: 'synth-android' }); + expect(response.body.currentPeriod.timeseries[0].y).to.eql(6); + expect(response.body.previousPeriod.timeseries[0].y).to.eql(0); + }); - expect(response.status).to.be(200); - expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( - true - ); + it('returns only current period timeseries when offset is not available', async () => { + const response = await getSessionsChart({ serviceName: 'synth-android' }); - expect(response.body.currentPeriod.timeseries[0].y).to.eql(6); - expect(response.body.previousPeriod.timeseries).to.eql([]); - }); - }); + expect(response.status).to.be(200); + expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( + true + ); - describe('when filters are applied', () => { - it('returns empty state for filters', async () => { - const response = await getSessionsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `app.version:"none"`, + expect(response.body.currentPeriod.timeseries[0].y).to.eql(6); + expect(response.body.previousPeriod.timeseries).to.eql([]); }); - - expect(response.body.currentPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); - expect(response.body.previousPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); }); - it('returns the correct values filter is applied', async () => { - const response = await getSessionsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `transaction.name : "Start View - View Appearing"`, + describe('when filters are applied', () => { + it('returns empty state for filters', async () => { + const response = await getSessionsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `app.version:"none"`, + }); + + expect(response.body.currentPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); + expect(response.body.previousPeriod.timeseries.every((item) => item.y === 0)).to.eql( + true + ); }); - expect(response.status).to.be(200); - expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( - true - ); + it('returns the correct values filter is applied', async () => { + const response = await getSessionsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `transaction.name : "Start View - View Appearing"`, + }); - expect(response.body.currentPeriod.timeseries[0].y).to.eql(6); - expect(response.body.previousPeriod.timeseries).to.eql([]); + expect(response.status).to.be(200); + expect(response.body.currentPeriod.timeseries.some((item) => item.x && item.y)).to.eql( + true + ); + + expect(response.body.currentPeriod.timeseries[0].y).to.eql(6); + expect(response.body.previousPeriod.timeseries).to.eql([]); + }); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts index 3aa208dc4c5c9..be8fd01430745 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import { meanBy, sumBy } from 'lodash'; @@ -136,8 +136,9 @@ async function generateData({ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -170,7 +171,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when('Mobile stats when data is not loaded', () => { + describe('Mobile stats', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileStats({ serviceName: 'foo' }); @@ -182,109 +183,111 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon ); }); }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177392 - registry.when.skip('Mobile stats', () => { - before(async () => { - await generateData({ - apmSynthtraceEsClient, - start, - end, - }); - }); - - after(() => apmSynthtraceEsClient.clean()); - - describe('when data is loaded', () => { - let response: MobileStats; + // FLAKY: https://github.com/elastic/kibana/issues/177392 + describe.skip('Mobile stats', () => { before(async () => { - response = await getMobileStats({ - serviceName: 'synth-android', - environment: 'production', + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + + await generateData({ + apmSynthtraceEsClient, + start, + end, }); }); - it('returns same sessions', () => { - const { value, timeseries } = response.currentPeriod.sessions; - const timeseriesTotal = sumBy(timeseries, 'y'); - expect(value).to.be(timeseriesTotal); - }); + after(() => apmSynthtraceEsClient.clean()); - it('returns same requests', () => { - const { value, timeseries } = response.currentPeriod.requests; - const timeseriesTotal = sumBy(timeseries, 'y'); - expect(value).to.be(timeseriesTotal); - }); + describe('when data is loaded', () => { + let response: MobileStats; - it('returns same crashes', () => { - const { value, timeseries } = response.currentPeriod.crashRate; - const timeseriesMean = meanBy( - timeseries.filter((bucket) => bucket.y !== 0), - 'y' - ); - expect(value).to.be(timeseriesMean); - }); - it('returns same launch times', () => { - const { value, timeseries } = response.currentPeriod.launchTimes; - const timeseriesMean = meanBy( - timeseries.filter((bucket) => bucket.y !== null), - 'y' - ); - expect(value).to.be(timeseriesMean); - }); - }); + before(async () => { + response = await getMobileStats({ + serviceName: 'synth-android', + environment: 'production', + }); + }); - describe('when filters are applied', () => { - it('returns empty state for filters', async () => { - const response = await getMobileStats({ - serviceName: 'synth-android', - environment: 'production', - kuery: `app.version:"none"`, + it('returns same sessions', () => { + const { value, timeseries } = response.currentPeriod.sessions; + const timeseriesTotal = sumBy(timeseries, 'y'); + expect(value).to.be(timeseriesTotal); }); - expect(response.currentPeriod.sessions.value).to.eql(0); - expect(response.currentPeriod.requests.value).to.eql(0); - expect(response.currentPeriod.crashRate.value).to.eql(0); - expect(response.currentPeriod.launchTimes.value).to.eql(null); + it('returns same requests', () => { + const { value, timeseries } = response.currentPeriod.requests; + const timeseriesTotal = sumBy(timeseries, 'y'); + expect(value).to.be(timeseriesTotal); + }); - expect(response.currentPeriod.sessions.timeseries.every((item) => item.y === 0)).to.eql( - true - ); - expect(response.currentPeriod.requests.timeseries.every((item) => item.y === 0)).to.eql( - true - ); - expect(response.currentPeriod.crashRate.timeseries.every((item) => item.y === 0)).to.eql( - true - ); - expect( - response.currentPeriod.launchTimes.timeseries.every((item) => item.y === null) - ).to.eql(true); + it('returns same crashes', () => { + const { value, timeseries } = response.currentPeriod.crashRate; + const timeseriesMean = meanBy( + timeseries.filter((bucket) => bucket.y !== 0), + 'y' + ); + expect(value).to.be(timeseriesMean); + }); + it('returns same launch times', () => { + const { value, timeseries } = response.currentPeriod.launchTimes; + const timeseriesMean = meanBy( + timeseries.filter((bucket) => bucket.y !== null), + 'y' + ); + expect(value).to.be(timeseriesMean); + }); }); - it('returns the correct values when single filter is applied', async () => { - const response = await getMobileStats({ - serviceName: 'synth-android', - environment: 'production', - kuery: `service.version:"2.3"`, + describe('when filters are applied', () => { + it('returns empty state for filters', async () => { + const response = await getMobileStats({ + serviceName: 'synth-android', + environment: 'production', + kuery: `app.version:"none"`, + }); + + expect(response.currentPeriod.sessions.value).to.eql(0); + expect(response.currentPeriod.requests.value).to.eql(0); + expect(response.currentPeriod.crashRate.value).to.eql(0); + expect(response.currentPeriod.launchTimes.value).to.eql(null); + + expect(response.currentPeriod.sessions.timeseries.every((item) => item.y === 0)).to.eql( + true + ); + expect(response.currentPeriod.requests.timeseries.every((item) => item.y === 0)).to.eql( + true + ); + expect(response.currentPeriod.crashRate.timeseries.every((item) => item.y === 0)).to.eql( + true + ); + expect( + response.currentPeriod.launchTimes.timeseries.every((item) => item.y === null) + ).to.eql(true); }); - expect(response.currentPeriod.sessions.value).to.eql(3); - expect(response.currentPeriod.requests.value).to.eql(0); - expect(response.currentPeriod.crashRate.value).to.eql(3); - expect(response.currentPeriod.launchTimes.value).to.eql(null); - }); + it('returns the correct values when single filter is applied', async () => { + const response = await getMobileStats({ + serviceName: 'synth-android', + environment: 'production', + kuery: `service.version:"2.3"`, + }); + + expect(response.currentPeriod.sessions.value).to.eql(3); + expect(response.currentPeriod.requests.value).to.eql(0); + expect(response.currentPeriod.crashRate.value).to.eql(3); + expect(response.currentPeriod.launchTimes.value).to.eql(null); + }); - it('returns the correct values when multiple filters are applied', async () => { - const response = await getMobileStats({ - serviceName: 'synth-android', - kuery: `service.version:"1.2" and service.environment: "production"`, + it('returns the correct values when multiple filters are applied', async () => { + const response = await getMobileStats({ + serviceName: 'synth-android', + kuery: `service.version:"1.2" and service.environment: "production"`, + }); + expect(response.currentPeriod.sessions.value).to.eql(3); + expect(response.currentPeriod.requests.value).to.eql(3); + expect(response.currentPeriod.crashRate.value).to.eql(1); + expect(response.currentPeriod.launchTimes.value).to.eql(100); }); - expect(response.currentPeriod.sessions.value).to.eql(3); - expect(response.currentPeriod.requests.value).to.eql(3); - expect(response.currentPeriod.crashRate.value).to.eql(1); - expect(response.currentPeriod.launchTimes.value).to.eql(100); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts index c8dc0a583c5a3..038682832ffac 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; @@ -126,8 +126,9 @@ async function generateData({ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { const apmApiClient = getService('apmApi'); - const registry = getService('registry'); + const synthtrace = getService('synthtrace'); + let apmSynthtraceEsClient: ApmSynthtraceEsClient; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); const end = new Date('2023-01-01T00:15:00.000Z').getTime() - 1; @@ -163,7 +164,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - registry.when('Mobile terms when data is not loaded', () => { + describe('Mobile terms', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileTermsByField({ @@ -183,66 +184,68 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.terms).to.eql([]); }); }); - }); - // FLAKY: https://github.com/elastic/kibana/issues/177498 - registry.when.skip('Mobile terms', () => { - before(async () => { - await generateData({ - apmSynthtraceEsClient, - start, - end, + // FLAKY: https://github.com/elastic/kibana/issues/177498 + describe.skip('Mobile terms', () => { + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + + await generateData({ + apmSynthtraceEsClient, + start, + end, + }); }); - }); - after(() => apmSynthtraceEsClient.clean()); + after(() => apmSynthtraceEsClient.clean()); - describe('when data is loaded', () => { - it('returns mobile devices', async () => { - const response = await getMobileTermsByField({ - serviceName: 'synth-android', - environment: 'production', - fieldName: 'device.model.identifier', - size: 10, + describe('when data is loaded', () => { + it('returns mobile devices', async () => { + const response = await getMobileTermsByField({ + serviceName: 'synth-android', + environment: 'production', + fieldName: 'device.model.identifier', + size: 10, + }); + expect(response.terms).to.eql([ + { label: 'HUAWEI P2-0000', count: 3 }, + { label: 'SM-G973F', count: 3 }, + ]); }); - expect(response.terms).to.eql([ - { label: 'HUAWEI P2-0000', count: 3 }, - { label: 'SM-G973F', count: 3 }, - ]); - }); - it('returns mobile versions', async () => { - const response = await getMobileTermsByField({ - serviceName: 'synth-android', - environment: 'production', - fieldName: 'service.version', - size: 10, + it('returns mobile versions', async () => { + const response = await getMobileTermsByField({ + serviceName: 'synth-android', + environment: 'production', + fieldName: 'service.version', + size: 10, + }); + expect(response.terms).to.eql([ + { + label: '1.2', + count: 3, + }, + { + label: '2.3', + count: 3, + }, + ]); }); - expect(response.terms).to.eql([ - { - label: '1.2', - count: 3, - }, - { - label: '2.3', - count: 3, - }, - ]); - }); - it('return the most used mobile version', async () => { - const response = await getMobileTermsByField({ - serviceName: 'synth-android', - environment: 'production', - fieldName: 'service.version', - size: 1, + it('return the most used mobile version', async () => { + const response = await getMobileTermsByField({ + serviceName: 'synth-android', + environment: 'production', + fieldName: 'service.version', + size: 1, + }); + expect(response.terms).to.eql([ + { + label: '1.2', + count: 3, + }, + ]); }); - expect(response.terms).to.eql([ - { - label: '1.2', - count: 3, - }, - ]); }); }); }); From a1db7f1961c0d6e68fa66068fa03e5af08264cfe Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Wed, 6 Nov 2024 21:01:58 +0200 Subject: [PATCH 09/17] fix --- .../apm/agent_explorer/latest_agent_versions.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts index 08129d92641f1..acc31a3743da8 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/agent_explorer/latest_agent_versions.spec.ts @@ -21,6 +21,8 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon describe('Agent latest versions when configuration is defined', () => { it('returns a version when agent is listed in the file', async () => { + const { status, body } = await callApi(); + expect(status).to.be(200); const agents = body.data; const nodeAgent = agents[nodeAgentName] as ElasticApmAgentLatestVersion; expect(nodeAgent?.latest_version).not.to.be(undefined); From 1d64be840ef5320b35272072785e087454ef4166 Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Wed, 6 Nov 2024 21:04:18 +0200 Subject: [PATCH 10/17] Remove registry service --- .../configs/serverless/oblt.serverless.config.ts | 1 - .../configs/stateful/oblt.stateful.config.ts | 1 - .../default_configs/serverless.config.base.ts | 2 -- .../deployment_agnostic/default_configs/stateful.config.base.ts | 2 -- 4 files changed, 6 deletions(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts index e1864f0444ab0..245663416243f 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/serverless/oblt.serverless.config.ts @@ -10,7 +10,6 @@ import { createServerlessTestConfig } from '../../default_configs/serverless.con export default createServerlessTestConfig({ serverlessProject: 'oblt', testFiles: [require.resolve('./oblt.index.ts')], - servicesRequiredForTestAnalysis: ['registry'], junit: { reportName: 'Serverless Observability - Deployment-agnostic API Integration Tests', }, diff --git a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts index 2c2e33a126b54..7b3cf3a7f1818 100644 --- a/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts +++ b/x-pack/test/api_integration/deployment_agnostic/configs/stateful/oblt.stateful.config.ts @@ -9,7 +9,6 @@ import { createStatefulTestConfig } from '../../default_configs/stateful.config. export default createStatefulTestConfig({ testFiles: [require.resolve('./oblt.index.ts')], - servicesRequiredForTestAnalysis: ['registry'], junit: { reportName: 'Stateful Observability - Deployment-agnostic API Integration Tests', }, diff --git a/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts b/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts index 353021aa343a3..e7df37f5aa312 100644 --- a/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts +++ b/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts @@ -16,7 +16,6 @@ interface CreateTestConfigOptions { esServerArgs?: string[]; kbnServerArgs?: string[]; services?: T; - servicesRequiredForTestAnalysis?: string[]; testFiles: string[]; junit: { reportName: string }; suiteTags?: { include?: string[]; exclude?: string[] }; @@ -86,7 +85,6 @@ export function createServerlessTestConfig { kbnServerArgs?: string[]; services?: T; testFiles: string[]; - servicesRequiredForTestAnalysis?: string[]; junit: { reportName: string }; suiteTags?: { include?: string[]; exclude?: string[] }; } @@ -101,7 +100,6 @@ export function createStatefulTestConfig Date: Wed, 6 Nov 2024 21:05:37 +0200 Subject: [PATCH 11/17] remove service once and for all --- .../deployment_agnostic/services/registry.ts | 97 ------------------- 1 file changed, 97 deletions(-) delete mode 100644 x-pack/test/api_integration/deployment_agnostic/services/registry.ts diff --git a/x-pack/test/api_integration/deployment_agnostic/services/registry.ts b/x-pack/test/api_integration/deployment_agnostic/services/registry.ts deleted file mode 100644 index b1e03a92094ed..0000000000000 --- a/x-pack/test/api_integration/deployment_agnostic/services/registry.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { groupBy } from 'lodash'; -import callsites from 'callsites'; -import { joinByKey } from '@kbn/observability-utils/array/join_by_key'; -import { maybe } from '@kbn/apm-plugin/common/utils/maybe'; - -export function RegistryProvider() { - const callbacks: Array<{ - runs: Array<{ - cb: () => void; - }>; - }> = []; - - let running: boolean = false; - - function when(title: string, callback: () => void, skip?: boolean) { - if (running) { - throw new Error("Can't add tests when running"); - } - - const frame = maybe(callsites()[1]); - - const file = frame?.getFileName(); - - if (!file) { - throw new Error('Could not infer file for suite'); - } - - callbacks.push({ - runs: [ - { - cb: () => { - const suite: ReturnType = (skip ? describe.skip : describe)( - title, - () => { - callback(); - } - ) as any; - - suite.file = file; - suite.eachTest((test) => { - test.file = file; - }); - }, - }, - ], - }); - } - - when.skip = (title: string, callback: () => void) => { - when(title, callback, true); - }; - - const registry = { - when, - run: () => { - running = true; - - const groups = joinByKey(callbacks, [], (a, b) => ({ - ...a, - ...b, - runs: a.runs.concat(b.runs), - })); - - callbacks.length = 0; - - const byConfig = groupBy(groups, 'config'); - - Object.keys(byConfig).forEach((config) => { - const groupsForConfig = byConfig[config]; - // register suites for other configs, but skip them so tests are marked as such - // and their snapshots are not marked as obsolete - describe(config, () => { - groupsForConfig.forEach((group) => { - const { runs } = group; - - describe(config, () => { - runs.forEach((run) => { - run.cb(); - }); - }); - }); - }); - }); - - running = false; - }, - }; - - return registry; -} From 14105cbb81da4df1ea3dd4b46416c748ca97be0f Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Fri, 8 Nov 2024 13:42:41 +0200 Subject: [PATCH 12/17] Unskip mobile tests --- .../mobile/crashes/crash_group_list.spec.ts | 2 +- .../apm/mobile/crashes/distribution.spec.ts | 11 ++-- .../mobile/errors/group_id_samples.spec.ts | 46 +++++++------- .../apis/observability/apm/mobile/index.ts | 2 +- ...obile_detailed_statistics_by_field.spec.ts | 13 ++-- .../apm/mobile/mobile_filters.spec.ts | 2 +- .../mobile_http_requests_timeseries.spec.ts | 60 ++++++++++--------- .../apm/mobile/mobile_location_stats.spec.ts | 2 +- .../apm/mobile/mobile_most_used_chart.spec.ts | 2 +- .../mobile/mobile_sessions_timeseries.spec.ts | 4 +- .../apm/mobile/mobile_stats.spec.ts | 2 +- .../apm/mobile/mobile_terms_by_field.spec.ts | 2 +- 12 files changed, 75 insertions(+), 73 deletions(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts index 3e46b0c725c86..2d17588789a1c 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts @@ -53,7 +53,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177651 - describe.skip('when data is loaded', () => { + describe('when data is loaded', () => { describe('errors group', () => { let apmSynthtraceEsClient: ApmSynthtraceEsClient; diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts index 05907597d011a..9d1946935f559 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts @@ -53,6 +53,12 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon } describe('Distribution', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + }); + it('handles the empty state', async () => { const response = await callApi(); expect(response.status).to.be(200); @@ -61,13 +67,10 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177652 - describe.skip('when data is loaded', () => { + describe('when data is loaded', () => { describe('errors distribution', () => { - let apmSynthtraceEsClient: ApmSynthtraceEsClient; - const { appleTransaction, bananaTransaction } = config; before(async () => { - apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); await generateData({ serviceName, start, end, apmSynthtraceEsClient }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts index 0c659349ad570..ec0cec78cabe0 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts @@ -10,7 +10,6 @@ import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; import { orderBy } from 'lodash'; import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { getErrorGroupingKey } from '@kbn/apm-synthtrace-client/src/lib/apm/instance'; import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; import { config, generateData } from './generate_data'; @@ -68,6 +67,11 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon } describe('Group id samples', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + }); + it('handles the empty state', async () => { const response = await callErrorGroupSamplesApi({ groupId: 'foo' }); expect(response.status).to.be(200); @@ -75,39 +79,31 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177654 - describe.skip('when samples data is loaded', () => { + describe('when samples data is loaded', () => { + let errorsSamplesResponse: ErrorGroupSamples; const { bananaTransaction } = config; describe('error group id', () => { - let apmSynthtraceEsClient: ApmSynthtraceEsClient; - before(async () => { - apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); await generateData({ serviceName, start, end, apmSynthtraceEsClient }); + const response = await callErrorGroupSamplesApi({ + groupId: '0000000000000000000000000Error 1', + }); + errorsSamplesResponse = response.body; }); after(() => apmSynthtraceEsClient.clean()); - describe('return correct data', () => { - let errorsSamplesResponse: ErrorGroupSamples; - before(async () => { - const response = await callErrorGroupSamplesApi({ - groupId: '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03', - }); - errorsSamplesResponse = response.body; - }); - - it('displays correct number of occurrences', () => { - const numberOfBuckets = 15; - expect(errorsSamplesResponse.occurrencesCount).to.equal( - bananaTransaction.failureRate * numberOfBuckets - ); - }); + it('displays correct number of occurrences', () => { + const numberOfBuckets = 15; + expect(errorsSamplesResponse.occurrencesCount).to.equal( + bananaTransaction.failureRate * numberOfBuckets + ); }); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177665 - describe.skip('when error sample data is loaded', () => { + // github.com/elastic/kibana/issues/177665 + describe('when error sample data is loaded', () => { describe('error sample id', () => { before(async () => { await generateData({ serviceName, start, end, apmSynthtraceEsClient }); @@ -119,7 +115,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon let errorSampleDetailsResponse: ErrorSampleDetails; before(async () => { const errorsSamplesResponse = await callErrorGroupSamplesApi({ - groupId: '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03', + groupId: '0000000000000000000000000Error 1', }); const errorId = errorsSamplesResponse.body.errorSampleIds[0]; @@ -130,7 +126,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon it('displays correct error grouping_key', () => { expect(errorSampleDetailsResponse.error.error.grouping_key).to.equal( - '98b75903135eac35ad42419bd3b45cf8b4270c61cbd0ede0f7e8c8a9ac9fdb03' + '0000000000000000000000000Error 1' ); }); @@ -148,7 +144,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon before(async () => { const instance = service(serviceName, 'production', 'go').instance('a'); const errorMessage = 'Error 1'; - const groupId = getErrorGroupingKey(errorMessage); + const groupId = '0000000000000000000000000Error 1'; await apmSynthtraceEsClient.index([ timerange(start, end) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts index e2a12408e22d1..97d8e13256d60 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/index.ts @@ -8,7 +8,7 @@ import { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { - describe('agent_explorer', () => { + describe('Mobile', () => { loadTestFile(require.resolve('./crashes/crash_group_list.spec.ts')); loadTestFile(require.resolve('./crashes/distribution.spec.ts')); loadTestFile(require.resolve('./errors/group_id_samples.spec.ts')); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts index fffb267ff3490..0c2d874b1ec17 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts @@ -59,6 +59,12 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon } describe('Mobile detailed statistics ', () => { + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + }); + + after(() => apmSynthtraceEsClient.clean()); + describe('when data is not loaded', () => { it('handles empty state', async () => { const response = await getMobileDetailedStatisticsByField({ @@ -70,11 +76,8 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177388 - - describe.skip('when data is loaded', () => { + describe('when data is loaded', () => { before(async () => { - apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); - await generateMobileData({ apmSynthtraceEsClient, start, @@ -82,8 +85,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - after(() => apmSynthtraceEsClient.clean()); - describe('when comparison is disable', () => { it('returns current period data only', async () => { const response = await getMobileDetailedStatisticsByField({ diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts index da988052cb293..ab5d8656c0e5c 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts @@ -168,7 +168,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon } // FLAKY: https://github.com/elastic/kibana/issues/177389 - describe.skip('Mobile filters', () => { + describe('Mobile filters', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getMobileFilters({ serviceName: 'foo' }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts index d792bbb09c7c9..ba9970914af23 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts @@ -59,7 +59,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); // FLAKY: https://github.com/elastic/kibana/issues/177390 - describe.skip('when data is loaded', () => { + describe('when data is loaded', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); @@ -95,38 +95,40 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.body.currentPeriod.timeseries[0].y).to.eql(7); expect(response.body.previousPeriod.timeseries).to.eql([]); }); - }); - describe('when filters are applied', () => { - it('returns empty state for filters', async () => { - const response = await getHttpRequestsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `app.version:"none"`, + describe('when filters are applied', () => { + it('returns empty state for filters', async () => { + const response = await getHttpRequestsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `app.version:"none"`, + }); + + expect(response.status).to.be(200); + expect(response.body.currentPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); + expect(response.body.previousPeriod.timeseries.every((item) => item.y === 0)).to.eql( + true + ); }); - expect(response.status).to.be(200); - expect(response.body.currentPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); - expect(response.body.previousPeriod.timeseries.every((item) => item.y === 0)).to.eql(true); - }); - - it('returns the correct values when filter is applied', async () => { - const response = await getHttpRequestsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `network.connection.type:"wifi"`, - }); - - const ntcCell = await getHttpRequestsChart({ - serviceName: 'synth-android', - environment: 'production', - kuery: `network.connection.type:"cell"`, + it('returns the correct values when filter is applied', async () => { + const response = await getHttpRequestsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `network.connection.type:"wifi"`, + }); + + const ntcCell = await getHttpRequestsChart({ + serviceName: 'synth-android', + environment: 'production', + kuery: `network.connection.type:"cell"`, + }); + + expect(response.status).to.be(200); + expect(ntcCell.status).to.be(200); + expect(response.body.currentPeriod.timeseries[0].y).to.eql(5); + expect(ntcCell.body.currentPeriod.timeseries[0].y).to.eql(2); }); - - expect(response.status).to.be(200); - expect(ntcCell.status).to.be(200); - expect(response.body.currentPeriod.timeseries[0].y).to.eql(5); - expect(ntcCell.body.currentPeriod.timeseries[0].y).to.eql(2); }); }); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts index 7aa1ad4f01462..29e4aa4017c08 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts @@ -233,7 +233,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177396 - describe.skip('Location stats with data', () => { + describe('Location stats with data', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts index 6b35f7ee4f970..a307107ec5ccc 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts @@ -62,7 +62,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177394 - describe.skip('Mobile stats', () => { + describe('Mobile stats', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts index 2ff66ae8bcb11..358a92811d435 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts @@ -49,7 +49,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); } - describe.skip('Sessions charts', () => { + describe('Sessions charts', () => { describe('when no data', () => { it('handles empty state', async () => { const response = await getSessionsChart({ serviceName: 'foo' }); @@ -60,7 +60,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177393 - describe.skip('with data loaded', () => { + describe('with data loaded', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts index be8fd01430745..2ef0db28bc176 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts @@ -185,7 +185,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177392 - describe.skip('Mobile stats', () => { + describe('Mobile stats', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts index 038682832ffac..5fa5feabf2244 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts @@ -186,7 +186,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177498 - describe.skip('Mobile terms', () => { + describe('Mobile terms', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); From c9bccbf4d44b033c7ac2d95729b660fe5337f04c Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Fri, 8 Nov 2024 13:43:10 +0200 Subject: [PATCH 13/17] Fix synthrace dropped document due to wrong type --- packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts | 2 +- packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts index 31c301591ae4e..2f39d0cc8dbf1 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts @@ -70,7 +70,7 @@ export class Instance extends Entity { ...this.fields, 'error.type': 'crash', 'error.exception': [{ message, ...(type ? { type } : {}) }], - 'error.grouping_name': getErrorGroupingKey(message), + // 'error.grouping_name': getErrorGroupingKey(message), }); } error({ diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts index b4dfafe22fc44..c0947f75531a3 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts @@ -262,7 +262,6 @@ export class MobileDevice extends Entity { 'error.type': 'crash', 'error.id': generateLongIdWithSeed(message), 'error.exception': [{ message, ...{ type: 'crash' } }], - 'error.grouping_name': groupingName || message, }); } } From 0f511a1845a88adc4ecae0878deb8974abf58267 Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Fri, 8 Nov 2024 13:44:10 +0200 Subject: [PATCH 14/17] Unskip tests --- .../apm/mobile/mobile_main_statistics_by_field.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts index 243f4529d08f0..2ce84d7a85b71 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts @@ -174,7 +174,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); // FLAKY: https://github.com/elastic/kibana/issues/177395 - describe.skip('Mobile main statistics', () => { + describe('Mobile main statistics', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); From 995aaa9401ca84e1b12f7b821b6672a03ef15f8a Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Fri, 8 Nov 2024 14:01:34 +0200 Subject: [PATCH 15/17] Can't pass grouping_name --- packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts index 2f39d0cc8dbf1..d3e393b68639e 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts @@ -70,7 +70,6 @@ export class Instance extends Entity { ...this.fields, 'error.type': 'crash', 'error.exception': [{ message, ...(type ? { type } : {}) }], - // 'error.grouping_name': getErrorGroupingKey(message), }); } error({ From 06403c2ea99ef85e5ba2a4c4c643694a174349b7 Mon Sep 17 00:00:00 2001 From: Kate Patticha Date: Fri, 8 Nov 2024 17:12:22 +0200 Subject: [PATCH 16/17] Clean up code --- .../observability/apm/mobile/crashes/crash_group_list.spec.ts | 1 - .../apis/observability/apm/mobile/crashes/distribution.spec.ts | 1 - .../observability/apm/mobile/errors/group_id_samples.spec.ts | 1 - .../apm/mobile/mobile_detailed_statistics_by_field.spec.ts | 1 - .../apis/observability/apm/mobile/mobile_filters.spec.ts | 1 - .../apm/mobile/mobile_http_requests_timeseries.spec.ts | 2 +- .../apis/observability/apm/mobile/mobile_location_stats.spec.ts | 1 - .../apm/mobile/mobile_main_statistics_by_field.spec.ts | 1 - .../observability/apm/mobile/mobile_most_used_chart.spec.ts | 1 - .../observability/apm/mobile/mobile_sessions_timeseries.spec.ts | 1 - .../apis/observability/apm/mobile/mobile_stats.spec.ts | 1 - .../apis/observability/apm/mobile/mobile_terms_by_field.spec.ts | 1 - 12 files changed, 1 insertion(+), 12 deletions(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts index 2d17588789a1c..1a053055617af 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/crash_group_list.spec.ts @@ -52,7 +52,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.body.errorGroups).to.empty(); }); - // FLAKY: https://github.com/elastic/kibana/issues/177651 describe('when data is loaded', () => { describe('errors group', () => { let apmSynthtraceEsClient: ApmSynthtraceEsClient; diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts index 9d1946935f559..b726f9df3349c 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/crashes/distribution.spec.ts @@ -66,7 +66,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.body.previousPeriod.length).to.be(0); }); - // FLAKY: https://github.com/elastic/kibana/issues/177652 describe('when data is loaded', () => { describe('errors distribution', () => { const { appleTransaction, bananaTransaction } = config; diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts index ec0cec78cabe0..6e5a19327c24f 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/errors/group_id_samples.spec.ts @@ -78,7 +78,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.body.occurrencesCount).to.be(0); }); - // FLAKY: https://github.com/elastic/kibana/issues/177654 describe('when samples data is loaded', () => { let errorsSamplesResponse: ErrorGroupSamples; const { bananaTransaction } = config; diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts index 0c2d874b1ec17..134577dff9204 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_detailed_statistics_by_field.spec.ts @@ -75,7 +75,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177388 describe('when data is loaded', () => { before(async () => { await generateMobileData({ diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts index ab5d8656c0e5c..5c8d8499d3295 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_filters.spec.ts @@ -167,7 +167,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon .then(({ body }) => body); } - // FLAKY: https://github.com/elastic/kibana/issues/177389 describe('Mobile filters', () => { describe('when no data', () => { it('handles empty state', async () => { diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts index ba9970914af23..6a5a92a29b331 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_http_requests_timeseries.spec.ts @@ -58,7 +58,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon expect(response.status).to.be(200); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177390 + describe('when data is loaded', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts index 29e4aa4017c08..20098e9a671ef 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_location_stats.spec.ts @@ -232,7 +232,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177396 describe('Location stats with data', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts index 2ce84d7a85b71..0e49624be2a9a 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_main_statistics_by_field.spec.ts @@ -173,7 +173,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177395 describe('Mobile main statistics', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts index a307107ec5ccc..205b5125d944b 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_most_used_chart.spec.ts @@ -61,7 +61,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177394 describe('Mobile stats', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts index 358a92811d435..c43284767b7b4 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_sessions_timeseries.spec.ts @@ -59,7 +59,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177393 describe('with data loaded', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts index 2ef0db28bc176..22281cd392951 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_stats.spec.ts @@ -184,7 +184,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177392 describe('Mobile stats', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts index 5fa5feabf2244..8dd4142109375 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/mobile/mobile_terms_by_field.spec.ts @@ -185,7 +185,6 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177498 describe('Mobile terms', () => { before(async () => { apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); From 59fd80c5a59549febc4bd35a43a100d7edd6111e Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:04:32 +0000 Subject: [PATCH 17/17] [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' --- .../deployment_agnostic/apis/observability/apm/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts index 96b1f07670eb5..93ef6ed2764fe 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts @@ -15,6 +15,5 @@ export default function apmApiIntegrationTests({ loadTestFile(require.resolve('./mobile')); loadTestFile(require.resolve('./custom_dashboards')); loadTestFile(require.resolve('./dependencies')); - }); }