From 369a022ceb807747629640bbb29514fd8282f666 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 9 Nov 2023 15:11:31 +0100 Subject: [PATCH 01/51] [Synthetics] Add space id to documents (#170871) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../check_registered_types.test.ts | 2 +- .../fleet/server/saved_objects/index.ts | 10 ++ .../migrations/synthetics/to_v8_12_0.test.ts | 146 ++++++++++++++++++ .../migrations/synthetics/to_v8_12_0.ts | 54 +++++++ .../monitor_management/monitor_types.ts | 28 ++-- .../format_synthetics_policy.ts | 3 +- .../processors_formatter.ts | 42 ++--- .../public_formatters/format_configs.test.ts | 28 ++++ .../public_formatters/format_configs.ts | 6 +- .../synthetics_private_location.ts | 1 + .../synthetics_monitor_client.test.ts | 1 + .../synthetics_monitor_client.ts | 13 +- .../synthetics_service/synthetics_service.ts | 1 + .../add_monitor_private_location.ts | 1 + .../apis/synthetics/inspect_monitor.ts | 6 +- .../synthetics/sample_data/test_policy.ts | 7 + .../test_project_monitor_policy.ts | 2 + .../services/private_location_test_service.ts | 2 +- 18 files changed, 307 insertions(+), 46 deletions(-) create mode 100644 x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.test.ts create mode 100644 x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.ts diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 66fbd33d1568a..dd736740a9377 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -107,7 +107,7 @@ describe('checking migration metadata changes on all registered SO types', () => "ingest-agent-policies": "7633e578f60c074f8267bc50ec4763845e431437", "ingest-download-sources": "279a68147e62e4d8858c09ad1cf03bd5551ce58d", "ingest-outputs": "8546f1123ec30dcbd6f238f72729c5f1656a4d9b", - "ingest-package-policies": "a0c9fb48e04dcd638e593db55f1c6451523f90ea", + "ingest-package-policies": "f4c2767e852b700a8b82678925b86bac08958b43", "ingest_manager_settings": "64955ef1b7a9ffa894d4bb9cf863b5602bfa6885", "inventory-view": "b8683c8e352a286b4aca1ab21003115a4800af83", "kql-telemetry": "93c1d16c1a0dfca9c8842062cf5ef8f62ae401ad", diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index 7c68ab9105e49..b87310e850c81 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -25,6 +25,8 @@ import { UNINSTALL_TOKENS_SAVED_OBJECT_TYPE, } from '../constants'; +import { migrateSyntheticsPackagePolicyToV8120 } from './migrations/synthetics/to_v8_12_0'; + import { migratePackagePolicyEvictionsFromV8110, migratePackagePolicyToV8110, @@ -394,6 +396,14 @@ const getSavedObjectTypes = (): { [key: string]: SavedObjectsType } => ({ }, ], }, + '5': { + changes: [ + { + type: 'data_backfill', + backfillFn: migrateSyntheticsPackagePolicyToV8120, + }, + ], + }, }, migrations: { '7.10.0': migratePackagePolicyToV7100, diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.test.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.test.ts new file mode 100644 index 0000000000000..755897c50ef96 --- /dev/null +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.test.ts @@ -0,0 +1,146 @@ +/* + * 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 type { SavedObjectModelTransformationContext } from '@kbn/core-saved-objects-server'; + +import type { PackagePolicy } from '../../../../common'; + +import { getBrowserPolicy } from './fixtures/8.7.0'; + +import { migrateSyntheticsPackagePolicyToV8120 as migration } from './to_v8_12_0'; +import { migrateSyntheticsPackagePolicyToV8100 as migration10 } from './to_v8_10_0'; + +describe('8.12.0 Synthetics Package Policy migration', () => { + describe('processors migration', () => { + it('handles processors field for empty values', () => { + const doc = getBrowserPolicy('false'); + const actual10 = migration10(doc, {} as SavedObjectModelTransformationContext); + doc.attributes = actual10.attributes as PackagePolicy; + + const actual = migration( + { ...doc, namespace: 'default' }, + {} as SavedObjectModelTransformationContext + ); + expect(actual.attributes?.inputs?.[3]?.streams[0]?.vars?.processors?.value).toEqual( + JSON.stringify([ + { + add_fields: { + fields: { + 'monitor.fleet_managed': true, + config_id: '420754e9-40f2-486c-bc2e-265bafd735c5', + meta: { space_id: 'default' }, + }, + target: '', + }, + }, + ]) + ); + expect(actual.attributes?.inputs?.[3]?.streams[0]?.compiled_stream?.processors).toEqual( + JSON.stringify([ + { + add_fields: { + fields: { + 'monitor.fleet_managed': true, + config_id: '420754e9-40f2-486c-bc2e-265bafd735c5', + meta: { space_id: 'default' }, + }, + target: '', + }, + }, + ]) + ); + }); + + it('handles processors field for project monitor', () => { + const doc = getBrowserPolicy('', 'test-project'); + const actual10 = migration10(doc, {} as SavedObjectModelTransformationContext); + doc.attributes = actual10.attributes as PackagePolicy; + const actual = migration( + { ...doc, namespace: 'default' }, + {} as SavedObjectModelTransformationContext + ); + expect(actual.attributes?.inputs?.[3]?.streams[0]?.vars?.processors?.value).toEqual( + JSON.stringify([ + { + add_fields: { + fields: { + 'monitor.fleet_managed': true, + config_id: '420754e9-40f2-486c-bc2e-265bafd735c5', + 'monitor.project.name': 'test-project', + 'monitor.project.id': 'test-project', + meta: { space_id: 'default' }, + }, + target: '', + }, + }, + ]) + ); + expect(actual.attributes?.inputs?.[3]?.streams[0]?.compiled_stream.processors).toEqual( + JSON.stringify([ + { + add_fields: { + fields: { + 'monitor.fleet_managed': true, + config_id: '420754e9-40f2-486c-bc2e-265bafd735c5', + 'monitor.project.name': 'test-project', + 'monitor.project.id': 'test-project', + meta: { space_id: 'default' }, + }, + target: '', + }, + }, + ]) + ); + }); + + it('handles processors field for test now fields', () => { + const doc = getBrowserPolicy('', 'test-project', 'test-run-id', true); + const actual10 = migration10(doc, {} as SavedObjectModelTransformationContext); + doc.attributes = actual10.attributes as PackagePolicy; + const actual = migration( + { ...doc, namespace: 'test' }, + {} as SavedObjectModelTransformationContext + ); + expect(actual.attributes?.inputs?.[3]?.streams[0]?.vars?.processors?.value).toEqual( + JSON.stringify([ + { + add_fields: { + fields: { + 'monitor.fleet_managed': true, + test_run_id: 'test-run-id', + run_once: true, + config_id: '420754e9-40f2-486c-bc2e-265bafd735c5', + 'monitor.project.name': 'test-project', + 'monitor.project.id': 'test-project', + meta: { space_id: 'test' }, + }, + target: '', + }, + }, + ]) + ); + expect(actual.attributes?.inputs?.[3]?.streams[0]?.compiled_stream.processors).toEqual( + JSON.stringify([ + { + add_fields: { + fields: { + 'monitor.fleet_managed': true, + test_run_id: 'test-run-id', + run_once: true, + config_id: '420754e9-40f2-486c-bc2e-265bafd735c5', + 'monitor.project.name': 'test-project', + 'monitor.project.id': 'test-project', + meta: { space_id: 'test' }, + }, + target: '', + }, + }, + ]) + ); + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.ts new file mode 100644 index 0000000000000..c7acea2e5d4a9 --- /dev/null +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/synthetics/to_v8_12_0.ts @@ -0,0 +1,54 @@ +/* + * 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 type { SavedObjectModelDataBackfillFn } from '@kbn/core-saved-objects-server'; + +import type { PackagePolicy } from '../../../../common'; + +export const migrateSyntheticsPackagePolicyToV8120: SavedObjectModelDataBackfillFn< + PackagePolicy, + PackagePolicy +> = (packagePolicyDoc) => { + if ( + packagePolicyDoc.attributes.package?.name !== 'synthetics' || + !packagePolicyDoc.attributes.is_managed + ) { + return packagePolicyDoc; + } + const updatedAttributes = packagePolicyDoc.attributes; + const namespace = packagePolicyDoc.namespace; + + const enabledInput = updatedAttributes.inputs.find((input) => input.enabled === true); + const enabledStream = enabledInput?.streams.find((stream) => { + return ['browser', 'http', 'icmp', 'tcp'].includes(stream.data_stream.dataset); + }); + if (!enabledStream) { + return { + attributes: updatedAttributes, + }; + } + + if (enabledStream.vars) { + const processors = processorsFormatter(enabledStream.vars.processors.value, namespace); + enabledStream.vars.processors = { value: processors, type: 'yaml' }; + enabledStream.compiled_stream.processors = processors; + } + + return { + attributes: updatedAttributes, + }; +}; + +export const processorsFormatter = (processorsStr: string, namespace?: string) => { + try { + const processors = JSON.parse(processorsStr); + processors[0].add_fields.fields.meta = { space_id: namespace }; + return JSON.stringify(processors); + } catch (e) { + return processorsStr; + } +}; diff --git a/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts index e109396965e7f..27c55ade654c2 100644 --- a/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts +++ b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts @@ -321,21 +321,26 @@ export const SyntheticsMonitorWithIdCodec = t.intersection([ t.interface({ id: t.string }), ]); +const HeartbeatFieldsCodec = t.intersection([ + t.interface({ + config_id: t.string, + }), + t.partial({ + run_once: t.boolean, + test_run_id: t.string, + 'monitor.project.name': t.string, + 'monitor.id': t.string, + 'monitor.project.id': t.string, + 'monitor.fleet_managed': t.boolean, + meta: t.record(t.string, t.string), + }), +]); + export const HeartbeatConfigCodec = t.intersection([ SyntheticsMonitorWithIdCodec, t.partial({ fields_under_root: t.boolean, - fields: t.intersection([ - t.interface({ - config_id: t.string, - }), - t.partial({ - run_once: t.boolean, - test_run_id: t.string, - 'monitor.project.name': t.string, - 'monitor.project.id': t.string, - }), - ]), + fields: HeartbeatFieldsCodec, }), ]); @@ -400,6 +405,7 @@ export type BrowserFields = t.TypeOf; export type BrowserSimpleFields = t.TypeOf; export type BrowserAdvancedFields = t.TypeOf; export type MonitorFields = t.TypeOf; +export type HeartbeatFields = t.TypeOf; export type SyntheticsMonitor = t.TypeOf; export type SyntheticsMonitorWithId = t.TypeOf; export type EncryptedSyntheticsSavedMonitor = t.TypeOf; diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/format_synthetics_policy.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/format_synthetics_policy.ts index 1b1d0838d73a9..f371747342281 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/format_synthetics_policy.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/format_synthetics_policy.ts @@ -23,6 +23,7 @@ export interface ProcessorFields { 'monitor.id': string; test_run_id: string; run_once: boolean; + space_id: string; } export const formatSyntheticsPolicy = ( @@ -70,7 +71,7 @@ export const formatSyntheticsPolicy = ( const processorItem = dataStream?.vars?.processors; if (processorItem) { - processorItem.value = processorsFormatter(config); + processorItem.value = processorsFormatter(config as MonitorFields & ProcessorFields); } // TODO: remove this once we remove legacy support diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/processors_formatter.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/processors_formatter.ts index 2705187acb557..3a3aabb4e92d4 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/processors_formatter.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/private_formatters/processors_formatter.ts @@ -6,43 +6,31 @@ */ import { ProcessorFields } from './format_synthetics_policy'; -import { MonitorFields } from '../../../../common/runtime_types'; - -type Fields = Record; +import { HeartbeatFields, MonitorFields } from '../../../../common/runtime_types'; interface FieldProcessor { add_fields: { target: string; - fields: Fields; + fields: HeartbeatFields; }; } -export const processorsFormatter = (config: Partial) => { - const fields: Fields = { - 'monitor.fleet_managed': true, - }; - if (config.test_run_id) { - fields.test_run_id = config.test_run_id; - } - if (config.run_once) { - fields.run_once = config.run_once; - } - if (config.config_id) { - fields.config_id = config.config_id; - } - if (config['monitor.project.name']) { - fields['monitor.project.name'] = config['monitor.project.name']; - } - if (config['monitor.project.id']) { - fields['monitor.project.id'] = config['monitor.project.id']; - } - if (config['monitor.id']) { - fields['monitor.id'] = config['monitor.id']; - } +export const processorsFormatter = (config: MonitorFields & ProcessorFields) => { const processors: FieldProcessor[] = [ { add_fields: { - fields, + fields: { + 'monitor.fleet_managed': true, + config_id: config.config_id, + test_run_id: config.test_run_id, + run_once: config.run_once, + 'monitor.id': config['monitor.id'], + 'monitor.project.name': config['monitor.project.name'], + 'monitor.project.id': config['monitor.project.id'], + meta: { + space_id: config.space_id, + }, + }, target: '', }, }, diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.test.ts index ecb3a8408b55d..78756c04174ba 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.test.ts @@ -305,6 +305,7 @@ describe('formatHeartbeatRequest', () => { monitor: testBrowserConfig as SyntheticsMonitor, configId: monitorId, heartbeatId, + spaceId: 'test-space-id', }, '{"a":"param"}' ); @@ -317,6 +318,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': testBrowserConfig.project_id, run_once: undefined, test_run_id: undefined, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, }); @@ -329,6 +333,7 @@ describe('formatHeartbeatRequest', () => { monitor: testBrowserConfig as SyntheticsMonitor, configId: monitorId, heartbeatId: monitorId, + spaceId: 'test-space-id', }, JSON.stringify({ key: 'value' }) ); @@ -341,6 +346,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': testBrowserConfig.project_id, run_once: undefined, test_run_id: undefined, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, params: '{"key":"value"}', @@ -354,6 +362,7 @@ describe('formatHeartbeatRequest', () => { monitor, configId: monitorId, heartbeatId: monitorId, + spaceId: 'test-space-id', }); expect(actual).toEqual({ @@ -365,6 +374,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': undefined, run_once: undefined, test_run_id: undefined, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, }); @@ -377,6 +389,7 @@ describe('formatHeartbeatRequest', () => { monitor, configId: monitorId, heartbeatId: monitorId, + spaceId: 'test-space-id', }); expect(actual).toEqual({ @@ -388,6 +401,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': undefined, run_once: undefined, test_run_id: undefined, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, }); @@ -400,6 +416,7 @@ describe('formatHeartbeatRequest', () => { configId: monitorId, runOnce: true, heartbeatId: monitorId, + spaceId: 'test-space-id', }); expect(actual).toEqual({ @@ -411,6 +428,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': testBrowserConfig.project_id, run_once: true, test_run_id: undefined, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, }); @@ -424,6 +444,7 @@ describe('formatHeartbeatRequest', () => { configId: monitorId, testRunId, heartbeatId: monitorId, + spaceId: 'test-space-id', }); expect(actual).toEqual({ @@ -435,6 +456,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': testBrowserConfig.project_id, run_once: undefined, test_run_id: testRunId, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, }); @@ -448,6 +472,7 @@ describe('formatHeartbeatRequest', () => { configId: monitorId, testRunId, heartbeatId: monitorId, + spaceId: 'test-space-id', }); expect(actual).toEqual({ @@ -460,6 +485,9 @@ describe('formatHeartbeatRequest', () => { 'monitor.project.id': testBrowserConfig.project_id, run_once: undefined, test_run_id: testRunId, + meta: { + space_id: 'test-space-id', + }, }, fields_under_root: true, }); diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.ts index 28149eac6ae52..e59a0b625337b 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/public_formatters/format_configs.ts @@ -85,10 +85,11 @@ export interface ConfigData { runOnce?: boolean; testRunId?: string; params: Record; + spaceId: string; } export const formatHeartbeatRequest = ( - { monitor, configId, heartbeatId, runOnce, testRunId }: Omit, + { monitor, configId, heartbeatId, runOnce, testRunId, spaceId }: Omit, params?: string ): HeartbeatConfig => { const projectId = (monitor as BrowserFields)[ConfigKey.PROJECT_ID]; @@ -106,6 +107,9 @@ export const formatHeartbeatRequest = ( 'monitor.project.id': projectId || undefined, run_once: runOnce, test_run_id: testRunId, + meta: { + space_id: spaceId, + }, }, fields_under_root: true, params: monitor.type === 'browser' ? paramsString : '', diff --git a/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts b/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts index 7aa1b2570c68c..418fbde0d31db 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts @@ -105,6 +105,7 @@ export class SyntheticsPrivateLocation { config.type, { ...(config as Partial), + space_id: spaceId, config_id: config.fields?.config_id, location_name: stringifyString(privateLocation.label), location_id: privateLocation.id, diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts index a586114f00a81..88884a65891f7 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts @@ -206,6 +206,7 @@ describe('SyntheticsMonitorClient', () => { params: { username: 'elastic', }, + spaceId: 'test-space', }, ]); expect(syntheticsService.deleteConfigs).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts index 696746e28a0f6..da9be512cbcc8 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts @@ -111,6 +111,7 @@ export class SyntheticsMonitorClient { ); const configData = { + spaceId, params: paramsBySpace[spaceId], monitor: editedMonitor.monitor, configId: editedMonitor.id, @@ -128,7 +129,11 @@ export class SyntheticsMonitorClient { ); if (deletedPublicConfig) { - deletedPublicConfigs.push({ ...deletedPublicConfig, params: paramsBySpace[spaceId] }); + deletedPublicConfigs.push({ + ...deletedPublicConfig, + params: paramsBySpace[spaceId], + spaceId, + }); } if (privateLocations.length > 0 || this.hasPrivateLocations(editedMonitor.previousMonitor)) { @@ -165,7 +170,7 @@ export class SyntheticsMonitorClient { const privateDeletePromise = this.privateLocationAPI.deleteMonitors(monitors, spaceId); const publicDeletePromise = this.syntheticsService.deleteConfigs( - monitors.map((monitor) => ({ monitor, configId: monitor.config_id, params: {} })) + monitors.map((monitor) => ({ spaceId, monitor, configId: monitor.config_id, params: {} })) ); const [pubicResponse] = await Promise.all([publicDeletePromise, privateDeletePromise]); @@ -286,7 +291,7 @@ export class SyntheticsMonitorClient { for (const monitor of monitors) { const { publicLocations, privateLocations } = this.parseLocations(monitor); if (publicLocations.length > 0) { - publicConfigs.push({ monitor, configId: monitor.config_id, params: {} }); + publicConfigs.push({ spaceId, monitor, configId: monitor.config_id, params: {} }); } if (privateLocations.length > 0) { @@ -370,6 +375,7 @@ export class SyntheticsMonitorClient { heartbeatConfigs.push( formatHeartbeatRequest( { + spaceId, monitor: normalizedMonitor, configId: monitor.id, }, @@ -388,6 +394,7 @@ export class SyntheticsMonitorClient { ) { const { monitor, id } = monitorObj; const config = { + spaceId, monitor, configId: id, params: paramsBySpace[spaceId], diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts index 4f5739e933e0a..aabedbe96443b 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts @@ -640,6 +640,7 @@ export class SyntheticsService { monitor: normalizeSecrets(monitor).attributes, configId: monitor.id, heartbeatId: attributes[ConfigKey.MONITOR_QUERY_ID], + spaceId: monitorSpace, }; }); diff --git a/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts b/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts index 2b22519f6894d..73314ba770384 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts @@ -398,6 +398,7 @@ export default function ({ getService }: FtrProviderContext) { id: monitorId, location: { id: testFleetPolicyID }, namespace: formatKibanaNamespace(SPACE_ID), + spaceId: SPACE_ID, }) ); await supertestWithoutAuth diff --git a/x-pack/test/api_integration/apis/synthetics/inspect_monitor.ts b/x-pack/test/api_integration/apis/synthetics/inspect_monitor.ts index 947347fb2d4e4..6bf81370365d5 100644 --- a/x-pack/test/api_integration/apis/synthetics/inspect_monitor.ts +++ b/x-pack/test/api_integration/apis/synthetics/inspect_monitor.ts @@ -84,7 +84,9 @@ export default function ({ getService }: FtrProviderContext) { 'response.include_body_max_bytes': '1024', ipv4: true, ipv6: true, - fields: {}, + fields: { + meta: { space_id: 'default' }, + }, fields_under_root: true, }, ], @@ -147,6 +149,7 @@ export default function ({ getService }: FtrProviderContext) { throttling: { download: 5, upload: 3, latency: 20 }, original_space: 'default', fields: { + meta: { space_id: 'default' }, 'monitor.project.name': 'test-project-cb47c83a-45e7-416a-9301-cb476b5bff01', 'monitor.project.id': 'test-project-cb47c83a-45e7-416a-9301-cb476b5bff01', }, @@ -223,6 +226,7 @@ export default function ({ getService }: FtrProviderContext) { add_fields: { target: '', fields: { + meta: { space_id: 'default' }, 'monitor.fleet_managed': true, }, }, diff --git a/x-pack/test/api_integration/apis/synthetics/sample_data/test_policy.ts b/x-pack/test/api_integration/apis/synthetics/sample_data/test_policy.ts index efbeca6161d56..eec5ec78d87b3 100644 --- a/x-pack/test/api_integration/apis/synthetics/sample_data/test_policy.ts +++ b/x-pack/test/api_integration/apis/synthetics/sample_data/test_policy.ts @@ -22,6 +22,7 @@ interface PolicyProps { proxyUrl?: string; params?: Record; isBrowser?: boolean; + spaceId?: string; } export const getTestSyntheticsPolicy = (props: PolicyProps): PackagePolicy => { @@ -130,6 +131,8 @@ export const getHttpInput = ({ proxyUrl, isTLSEnabled, isBrowser, + spaceId, + namespace, name = 'check if title is present-Test private location 0', }: PolicyProps) => { const enabled = !isBrowser; @@ -197,6 +200,7 @@ export const getHttpInput = ({ fields: { 'monitor.fleet_managed': true, config_id: id, + meta: { space_id: spaceId ?? 'default' }, 'monitor.project.name': projectId, 'monitor.project.id': projectId, }, @@ -297,6 +301,9 @@ export const getHttpInput = ({ add_fields: { fields: { config_id: id, + meta: { + space_id: spaceId ?? 'default', + }, 'monitor.fleet_managed': true, ...(projectId ? { 'monitor.project.id': projectId, 'monitor.project.name': projectId } diff --git a/x-pack/test/api_integration/apis/synthetics/sample_data/test_project_monitor_policy.ts b/x-pack/test/api_integration/apis/synthetics/sample_data/test_project_monitor_policy.ts index 73171abe24435..4b9b9b9747422 100644 --- a/x-pack/test/api_integration/apis/synthetics/sample_data/test_project_monitor_policy.ts +++ b/x-pack/test/api_integration/apis/synthetics/sample_data/test_project_monitor_policy.ts @@ -158,6 +158,7 @@ export const getTestProjectSyntheticsPolicyLightweight = ( config_id: configId, 'monitor.project.name': projectId, 'monitor.project.id': projectId, + meta: { space_id: 'default' }, }, target: '', }, @@ -282,6 +283,7 @@ export const getTestProjectSyntheticsPolicyLightweight = ( 'monitor.fleet_managed': true, 'monitor.project.id': projectId, 'monitor.project.name': projectId, + meta: { space_id: 'default' }, }, target: '', }, diff --git a/x-pack/test/api_integration/apis/synthetics/services/private_location_test_service.ts b/x-pack/test/api_integration/apis/synthetics/services/private_location_test_service.ts index 02f4612cdb13e..99ba316d3f850 100644 --- a/x-pack/test/api_integration/apis/synthetics/services/private_location_test_service.ts +++ b/x-pack/test/api_integration/apis/synthetics/services/private_location_test_service.ts @@ -11,7 +11,7 @@ import { SyntheticsPrivateLocations } from '@kbn/synthetics-plugin/common/runtim import { FtrProviderContext } from '../../../ftr_provider_context'; import { KibanaSupertestProvider } from '../../../../../../test/api_integration/services/supertest'; -export const INSTALLED_VERSION = '1.1.0'; +export const INSTALLED_VERSION = '1.1.1'; export class PrivateLocationTestService { private supertest: ReturnType; From 8d191f1950070ee89f19f267db71283dd7caf364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= Date: Thu, 9 Nov 2023 15:17:55 +0100 Subject: [PATCH 02/51] [Security Solution][Endpoint] Disable vagrantfile check update (#170897) ## Summary Set `config.vm.box_check_update` vagrant option to `false` in order to use cached images. --- .../scripts/endpoint/endpoint_agent_runner/Vagrantfile | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/Vagrantfile b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/Vagrantfile index 42080eab2984e..a6b93e8de47b5 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/Vagrantfile +++ b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/Vagrantfile @@ -5,6 +5,7 @@ cachedAgentFilename = ENV["CACHED_AGENT_FILENAME"] || '' Vagrant.configure("2") do |config| config.vm.hostname = hostname config.vm.box = 'ubuntu/jammy64' + config.vm.box_check_update = false config.vm.provider :virtualbox do |vb| vb.memory = 4096 From e42ee8a798202a550da098139a2f7dd86edb9f48 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 9 Nov 2023 15:20:57 +0100 Subject: [PATCH 03/51] [HTTP] Update doc comments on versioned router from `experimental` to `public` or `internal` (#170887) ## Summary Per the title, this code should no longer be considered experimental. --- .../src/versioned_router/types.ts | 10 ++--- .../core-http-server/src/versioning/types.ts | 38 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts index 4004004036c53..b085593cb0a5e 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts @@ -15,15 +15,15 @@ import type { export type Method = Exclude; -/** @experimental */ +/** @internal */ export interface VersionedRouterRoute { - /** @experimental */ + /** @internal */ method: string; - /** @experimental */ + /** @internal */ path: string; - /** @experimental */ + /** @internal */ options: VersionedRouteConfig; - /** @experimental */ + /** @internal */ handlers: Array<{ fn: RequestHandler; options: AddVersionOpts; diff --git a/packages/core/http/core-http-server/src/versioning/types.ts b/packages/core/http/core-http-server/src/versioning/types.ts index 265a99eb33db7..f295fbaf0e534 100644 --- a/packages/core/http/core-http-server/src/versioning/types.ts +++ b/packages/core/http/core-http-server/src/versioning/types.ts @@ -26,7 +26,7 @@ export type { ApiVersion }; /** * Configuration for a versioned route - * @experimental + * @public */ export type VersionedRouteConfig = Omit< RouteConfig, @@ -49,7 +49,7 @@ export type VersionedRouteConfig = Omit< * @note When enabled `apiVersion` is a reserved query parameter and will not * be passed to the route handler or handler validation. * @note `apiVersion` is a reserved query parameter, avoid using it - * @experimental + * @public * @default false */ enableQueryVersion?: boolean; @@ -60,7 +60,7 @@ export type VersionedRouteConfig = Omit< * * @param config - The route configuration * @returns A versioned route - * @experimental + * @public */ export type VersionedRouteRegistrar = ( config: VersionedRouteConfig @@ -155,40 +155,40 @@ export type VersionedRouteRegistrar { /** - * @experimental + * @public * @track-adoption */ get: VersionedRouteRegistrar<'get', Ctx>; /** - * @experimental + * @public * @track-adoption */ put: VersionedRouteRegistrar<'put', Ctx>; /** - * @experimental + * @public * @track-adoption */ post: VersionedRouteRegistrar<'post', Ctx>; /** - * @experimental + * @public * @track-adoption */ patch: VersionedRouteRegistrar<'patch', Ctx>; /** - * @experimental + * @public * @track-adoption */ delete: VersionedRouteRegistrar<'delete', Ctx>; } -/** @experimental */ +/** @public */ export type VersionedRouteRequestValidation = RouteValidatorFullConfig; -/** @experimental */ +/** @public */ export interface VersionedRouteResponseValidation { [statusCode: number]: { body: RouteValidationFunction | Type }; unsafe?: { body?: boolean }; @@ -196,19 +196,19 @@ export interface VersionedRouteResponseValidation { /** * Versioned route validation - * @experimental + * @public */ export interface FullValidationConfig { /** * Validation to run against route inputs: params, query and body - * @experimental + * @public */ request?: VersionedRouteRequestValidation; /** * Validation to run against route output * @note This validation is only intended to run in development. Do not use this * for setting default values! - * @experimental + * @public */ response?: VersionedRouteResponseValidation; } @@ -216,24 +216,24 @@ export interface FullValidationConfig { /** * Options for a versioned route. Probably needs a lot more options like sunsetting * of an endpoint etc. - * @experimental + * @public */ export interface AddVersionOpts { /** * Version to assign to this route - * @experimental + * @public */ version: ApiVersion; /** * Validation for this version of a route - * @experimental + * @public */ validate: false | FullValidationConfig; } /** * A versioned route - * @experimental + * @public */ export interface VersionedRoute< Method extends RouteMethod = RouteMethod, @@ -244,7 +244,7 @@ export interface VersionedRoute< * @param opts {@link AddVersionOpts | Options} for this version of a route * @param handler The request handler for this version of a route * @returns A versioned route, allows for fluent chaining of version declarations - * @experimental + * @public */ addVersion

( options: AddVersionOpts, From 60c64906f1219b383c4bb673bce3fbf3d60c4b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?= Date: Thu, 9 Nov 2023 15:32:10 +0100 Subject: [PATCH 04/51] [Defend Workflows] Enable FTR API tests for serverless using tags (#170418) ## Summary With a similar solution as #169946, almost all of our FTR API tests (`x-pack/test/security_solution_endpoint_api_int/`) can now run against serverless, using `suiteTags` under the hood. ## Usage ```ts describe('This is the suite.', function() { // a custom function wraps the `this.tags()` function to provide type safety targetTags(this, ['@ess', '@serverless', '@skipInServerless']); }) ``` > **Note** > Only `describe()` blocks can be tagged. ## Changes: - serverless config is added for endpoint FTR API tests: `x-pack/test/security_solution_endpoint_api_int/serverless.config.ts` - roles are created only when running against ESS. when running against serverless, a subset of users/roles already exist (see [this list](https://github.com/elastic/kibana/pull/170418/files#diff-5aaeaeaedad4321151d5388437084b27f271a6254e95f0352c9a10c3126eddc8R54)) - tests that use roles that doesn't exist on serverless (`artifact_read_privileges`, `hunter`) are therefore skipped against serverless --- .buildkite/ftr_configs.yml | 2 + .../endpoint/common/roles_users/index.ts | 6 ++ .../security_solution_endpoint/config.base.ts | 5 +- .../services/index.ts | 6 +- .../services/supertest_with_cert.ts | 8 +++ .../security_solution_endpoint/target_tags.ts | 49 +++++++++++++--- .../apis/endpoint_artifacts/blocklists.ts | 37 ++++++------ .../apis/endpoint_artifacts/event_filters.ts | 31 +++++----- .../host_isolation_exceptions.ts | 33 ++++++----- .../apis/endpoint_artifacts/trusted_apps.ts | 37 ++++++------ .../apis/endpoint_authz.ts | 9 ++- .../apis/endpoint_response_actions/execute.ts | 19 ++++--- .../apis/index.ts | 23 +++++--- .../apis/metadata.ts | 9 ++- .../apis/package.ts | 5 +- .../apis/policy.ts | 5 +- .../apis/resolver/entity.ts | 28 +++++++--- .../apis/resolver/entity_id.ts | 23 +++++--- .../apis/resolver/events.ts | 34 ++++++----- .../apis/resolver/tree.ts | 46 ++++++++------- .../config.base.ts | 56 +++++++++++++++++++ .../config.ts | 30 ++-------- .../headers.ts | 11 ++++ .../serverless.config.ts | 24 ++++++++ .../services/index.ts | 11 ++++ .../services/roles_users.ts | 48 +++------------- 26 files changed, 374 insertions(+), 221 deletions(-) create mode 100644 x-pack/test/security_solution_endpoint_api_int/config.base.ts create mode 100644 x-pack/test/security_solution_endpoint_api_int/headers.ts create mode 100644 x-pack/test/security_solution_endpoint_api_int/serverless.config.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index c6817a53b08a8..c817c9f8442e5 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -16,6 +16,7 @@ disabled: - x-pack/test/security_solution_api_integration/config/ess/config.base.ts - x-pack/test/security_solution_api_integration/config/serverless/config.base.ts - x-pack/test/security_solution_endpoint/config.base.ts + - x-pack/test/security_solution_endpoint_api_int/config.base.ts # QA suites that are run out-of-band - x-pack/test/stack_functional_integration/configs/config.stack_functional_integration_base.js @@ -385,6 +386,7 @@ enabled: - x-pack/test/security_functional/user_profiles.config.ts - x-pack/test/security_functional/expired_session.config.ts - x-pack/test/security_solution_endpoint_api_int/config.ts + - x-pack/test/security_solution_endpoint_api_int/serverless.config.ts - x-pack/test/security_solution_endpoint/endpoint.config.ts - x-pack/test/security_solution_endpoint/serverless.endpoint.config.ts - x-pack/test/security_solution_endpoint/integrations.config.ts diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/index.ts index b035f55bf1589..7861ee4d6e0d5 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/index.ts @@ -22,6 +22,7 @@ import { import { getDetectionsEngineer } from './detections_engineer'; import { getWithResponseActionsRole } from './with_response_actions_role'; import { getNoResponseActionsRole } from './without_response_actions_role'; +import { getWithArtifactReadPrivilegesRole } from './with_artifact_read_privileges_role'; export * from './with_response_actions_role'; export * from './without_response_actions_role'; @@ -74,6 +75,7 @@ export const ENDPOINT_SECURITY_ROLE_NAMES = Object.freeze({ endpoint_response_actions_access: 'endpoint_response_actions_access', endpoint_response_actions_no_access: 'endpoint_response_actions_no_access', endpoint_security_policy_management_read: 'endpoint_security_policy_management_read', + artifact_read_privileges: 'artifact_read_privileges', }); export const getAllEndpointSecurityRoles = (): EndpointSecurityRoleDefinitions => { @@ -135,5 +137,9 @@ export const getAllEndpointSecurityRoles = (): EndpointSecurityRoleDefinitions = ...getEndpointSecurityPolicyManagementReadRole(), name: 'endpoint_security_policy_management_read', }, + artifact_read_privileges: { + ...getWithArtifactReadPrivilegesRole(), + name: 'artifact_read_privileges', + }, }; }; diff --git a/x-pack/test/security_solution_endpoint/config.base.ts b/x-pack/test/security_solution_endpoint/config.base.ts index ebfce1ab4db0c..d75458a4c581d 100644 --- a/x-pack/test/security_solution_endpoint/config.base.ts +++ b/x-pack/test/security_solution_endpoint/config.base.ts @@ -14,7 +14,10 @@ import { } from '../security_solution_endpoint_api_int/registry'; import type { TargetTags } from './target_tags'; -const SUITE_TAGS: Record = { +export const SUITE_TAGS: Record< + 'ess' | 'serverless', + { include: TargetTags[]; exclude: TargetTags[] } +> = { ess: { include: ['@ess'], exclude: ['@skipInEss'], diff --git a/x-pack/test/security_solution_endpoint/services/index.ts b/x-pack/test/security_solution_endpoint/services/index.ts index b2c52ada028b0..5ba317dfaea3e 100644 --- a/x-pack/test/security_solution_endpoint/services/index.ts +++ b/x-pack/test/security_solution_endpoint/services/index.ts @@ -13,7 +13,10 @@ import { TimelineTestService } from '../../security_solution_ftr/services/timeli import { DetectionsTestService } from '../../security_solution_ftr/services/detections'; import { EndpointPolicyTestResourcesProvider } from './endpoint_policy'; import { EndpointArtifactsTestResources } from './endpoint_artifacts'; -import { KibanaSupertestWithCertProvider } from './supertest_with_cert'; +import { + KibanaSupertestWithCertProvider, + KibanaSupertestWithCertWithoutAuthProvider, +} from './supertest_with_cert'; export const services = { ...xPackFunctionalServices, @@ -31,4 +34,5 @@ export const svlServices = { ...services, supertest: KibanaSupertestWithCertProvider, + supertestWithoutAuth: KibanaSupertestWithCertWithoutAuthProvider, }; diff --git a/x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts b/x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts index e06e144a1667f..a23d850e3799b 100644 --- a/x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts +++ b/x-pack/test/security_solution_endpoint/services/supertest_with_cert.ts @@ -15,3 +15,11 @@ export function KibanaSupertestWithCertProvider({ getService }: FtrProviderConte return supertest.agent(kibanaServerUrl, { ca }); } + +export function KibanaSupertestWithCertWithoutAuthProvider({ getService }: FtrProviderContext) { + const config = getService('config'); + const kibanaServerUrl = formatUrl({ ...config.get('servers.kibana'), auth: false }); + const ca = config.get('servers.kibana').certificateAuthorities; + + return supertest.agent(kibanaServerUrl, { ca }); +} diff --git a/x-pack/test/security_solution_endpoint/target_tags.ts b/x-pack/test/security_solution_endpoint/target_tags.ts index dd71736e95ee5..4fd76a0173e21 100644 --- a/x-pack/test/security_solution_endpoint/target_tags.ts +++ b/x-pack/test/security_solution_endpoint/target_tags.ts @@ -5,13 +5,44 @@ * 2.0. */ -export type TargetTags = - | '@ess' - | '@skipInEss' - | '@serverless' - | '@skipInServerless' - | '@brokenInServerless'; - -export const targetTags = (thisSuite: Mocha.Suite, tags: TargetTags[]) => { +import expect from '@kbn/expect'; + +const TARGET_TAGS = [ + '@ess', + '@skipInEss', + '@serverless', + '@skipInServerless', + '@brokenInServerless', +] as const; + +export type TargetTags = typeof TARGET_TAGS[number]; + +export function targetTags(thisSuite: Mocha.Suite, tags: TargetTags[]) { + // @ts-ignore: _tags is not publicly visible + const existingTags = (thisSuite._tags as string[]) ?? []; + const existingTargetTags = existingTags.filter((tag) => TARGET_TAGS.includes(tag as TargetTags)); + + if (existingTargetTags.length > 0) { + return expect().fail(` + + ⚠️ ERROR in \`${targetTags.name}()\`: the passed suite already has target tags. + + Suite name: ${thisSuite.title} + Existing tags: ${existingTargetTags.join(', ')} + New tags: ${tags.join(', ')} + + 💡 This can happen if you call \`${targetTags.name}()\` twice in the same block, or + → from the inside of an arrow function + → which is passed to a \`describe()\` block + → which is somewhere inside \`${thisSuite.title}\`. + + ☝️ Correct usage: + describe('must receive a regular function', function () { + ${targetTags.name}(this, ['@serverless']); + }) + + `); + } + thisSuite.tags(tags); -}; +} diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts index a5a5c109fe440..5351cc22f628a 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/blocklists.ts @@ -13,6 +13,7 @@ import { GLOBAL_ARTIFACT_TAG, } from '@kbn/security-solution-plugin/common/endpoint/service/artifacts'; import { ExceptionsListItemGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/exceptions_list_item_generator'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; @@ -24,7 +25,9 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint artifacts (via lists plugin): Blocklists', () => { + describe('Endpoint artifacts (via lists plugin): Blocklists', function () { + targetTags(this, ['@ess', '@serverless']); + let fleetEndpointPolicy: PolicyTestResourceInfo; before(async () => { @@ -155,7 +158,7 @@ export default function ({ getService }: FtrProviderContext) { body.entries[0].field = 'some.invalid.field'; await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -176,7 +179,7 @@ export default function ({ getService }: FtrProviderContext) { ]; await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -197,7 +200,7 @@ export default function ({ getService }: FtrProviderContext) { ]; await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -224,7 +227,7 @@ export default function ({ getService }: FtrProviderContext) { ]; await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -258,7 +261,7 @@ export default function ({ getService }: FtrProviderContext) { ]; await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -272,7 +275,7 @@ export default function ({ getService }: FtrProviderContext) { body.os_types = ['linux', 'windows']; await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -297,7 +300,7 @@ export default function ({ getService }: FtrProviderContext) { for (const blocklistApiCall of [...needsWritePrivilege, ...needsReadPrivilege]) { it(`should not error on [${blocklistApiCall.method}] - [${blocklistApiCall.info}]`, async () => { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(blocklistApiCall.getBody()) .expect(200); @@ -305,24 +308,23 @@ export default function ({ getService }: FtrProviderContext) { } }); - describe('and user has authorization to read blocklist', () => { + describe('and user has authorization to read blocklist', function () { + targetTags(this, ['@skipInServerless']); // no such role in serverless + for (const blocklistApiCall of [...blocklistApiCalls, ...needsWritePrivilege]) { it(`should error on [${blocklistApiCall.method}] - [${blocklistApiCall.info}]`, async () => { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.artifact_read_privileges, 'changeme') .set('kbn-xsrf', 'true') .send(blocklistApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } for (const blocklistApiCall of needsReadPrivilege) { it(`should not error on [${blocklistApiCall.method}] - [${blocklistApiCall.info}]`, async () => { await supertestWithoutAuth[blocklistApiCall.method](blocklistApiCall.path) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.artifact_read_privileges, 'changeme') .set('kbn-xsrf', 'true') .send(blocklistApiCall.getBody()) .expect(200); @@ -341,10 +343,7 @@ export default function ({ getService }: FtrProviderContext) { .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') .send(blocklistApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts index 8a00471665e04..5f5c75caa68f9 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/event_filters.ts @@ -14,6 +14,7 @@ import { getImportExceptionsListSchemaMock, toNdJsonString, } from '@kbn/lists-plugin/common/schemas/request/import_exceptions_schema.mock'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; @@ -25,7 +26,9 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint artifacts (via lists plugin): Event Filters', () => { + describe('Endpoint artifacts (via lists plugin): Event Filters', function () { + targetTags(this, ['@ess', '@serverless']); + let fleetEndpointPolicy: PolicyTestResourceInfo; before(async () => { @@ -182,7 +185,7 @@ export default function ({ getService }: FtrProviderContext) { const body = eventFilterApiCall.getBody({ os_types: ['linux', 'windows'] }); await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -197,7 +200,7 @@ export default function ({ getService }: FtrProviderContext) { // Using superuser there as we need custom license for this action await supertest[eventFilterApiCall.method](eventFilterApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -210,7 +213,7 @@ export default function ({ getService }: FtrProviderContext) { // Using superuser here as we need custom license for this action await supertest[eventFilterApiCall.method](eventFilterApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(200); @@ -222,7 +225,7 @@ export default function ({ getService }: FtrProviderContext) { for (const eventFilterApiCall of [...needsWritePrivilege, ...needsReadPrivilege]) { it(`should not error on [${eventFilterApiCall.method}] - [${eventFilterApiCall.info}]`, async () => { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(eventFilterApiCall.getBody()) .expect(200); @@ -230,24 +233,23 @@ export default function ({ getService }: FtrProviderContext) { } }); - describe('and user has authorization to read event filters', () => { + describe('and user has authorization to read event filters', function () { + targetTags(this, ['@skipInServerless']); // no such role in serverless + for (const eventFilterApiCall of [...eventFilterCalls, ...needsWritePrivilege]) { it(`should error on [${eventFilterApiCall.method}] - [${eventFilterApiCall.info}]`, async () => { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') .send(eventFilterApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } for (const eventFilterApiCall of needsReadPrivilege) { it(`should not error on [${eventFilterApiCall.method}] - [${eventFilterApiCall.info}]`, async () => { await supertestWithoutAuth[eventFilterApiCall.method](eventFilterApiCall.path) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') .send(eventFilterApiCall.getBody()) .expect(200); @@ -266,10 +268,7 @@ export default function ({ getService }: FtrProviderContext) { .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') .send(eventFilterApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts index b22ff51ce8ed7..09616f57a68d0 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/host_isolation_exceptions.ts @@ -17,6 +17,7 @@ import { toNdJsonString, } from '@kbn/lists-plugin/common/schemas/request/import_exceptions_schema.mock'; import { ExceptionsListItemGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/exceptions_list_item_generator'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; @@ -28,7 +29,9 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint Host Isolation Exceptions artifacts (via lists plugin)', () => { + describe('Endpoint Host Isolation Exceptions artifacts (via lists plugin)', function () { + targetTags(this, ['@ess', '@serverless']); + let fleetEndpointPolicy: PolicyTestResourceInfo; let hostIsolationExceptionData: ArtifactTestData; @@ -191,7 +194,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -207,7 +210,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -230,7 +233,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -246,7 +249,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -273,7 +276,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(hostIsolationExceptionApiCall.getBody()) .expect(200); @@ -281,7 +284,9 @@ export default function ({ getService }: FtrProviderContext) { } }); - describe('and user has authorization to read host isolation exceptions', () => { + describe('and user has authorization to read host isolation exceptions', function () { + targetTags(this, ['@skipInServerless']); // no such role in serverless + for (const hostIsolationExceptionApiCall of [ ...hostIsolationExceptionCalls, ...needsWritePrivilege, @@ -290,13 +295,10 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') .send(hostIsolationExceptionApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } @@ -305,7 +307,7 @@ export default function ({ getService }: FtrProviderContext) { await supertestWithoutAuth[hostIsolationExceptionApiCall.method]( hostIsolationExceptionApiCall.path ) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') .send(hostIsolationExceptionApiCall.getBody()) .expect(200); @@ -326,10 +328,7 @@ export default function ({ getService }: FtrProviderContext) { .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') .send(hostIsolationExceptionApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts index 9841cf2adab9c..fb844f40a8fbf 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_artifacts/trusted_apps.ts @@ -13,6 +13,7 @@ import { GLOBAL_ARTIFACT_TAG, } from '@kbn/security-solution-plugin/common/endpoint/service/artifacts'; import { ExceptionsListItemGenerator } from '@kbn/security-solution-plugin/common/endpoint/data_generators/exceptions_list_item_generator'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../../security_solution_endpoint/services/endpoint_policy'; import { ArtifactTestData } from '../../../security_solution_endpoint/services/endpoint_artifacts'; @@ -24,7 +25,9 @@ export default function ({ getService }: FtrProviderContext) { const endpointPolicyTestResources = getService('endpointPolicyTestResources'); const endpointArtifactTestResources = getService('endpointArtifactTestResources'); - describe('Endpoint artifacts (via lists plugin): Trusted Applications', () => { + describe('Endpoint artifacts (via lists plugin): Trusted Applications', function () { + targetTags(this, ['@ess', '@serverless']); + let fleetEndpointPolicy: PolicyTestResourceInfo; before(async () => { @@ -155,7 +158,7 @@ export default function ({ getService }: FtrProviderContext) { body.entries[0].field = 'some.invalid.field'; await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -169,7 +172,7 @@ export default function ({ getService }: FtrProviderContext) { body.entries.push({ ...body.entries[0] }); await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -190,7 +193,7 @@ export default function ({ getService }: FtrProviderContext) { ]; await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -224,7 +227,7 @@ export default function ({ getService }: FtrProviderContext) { ]; await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -238,7 +241,7 @@ export default function ({ getService }: FtrProviderContext) { body.os_types = ['linux', 'windows']; await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -253,7 +256,7 @@ export default function ({ getService }: FtrProviderContext) { // Using superuser here as we need custom license for this action await supertest[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(body) .expect(400) @@ -264,7 +267,7 @@ export default function ({ getService }: FtrProviderContext) { for (const trustedAppApiCall of [...needsWritePrivilege, ...needsReadPrivilege]) { it(`should not error on [${trustedAppApiCall.method}] - [${trustedAppApiCall.info}]`, async () => { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.endpoint_security_policy_manager, 'changeme') + .auth(ROLE.endpoint_policy_manager, 'changeme') .set('kbn-xsrf', 'true') .send(trustedAppApiCall.getBody()) .expect(200); @@ -272,24 +275,23 @@ export default function ({ getService }: FtrProviderContext) { } }); - describe('and user has authorization to read trusted apps', () => { + describe('and user has authorization to read trusted apps', function () { + targetTags(this, ['@skipInServerless']); // no such role in serverless + for (const trustedAppApiCall of [...trustedAppApiCalls, ...needsWritePrivilege]) { it(`should error on [${trustedAppApiCall.method}] - [${trustedAppApiCall.info}]`, async () => { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') .send(trustedAppApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } for (const trustedAppApiCall of needsReadPrivilege) { it(`should not error on [${trustedAppApiCall.method}] - [${trustedAppApiCall.info}]`, async () => { await supertestWithoutAuth[trustedAppApiCall.method](trustedAppApiCall.path) - .auth(ROLE.artifact_read_role, 'changeme') + .auth(ROLE.hunter, 'changeme') .set('kbn-xsrf', 'true') .send(trustedAppApiCall.getBody()) .expect(200); @@ -308,10 +310,7 @@ export default function ({ getService }: FtrProviderContext) { .auth(ROLE.t1_analyst, 'changeme') .set('kbn-xsrf', 'true') .send(trustedAppApiCall.getBody()) - .expect(403, { - status_code: 403, - message: 'EndpointArtifactError: Endpoint authorization failure', - }); + .expect(403); }); } }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts index ef242d887496f..7434f46ca35be 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts @@ -24,6 +24,7 @@ import { EXECUTE_ROUTE, } from '@kbn/security-solution-plugin/common/endpoint/constants'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; +import { targetTags } from '../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../ftr_provider_context'; import { ROLE } from '../services/roles_users'; @@ -39,7 +40,9 @@ export default function ({ getService }: FtrProviderContext) { body: Record | undefined; } - describe('When attempting to call an endpoint api', () => { + describe('When attempting to call an endpoint api', function () { + targetTags(this, ['@ess', '@serverless']); + let indexedData: IndexedHostsAndAlertsResponse; let actionId = ''; let agentId = ''; @@ -246,7 +249,7 @@ export default function ({ getService }: FtrProviderContext) { apiListItem.path }]`, async () => { await supertestWithoutAuth[apiListItem.method](replacePathIds(apiListItem.path)) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'xxx') .send(apiListItem.body) .expect(403, { @@ -268,7 +271,7 @@ export default function ({ getService }: FtrProviderContext) { apiListItem.path }]`, async () => { await supertestWithoutAuth[apiListItem.method](replacePathIds(apiListItem.path)) - .auth(ROLE.analyst_hunter, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'xxx') .send(apiListItem.body) .expect(200); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts index 9efd670c55db8..f904539dae231 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts @@ -8,6 +8,7 @@ import { wrapErrorAndRejectPromise } from '@kbn/security-solution-plugin/common/ import expect from '@kbn/expect'; import { EXECUTE_ROUTE } from '@kbn/security-solution-plugin/common/endpoint/constants'; import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { ROLE } from '../../services/roles_users'; @@ -15,7 +16,9 @@ export default function ({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const endpointTestResources = getService('endpointTestResources'); - describe('Endpoint `execute` response action', () => { + describe('Endpoint `execute` response action', function () { + targetTags(this, ['@ess', '@serverless']); + let indexedData: IndexedHostsAndAlertsResponse; let agentId = ''; @@ -46,7 +49,7 @@ export default function ({ getService }: FtrProviderContext) { it('should error on invalid endpoint id', async () => { await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ endpoint_ids: [' '], parameters: { command: 'ls -la' } }) @@ -60,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) { it('should error on missing endpoint id', async () => { await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ parameters: { command: 'ls -la' } }) @@ -75,7 +78,7 @@ export default function ({ getService }: FtrProviderContext) { it('should error on invalid `command` parameter', async () => { await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ endpoint_ids: [agentId], parameters: { command: ' ' } }) @@ -89,7 +92,7 @@ export default function ({ getService }: FtrProviderContext) { it('should error on missing `command` parameter', async () => { await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ endpoint_ids: [agentId] }) @@ -104,7 +107,7 @@ export default function ({ getService }: FtrProviderContext) { it('should error on invalid `timeout` parameter', async () => { await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ endpoint_ids: [agentId], parameters: { command: 'ls -la', timeout: 'too' } }) @@ -121,7 +124,7 @@ export default function ({ getService }: FtrProviderContext) { body: { data }, } = await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ endpoint_ids: [agentId], parameters: { command: 'ls -la' } }) @@ -137,7 +140,7 @@ export default function ({ getService }: FtrProviderContext) { body: { data }, } = await supertestWithoutAuth .post(EXECUTE_ROUTE) - .auth(ROLE.response_actions_role, 'changeme') + .auth(ROLE.endpoint_operations_analyst, 'changeme') .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') .send({ endpoint_ids: [agentId], parameters: { command: 'ls -la', timeout: 2000 } }) diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts index 06d54f0aaac45..c0668612907a7 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts @@ -4,8 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import { getRegistryUrl as getRegistryUrlFromIngest } from '@kbn/fleet-plugin/server'; +import { isServerlessKibanaFlavor } from '@kbn/security-solution-plugin/scripts/endpoint/common/stack_services'; import { FtrProviderContext } from '../ftr_provider_context'; import { getRegistryUrlFromTestEnv, isRegistryEnabled } from '../registry'; import { ROLE } from '../services/roles_users'; @@ -16,7 +16,7 @@ export default function endpointAPIIntegrationTests(providerContext: FtrProvider describe('Endpoint plugin', function () { const ingestManager = getService('ingestManager'); const rolesUsersProvider = getService('rolesUsersProvider'); - + const kbnClient = getService('kibanaServer'); const log = getService('log'); if (!isRegistryEnabled()) { @@ -34,16 +34,21 @@ export default function endpointAPIIntegrationTests(providerContext: FtrProvider log.warning(`Error setting up ingestManager: ${err}`); } - // create role/user - for (const role of roles) { - await rolesUsersProvider.createRole({ predefinedRole: role }); - await rolesUsersProvider.createUser({ name: role, roles: [role] }); + if (!(await isServerlessKibanaFlavor(kbnClient))) { + // create role/user + for (const role of roles) { + await rolesUsersProvider.createRole({ predefinedRole: role }); + await rolesUsersProvider.createUser({ name: role, roles: [role] }); + } } }); + after(async () => { - // delete role/user - await rolesUsersProvider.deleteUsers(roles); - await rolesUsersProvider.deleteRoles(roles); + if (!(await isServerlessKibanaFlavor(kbnClient))) { + // delete role/user + await rolesUsersProvider.deleteUsers(roles); + await rolesUsersProvider.deleteRoles(roles); + } }); loadTestFile(require.resolve('./resolver')); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 17cc5906d7ba8..3ac6c83938c14 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -29,6 +29,7 @@ import { EndpointSortableField, MetadataListResponse, } from '@kbn/security-solution-plugin/common/endpoint/types'; +import { targetTags } from '../../security_solution_endpoint/target_tags'; import { generateAgentDocs, generateMetadataDocs } from './metadata.fixtures'; import { bulkIndex, @@ -47,7 +48,9 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); // Failing: See https://github.com/elastic/kibana/issues/151854 - describe.skip('test metadata apis', () => { + describe.skip('test metadata apis', function () { + targetTags(this, ['@ess', '@serverless']); + describe('list endpoints GET route', () => { const numberOfHostsInFixture = 2; let agent1Timestamp: number; @@ -415,10 +418,14 @@ export default function ({ getService }: FtrProviderContext) { }); it('should respond forbidden if no fleet access', async () => { + const config = getService('config'); + const ca = config.get('servers.kibana').certificateAuthorities; + await getService('supertestWithoutAuth') .get(METADATA_TRANSFORMS_STATUS_ROUTE) .set('kbn-xsrf', 'xxx') .set('Elastic-Api-Version', '2023-10-31') + .ca(ca) .expect(401); }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/package.ts b/x-pack/test/security_solution_endpoint_api_int/apis/package.ts index 9df605fa32a04..4b6fb578bbef8 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/package.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/package.ts @@ -15,6 +15,7 @@ import { EndpointDocGenerator, Event, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; +import { targetTags } from '../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../ftr_provider_context'; import { InsertedEvents, processEventsIndex } from '../services/resolver'; import { deleteEventsStream } from './data_stream_helper'; @@ -70,7 +71,9 @@ export default function ({ getService }: FtrProviderContext) { }; // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/114885 - describe.skip('Endpoint package', () => { + describe.skip('Endpoint package', function () { + targetTags(this, ['@ess']); + describe('network processors', () => { let networkIndexData: InsertedEvents; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts b/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts index 8b72a6c21bfe5..1fe5fbda42f19 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts @@ -6,13 +6,16 @@ */ import expect from '@kbn/expect'; +import { targetTags } from '../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../ftr_provider_context'; import { deletePolicyStream } from './data_stream_helper'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('Endpoint policy api', () => { + describe('Endpoint policy api', function () { + targetTags(this, ['@ess', '@serverless']); + describe('GET /api/endpoint/policy_response', () => { before( async () => diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts index 268f67a30a918..2a85d95f24c65 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity.ts @@ -8,13 +8,16 @@ import expect from '@kbn/expect'; import { eventsIndexPattern } from '@kbn/security-solution-plugin/common/endpoint/constants'; import { ResolverEntityIndex } from '@kbn/security-solution-plugin/common/endpoint/types'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - describe('Resolver tests for the entity route', () => { + describe('Resolver tests for the entity route', function () { + targetTags(this, ['@ess', '@serverless']); + describe('winlogbeat tests', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/winlogbeat'); @@ -27,9 +30,12 @@ export default function ({ getService }: FtrProviderContext) { it('returns a winlogbeat sysmon event when the event matches the schema correctly', async () => { // this id is from the es archive const _id = 'sysmon-event'; - const { body }: { body: ResolverEntityIndex } = await supertest.get( - `/api/endpoint/resolver/entity?_id=${_id}&indices=${eventsIndexPattern}&indices=winlogbeat-7.11.0-default` - ); + const { body }: { body: ResolverEntityIndex } = await supertest + .get( + `/api/endpoint/resolver/entity?_id=${_id}&indices=${eventsIndexPattern}&indices=winlogbeat-7.11.0-default` + ) + .set('x-elastic-internal-origin', 'xxx'); + expect(body).eql([ { name: 'winlogbeat', @@ -47,14 +53,20 @@ export default function ({ getService }: FtrProviderContext) { it('does not return a powershell event that has event.module set to powershell', async () => { // this id is from the es archive const _id = 'powershell-event'; - const { body }: { body: ResolverEntityIndex } = await supertest.get( - `/api/endpoint/resolver/entity?_id=${_id}&indices=${eventsIndexPattern}&indices=winlogbeat-7.11.0-default` - ); + const { body }: { body: ResolverEntityIndex } = await supertest + .get( + `/api/endpoint/resolver/entity?_id=${_id}&indices=${eventsIndexPattern}&indices=winlogbeat-7.11.0-default` + ) + .set('x-elastic-internal-origin', 'xxx'); + expect(body).to.be.empty(); }); }); - describe('signals index mapping tests', () => { + describe('signals index mapping tests', function () { + // illegal_argument_exception: unknown setting [index.lifecycle.name] in before + targetTags(this, ['@brokenInServerless']); + before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/signals'); }); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts index 6cf74092caf9e..bd5bd0aeca023 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts @@ -19,9 +19,11 @@ import { EndpointDocGenerator, Event, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { InsertedEvents, processEventsIndex } from '../../services/resolver'; import { createAncestryArray, schemaWithAncestry } from './common'; +import { HEADERS } from '../../headers'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -34,7 +36,9 @@ export default function ({ getService }: FtrProviderContext) { } }; - describe('Resolver handling of entity ids', () => { + describe('Resolver handling of entity ids', function () { + targetTags(this, ['@ess', '@serverless']); + describe('entity api', () => { let origin: Event; let genData: InsertedEvents; @@ -52,11 +56,14 @@ export default function ({ getService }: FtrProviderContext) { }); it('excludes events that have an empty entity_id field', async () => { - const { body }: { body: ResolverEntityIndex } = await supertest.get( - // using the same indices value here twice to force the query parameter to be an array - // for some reason using supertest's query() function doesn't construct a parsable array - `/api/endpoint/resolver/entity?_id=${genData.eventsInfo[0]._id}&indices=${eventsIndexPattern}&indices=${eventsIndexPattern}` - ); + const { body }: { body: ResolverEntityIndex } = await supertest + .get( + // using the same indices value here twice to force the query parameter to be an array + // for some reason using supertest's query() function doesn't construct a parsable array + `/api/endpoint/resolver/entity?_id=${genData.eventsInfo[0]._id}&indices=${eventsIndexPattern}&indices=${eventsIndexPattern}` + ) + .set(HEADERS); + expect(body).to.be.empty(); }); }); @@ -100,7 +107,7 @@ export default function ({ getService }: FtrProviderContext) { it('does not find children without a process entity_id', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, ancestors: 0, @@ -172,7 +179,7 @@ export default function ({ getService }: FtrProviderContext) { }; const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, ancestors: 10, diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts index 10cac58533b24..2c1829d2d4501 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts @@ -18,9 +18,11 @@ import { Tree, RelatedEventCategory, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { Options, GeneratedTrees } from '../../services/resolver'; import { compareArrays } from './common'; +import { HEADERS } from '../../headers'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -48,7 +50,9 @@ export default function ({ getService }: FtrProviderContext) { ancestryArraySize: 2, }; - describe('event route', () => { + describe('event route', function () { + targetTags(this, ['@ess', '@serverless']); + let entityIDFilterArray: JsonObject[] | undefined; let entityIDFilter: string | undefined; before(async () => { @@ -77,7 +81,7 @@ export default function ({ getService }: FtrProviderContext) { }); const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter, indexPatterns: [eventsIndexPattern], @@ -100,7 +104,7 @@ export default function ({ getService }: FtrProviderContext) { }); const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter, indexPatterns: [eventsIndexPattern], @@ -117,7 +121,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return related events for the root node', async () => { const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -143,7 +147,7 @@ export default function ({ getService }: FtrProviderContext) { }); const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter, indexPatterns: [eventsIndexPattern], @@ -164,7 +168,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return paginated results for the root node', async () => { let { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events?limit=2`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -180,7 +184,7 @@ export default function ({ getService }: FtrProviderContext) { ({ body } = await supertest .post(`/api/endpoint/resolver/events?limit=2&afterEvent=${body.nextEvent}`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -196,7 +200,7 @@ export default function ({ getService }: FtrProviderContext) { ({ body } = await supertest .post(`/api/endpoint/resolver/events?limit=2&afterEvent=${body.nextEvent}`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -213,7 +217,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return the first page of information when the cursor is invalid', async () => { const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events?afterEvent=blah`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -231,7 +235,7 @@ export default function ({ getService }: FtrProviderContext) { it('should sort the events in descending order', async () => { const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -258,7 +262,7 @@ export default function ({ getService }: FtrProviderContext) { const to = from; const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: [eventsIndexPattern], @@ -276,7 +280,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not find events when using an incorrect index pattern', async () => { const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: entityIDFilter, indexPatterns: ['doesnotexist-*'], @@ -295,7 +299,7 @@ export default function ({ getService }: FtrProviderContext) { expect(originParentID).to.not.be(''); const { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: JSON.stringify({ bool: { @@ -323,7 +327,7 @@ export default function ({ getService }: FtrProviderContext) { let { body }: { body: ResolverPaginatedEvents } = await supertest .post(`/api/endpoint/resolver/events`) .query({ limit: 2 }) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: JSON.stringify({ bool: { @@ -346,7 +350,7 @@ export default function ({ getService }: FtrProviderContext) { ({ body } = await supertest .post(`/api/endpoint/resolver/events`) .query({ limit: 3, afterEvent: body.nextEvent }) - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ filter: JSON.stringify({ bool: { diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts index e4838b49f7ca1..c9602243e70e3 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts @@ -16,9 +16,11 @@ import { Tree, RelatedEventCategory, } from '@kbn/security-solution-plugin/common/endpoint/generate_data'; +import { targetTags } from '../../../security_solution_endpoint/target_tags'; import { FtrProviderContext } from '../../ftr_provider_context'; import { Options, GeneratedTrees } from '../../services/resolver'; import { schemaWithAncestry, schemaWithName, schemaWithoutAncestry, verifyTree } from './common'; +import { HEADERS } from '../../headers'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -45,7 +47,9 @@ export default function ({ getService }: FtrProviderContext) { ancestryArraySize: 2, }; - describe('Resolver tree', () => { + describe('Resolver tree', function () { + targetTags(this, ['@ess', '@serverless']); + before(async () => { resolverTrees = await resolver.createTrees(treeOptions); // we only requested a single alert so there's only 1 tree @@ -59,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return the correct ancestor nodes for the tree', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -84,7 +88,7 @@ export default function ({ getService }: FtrProviderContext) { it('should handle an invalid id', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -104,7 +108,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return a subset of the ancestors', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -130,7 +134,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return ancestors without the ancestry array', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -158,7 +162,7 @@ export default function ({ getService }: FtrProviderContext) { ).toISOString(); const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -185,7 +189,7 @@ export default function ({ getService }: FtrProviderContext) { const bottomMostDescendant = Array.from(tree.childrenLevels[1].values())[0].id; const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -221,7 +225,7 @@ export default function ({ getService }: FtrProviderContext) { const rightNode = level0Nodes[2].id; const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -252,7 +256,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not return any nodes when the search index does not have any data', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, @@ -274,7 +278,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns all descendants for the origin without using the ancestry field', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 2, @@ -303,7 +307,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns all descendants for the origin using the ancestry field', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, // should be ignored when using the ancestry array @@ -333,7 +337,7 @@ export default function ({ getService }: FtrProviderContext) { it('should handle an invalid id', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 100, @@ -356,7 +360,7 @@ export default function ({ getService }: FtrProviderContext) { const childID = Array.from(tree.childrenLevels[0].values())[0].id; const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 1, @@ -389,7 +393,7 @@ export default function ({ getService }: FtrProviderContext) { const rightNodeID = level0Nodes[2].id; const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 6, descendantLevels: 0, @@ -422,7 +426,7 @@ export default function ({ getService }: FtrProviderContext) { expect(originGrandparent).to.not.be(''); const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 2, descendantLevels: 0, @@ -459,7 +463,7 @@ export default function ({ getService }: FtrProviderContext) { expect(originGrandparent).to.not.be(''); const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 6, descendantLevels: 1, @@ -495,7 +499,7 @@ export default function ({ getService }: FtrProviderContext) { ).toISOString(); const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 5, @@ -524,7 +528,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns all descendants and ancestors without the ancestry field and they should have the name field', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 10, @@ -562,7 +566,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns all descendants and ancestors without the ancestry field', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 10, @@ -600,7 +604,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns all descendants and ancestors with the ancestry field', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 100, descendantLevels: 10, @@ -638,7 +642,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns an empty response when limits are zero', async () => { const { body }: { body: ResolverNode[] } = await supertest .post('/api/endpoint/resolver/tree') - .set('kbn-xsrf', 'xxx') + .set(HEADERS) .send({ descendants: 0, descendantLevels: 0, diff --git a/x-pack/test/security_solution_endpoint_api_int/config.base.ts b/x-pack/test/security_solution_endpoint_api_int/config.base.ts new file mode 100644 index 0000000000000..039030e2a2230 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/config.base.ts @@ -0,0 +1,56 @@ +/* + * 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 { Config } from '@kbn/test'; +import { getRegistryUrlAsArray, createEndpointDockerConfig } from './registry'; +import { SUITE_TAGS } from '../security_solution_endpoint/config.base'; + +export const generateConfig = async ({ + baseConfig, + junitReportName, + kbnServerArgs = [], + target, + services, +}: { + baseConfig: Config; + junitReportName: string; + kbnServerArgs?: string[]; + target: keyof typeof SUITE_TAGS; + services: any; +}): Promise => { + return { + ...baseConfig.getAll(), + testFiles: [require.resolve('./apis')], + dockerServers: createEndpointDockerConfig(), + services, + junit: { + reportName: junitReportName, + }, + suiteTags: { + ...baseConfig.get('suiteTags'), + include: [...baseConfig.get('suiteTags.include'), ...SUITE_TAGS[target].include], + exclude: [...baseConfig.get('suiteTags.exclude'), ...SUITE_TAGS[target].exclude], + }, + kbnTestServer: { + ...baseConfig.get('kbnTestServer'), + serverArgs: [ + ...baseConfig.get('kbnTestServer.serverArgs'), + // if you return an empty string here the kibana server will not start properly but an empty array works + ...getRegistryUrlAsArray(), + // always install Endpoint package by default when Fleet sets up + `--xpack.fleet.packages.0.name=endpoint`, + `--xpack.fleet.packages.0.version=latest`, + // this will be removed in 8.7 when the file upload feature is released + `--xpack.fleet.enableExperimental.0=diagnosticFileUploadEnabled`, + // set any experimental feature flags for testing + `--xpack.securitySolution.enableExperimental=${JSON.stringify([])}`, + + ...kbnServerArgs, + ], + }, + }; +}; diff --git a/x-pack/test/security_solution_endpoint_api_int/config.ts b/x-pack/test/security_solution_endpoint_api_int/config.ts index 0f2f245378a3c..3789004aba497 100644 --- a/x-pack/test/security_solution_endpoint_api_int/config.ts +++ b/x-pack/test/security_solution_endpoint_api_int/config.ts @@ -6,34 +6,16 @@ */ import { FtrConfigProviderContext } from '@kbn/test'; -import { createEndpointDockerConfig, getRegistryUrlAsArray } from './registry'; +import { generateConfig } from './config.base'; import { services } from './services'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); - return { - ...xPackAPITestsConfig.getAll(), - testFiles: [require.resolve('./apis')], - dockerServers: createEndpointDockerConfig(), + return generateConfig({ + baseConfig: xPackAPITestsConfig, + junitReportName: 'X-Pack Endpoint API Integration Tests against ESS', + target: 'ess', services, - junit: { - reportName: 'X-Pack Endpoint API Integration Tests', - }, - kbnTestServer: { - ...xPackAPITestsConfig.get('kbnTestServer'), - serverArgs: [ - ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), - // if you return an empty string here the kibana server will not start properly but an empty array works - ...getRegistryUrlAsArray(), - // always install Endpoint package by default when Fleet sets up - `--xpack.fleet.packages.0.name=endpoint`, - `--xpack.fleet.packages.0.version=latest`, - // this will be removed in 8.7 when the file upload feature is released - `--xpack.fleet.enableExperimental.0=diagnosticFileUploadEnabled`, - // set any experimental feature flags for testing - `--xpack.securitySolution.enableExperimental=${JSON.stringify([])}`, - ], - }, - }; + }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/headers.ts b/x-pack/test/security_solution_endpoint_api_int/headers.ts new file mode 100644 index 0000000000000..e4ca6acfbbc65 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/headers.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export const HEADERS = Object.freeze({ + 'kbn-xsrf': 'security_solution', + 'x-elastic-internal-origin': 'security_solution', +}); diff --git a/x-pack/test/security_solution_endpoint_api_int/serverless.config.ts b/x-pack/test/security_solution_endpoint_api_int/serverless.config.ts new file mode 100644 index 0000000000000..262bf4dafa2f7 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/serverless.config.ts @@ -0,0 +1,24 @@ +/* + * 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 { FtrConfigProviderContext } from '@kbn/test'; +import { generateConfig } from './config.base'; +import { svlServices } from './services'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const serverlessTestsConfig = await readConfigFile( + require.resolve('../../test_serverless/shared/config.base.ts') + ); + + return generateConfig({ + baseConfig: serverlessTestsConfig, + junitReportName: 'X-Pack Endpoint API Integration Tests against Serverless', + target: 'serverless', + kbnServerArgs: ['--serverless=security'], + services: svlServices, + }); +} diff --git a/x-pack/test/security_solution_endpoint_api_int/services/index.ts b/x-pack/test/security_solution_endpoint_api_int/services/index.ts index e94e41f37b922..44a4354d928f5 100644 --- a/x-pack/test/security_solution_endpoint_api_int/services/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/services/index.ts @@ -5,6 +5,10 @@ * 2.0. */ +import { + KibanaSupertestWithCertProvider, + KibanaSupertestWithCertWithoutAuthProvider, +} from '../../security_solution_endpoint/services/supertest_with_cert'; import { services as xPackAPIServices } from '../../api_integration/services'; import { ResolverGeneratorProvider } from './resolver'; import { RolesUsersProvider } from './roles_users'; @@ -20,3 +24,10 @@ export const services = { endpointArtifactTestResources: EndpointArtifactsTestResources, rolesUsersProvider: RolesUsersProvider, }; + +export const svlServices = { + ...services, + + supertest: KibanaSupertestWithCertProvider, + supertestWithoutAuth: KibanaSupertestWithCertWithoutAuthProvider, +}; diff --git a/x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts b/x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts index baac39815b488..1d9c2a353a1f6 100644 --- a/x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts +++ b/x-pack/test/security_solution_endpoint_api_int/services/roles_users.ts @@ -5,49 +5,17 @@ * 2.0. */ -import type { Role } from '@kbn/security-plugin/common'; - -import { getT1Analyst } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/t1_analyst'; -import { getT2Analyst } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/t2_analyst'; -import { getHunter } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/hunter'; -import { getThreatIntelligenceAnalyst } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/threat_intelligence_analyst'; -import { getDetectionsEngineer } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/detections_engineer'; -import { getSocManager } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/soc_manager'; -import { getPlatformEngineer } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/platform_engineer'; -import { getEndpointOperationsAnalyst } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/endpoint_operations_analyst'; -import { getEndpointSecurityPolicyManager } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/endpoint_security_policy_manager'; -import { getWithResponseActionsRole } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/with_response_actions_role'; -import { getWithArtifactReadPrivilegesRole } from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users/with_artifact_read_privileges_role'; +import { + EndpointSecurityRoleNames, + ENDPOINT_SECURITY_ROLE_NAMES, + getAllEndpointSecurityRoles, +} from '@kbn/security-solution-plugin/scripts/endpoint/common/roles_users'; import { FtrProviderContext } from '../ftr_provider_context'; -export enum ROLE { - t1_analyst = 't1Analyst', - t2_analyst = 't2Analyst', - analyst_hunter = 'hunter', - threat_intelligence_analyst = 'threatIntelligenceAnalyst', - detections_engineer = 'detectionsEngineer', - soc_manager = 'socManager', - platform_engineer = 'platformEngineer', - endpoint_operations_analyst = 'endpointOperationsAnalyst', - endpoint_security_policy_manager = 'endpointSecurityPolicyManager', - response_actions_role = 'executeResponseActions', - artifact_read_role = 'artifactReadRole', -} +export const ROLE = ENDPOINT_SECURITY_ROLE_NAMES; -const rolesMapping: { [key in ROLE]: Omit } = { - t1Analyst: getT1Analyst(), - t2Analyst: getT2Analyst(), - hunter: getHunter(), - threatIntelligenceAnalyst: getThreatIntelligenceAnalyst(), - detectionsEngineer: getDetectionsEngineer(), - socManager: getSocManager(), - platformEngineer: getPlatformEngineer(), - endpointOperationsAnalyst: getEndpointOperationsAnalyst(), - endpointSecurityPolicyManager: getEndpointSecurityPolicyManager(), - executeResponseActions: getWithResponseActionsRole(), - artifactReadRole: getWithArtifactReadPrivilegesRole(), -}; +const rolesMapping = getAllEndpointSecurityRoles(); export function RolesUsersProvider({ getService }: FtrProviderContext) { const security = getService('security'); @@ -76,7 +44,7 @@ export function RolesUsersProvider({ getService }: FtrProviderContext) { * @param options */ async createRole(options: { - predefinedRole?: ROLE; + predefinedRole?: EndpointSecurityRoleNames; extraPrivileges?: string[]; customRole?: { roleName: string; extraPrivileges: string[] }; }): Promise { From e0da2ae3da8bb59b8889c35ecf40e30042768339 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 9 Nov 2023 09:47:59 -0500 Subject: [PATCH 05/51] skip failing test suite (#156941) --- x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts b/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts index 2ba688dfb8bf5..892f89f7c2bb6 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts @@ -15,7 +15,8 @@ export default function (providerContext: FtrProviderContext) { * There are a few features that are only currently supported for the Endpoint * package due to security concerns. */ - describe('Install endpoint package', () => { + // Failing: See https://github.com/elastic/kibana/issues/156941 + describe.skip('Install endpoint package', () => { const { getService } = providerContext; skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); From b9c08bac92f60495a87149f6a49624aef49ce137 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 9 Nov 2023 08:26:25 -0700 Subject: [PATCH 06/51] [SLO] Add support for document count to custom metric indicator (#170913) ## :cherries: Summary This PR fixes #170905 by adding the aggregation menu to the Custom Metric indicator to allow the user to pick either `doc_count` or `sum` for the aggregation. image --- .../kbn-slo-schema/src/schema/indicators.ts | 39 +++--- .../custom_metric/metric_indicator.tsx | 121 +++++++++++++++--- .../timeslice_metric/metric_input.tsx | 2 +- .../slo_edit/helpers/aggregation_options.ts | 4 + .../hooks/use_section_form_validation.ts | 24 +++- ..._metric_indicator_aggregation.test.ts.snap | 12 +- ...get_custom_metric_indicator_aggregation.ts | 23 +++- .../__snapshots__/metric_custom.test.ts.snap | 74 ++++++++--- .../metric_custom.test.ts | 42 ++++++ .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 12 files changed, 274 insertions(+), 73 deletions(-) diff --git a/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts b/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts index f8d795275acc6..c6748eba37968 100644 --- a/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts +++ b/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts @@ -136,22 +136,29 @@ const timesliceMetricIndicatorSchema = t.type({ ]), }); -const metricCustomValidAggregations = t.keyof({ - sum: true, -}); +const metricCustomDocCountMetric = t.intersection([ + t.type({ + name: t.string, + aggregation: t.literal('doc_count'), + }), + t.partial({ + filter: t.string, + }), +]); + +const metricCustomBasicMetric = t.intersection([ + t.type({ + name: t.string, + aggregation: t.literal('sum'), + field: t.string, + }), + t.partial({ + filter: t.string, + }), +]); + const metricCustomMetricDef = t.type({ - metrics: t.array( - t.intersection([ - t.type({ - name: t.string, - aggregation: metricCustomValidAggregations, - field: t.string, - }), - t.partial({ - filter: t.string, - }), - ]) - ), + metrics: t.array(t.union([metricCustomBasicMetric, metricCustomDocCountMetric])), equation: t.string, }); const metricCustomIndicatorTypeSchema = t.literal('sli.metric.custom'); @@ -267,6 +274,8 @@ export { kqlCustomIndicatorTypeSchema, metricCustomIndicatorSchema, metricCustomIndicatorTypeSchema, + metricCustomDocCountMetric, + metricCustomBasicMetric, timesliceMetricComparatorMapping, timesliceMetricIndicatorSchema, timesliceMetricIndicatorTypeSchema, diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx index ec413f46df5dd..262e6e6d2249a 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx @@ -22,6 +22,10 @@ import { first, range, xor } from 'lodash'; import React, { useEffect, useState } from 'react'; import { Controller, useFieldArray, useFormContext } from 'react-hook-form'; import { Field } from '../../../../hooks/slo/use_fetch_index_pattern_fields'; +import { + aggValueToLabel, + CUSTOM_METRIC_AGGREGATION_OPTIONS, +} from '../../helpers/aggregation_options'; import { createOptionsFromFields, Option } from '../../helpers/create_options'; import { CreateSLOForm } from '../../types'; import { QueryBuilder } from '../common/query_builder'; @@ -62,7 +66,8 @@ const metricTooltip = ( content={i18n.translate( 'xpack.observability.slo.sloEdit.sliType.customMetric.totalMetric.tooltip', { - defaultMessage: 'This data from this field will be aggregated with the "sum" aggregation.', + defaultMessage: + 'This data from this field will be aggregated with the "sum" aggregation or document count.', } )} position="top" @@ -89,6 +94,7 @@ const equationTooltip = ( export function MetricIndicator({ type, metricFields, isLoadingIndex }: MetricIndicatorProps) { const { control, watch, setValue, register, getFieldState } = useFormContext(); const [options, setOptions] = useState(createOptionsFromFields(metricFields)); + const [aggregationOptions, setAggregationOptions] = useState(CUSTOM_METRIC_AGGREGATION_OPTIONS); useEffect(() => { setOptions(createOptionsFromFields(metricFields)); @@ -131,20 +137,25 @@ export function MetricIndicator({ type, metricFields, isLoadingIndex }: MetricIn {fields?.map((metric, index) => ( - - {metricLabel} {metric.name} {metricTooltip} + {i18n.translate( + 'xpack.observability.slo.sloEdit.customMetric.aggregationLabel', + { defaultMessage: 'Aggregation' } + )}{' '} + {metric.name} } > ( @@ -153,17 +164,13 @@ export function MetricIndicator({ type, metricFields, isLoadingIndex }: MetricIn async fullWidth singleSelection={{ asPlainText: true }} - prepend={i18n.translate( - 'xpack.observability.slo.sloEdit.sliType.customMetric.sumLabel', - { defaultMessage: 'Sum of' } - )} placeholder={i18n.translate( - 'xpack.observability.slo.sloEdit.sliType.customMetric.metricField.placeholder', - { defaultMessage: 'Select a metric field' } + 'xpack.observability.slo.sloEdit.sliType.customMetric.aggregation.placeholder', + { defaultMessage: 'Select an aggregation' } )} aria-label={i18n.translate( - 'xpack.observability.slo.sloEdit.sliType.customMetric.metricField.placeholder', - { defaultMessage: 'Select a metric field' } + 'xpack.observability.slo.sloEdit.sliType.customMetric.aggregation.placeholder', + { defaultMessage: 'Select an aggregation' } )} isClearable isInvalid={fieldState.invalid} @@ -178,40 +185,112 @@ export function MetricIndicator({ type, metricFields, isLoadingIndex }: MetricIn selectedOptions={ !!indexPattern && !!field.value && - metricFields.some((metricField) => metricField.name === field.value) + CUSTOM_METRIC_AGGREGATION_OPTIONS.some((agg) => agg.value === field.value) ? [ { value: field.value, - label: field.value, + label: aggValueToLabel(field.value), }, ] : [] } onSearchChange={(searchValue: string) => { - setOptions( - createOptionsFromFields(metricFields, ({ value }) => + setAggregationOptions( + CUSTOM_METRIC_AGGREGATION_OPTIONS.filter(({ value }) => value.includes(searchValue) ) ); }} - options={options} + options={aggregationOptions} /> )} /> + {watch(`indicator.params.${type}.metrics.${index}.aggregation`) !== 'doc_count' && ( + + + {metricLabel} {metric.name} {metricTooltip} + + } + > + ( + { + if (selected.length) { + return field.onChange(selected[0].value); + } + field.onChange(''); + }} + selectedOptions={ + !!indexPattern && + !!field.value && + metricFields.some((metricField) => metricField.name === field.value) + ? [ + { + value: field.value, + label: field.value, + }, + ] + : [] + } + onSearchChange={(searchValue: string) => { + setOptions( + createOptionsFromFields(metricFields, ({ value }) => + value.includes(searchValue) + ) + ); + }} + options={options} + /> + )} + /> + + + )} agg.value === agg.value) + AGGREGATION_OPTIONS.some((agg) => agg.value === field.value) ? [ { value: field.value, diff --git a/x-pack/plugins/observability/public/pages/slo_edit/helpers/aggregation_options.ts b/x-pack/plugins/observability/public/pages/slo_edit/helpers/aggregation_options.ts index 4a3a5fb9cf28a..ab27dcd68efe5 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/helpers/aggregation_options.ts +++ b/x-pack/plugins/observability/public/pages/slo_edit/helpers/aggregation_options.ts @@ -75,6 +75,10 @@ export const AGGREGATION_OPTIONS = [ }, ]; +export const CUSTOM_METRIC_AGGREGATION_OPTIONS = AGGREGATION_OPTIONS.filter((option) => + ['doc_count', 'sum'].includes(option.value) +); + export function aggValueToLabel(value: string) { const aggregation = AGGREGATION_OPTIONS.find((agg) => agg.value === value); if (aggregation) { diff --git a/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_section_form_validation.ts b/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_section_form_validation.ts index 6fede4552d6f8..e8cabe602e7cc 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_section_form_validation.ts +++ b/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_section_form_validation.ts @@ -6,6 +6,8 @@ */ import { + metricCustomBasicMetric, + metricCustomDocCountMetric, MetricCustomIndicator, timesliceMetricBasicMetricWithField, TimesliceMetricIndicator, @@ -31,7 +33,16 @@ export function useSectionFormValidation({ getFieldState, getValues, formState, const data = getValues('indicator.params.good') as MetricCustomIndicator['params']['good']; const isEquationValid = !getFieldState('indicator.params.good.equation').invalid; const areMetricsValid = - isObject(data) && (data.metrics ?? []).every((metric) => Boolean(metric.field)); + isObject(data) && + (data.metrics ?? []).every((metric) => { + if (metricCustomDocCountMetric.is(metric)) { + return true; + } + if (metricCustomBasicMetric.is(metric) && metric.field != null) { + return true; + } + return false; + }); return isEquationValid && areMetricsValid; }; @@ -41,7 +52,16 @@ export function useSectionFormValidation({ getFieldState, getValues, formState, ) as MetricCustomIndicator['params']['total']; const isEquationValid = !getFieldState('indicator.params.total.equation').invalid; const areMetricsValid = - isObject(data) && (data.metrics ?? []).every((metric) => Boolean(metric.field)); + isObject(data) && + (data.metrics ?? []).every((metric) => { + if (metricCustomDocCountMetric.is(metric)) { + return true; + } + if (metricCustomBasicMetric.is(metric) && metric.field != null) { + return true; + } + return false; + }); return isEquationValid && areMetricsValid; }; diff --git a/x-pack/plugins/observability/server/services/slo/aggregations/__snapshots__/get_custom_metric_indicator_aggregation.test.ts.snap b/x-pack/plugins/observability/server/services/slo/aggregations/__snapshots__/get_custom_metric_indicator_aggregation.test.ts.snap index f5558a33f1981..6bf8f0ad13e56 100644 --- a/x-pack/plugins/observability/server/services/slo/aggregations/__snapshots__/get_custom_metric_indicator_aggregation.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/aggregations/__snapshots__/get_custom_metric_indicator_aggregation.test.ts.snap @@ -4,7 +4,7 @@ exports[`GetHistogramIndicatorAggregation should generate a aggregation for good Object { "_good_A": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "total", }, @@ -16,7 +16,7 @@ Object { }, "_good_B": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "processed", }, @@ -29,8 +29,8 @@ Object { "goodEvents": Object { "bucket_script": Object { "buckets_path": Object { - "A": "_good_A>sum", - "B": "_good_B>sum", + "A": "_good_A>metric", + "B": "_good_B>metric", }, "script": Object { "lang": "painless", @@ -45,7 +45,7 @@ exports[`GetHistogramIndicatorAggregation should generate a aggregation for tota Object { "_total_A": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "total", }, @@ -58,7 +58,7 @@ Object { "totalEvents": Object { "bucket_script": Object { "buckets_path": Object { - "A": "_total_A>sum", + "A": "_total_A>metric", }, "script": Object { "lang": "painless", diff --git a/x-pack/plugins/observability/server/services/slo/aggregations/get_custom_metric_indicator_aggregation.ts b/x-pack/plugins/observability/server/services/slo/aggregations/get_custom_metric_indicator_aggregation.ts index 73bbb91b1041f..6c3439eb9a146 100644 --- a/x-pack/plugins/observability/server/services/slo/aggregations/get_custom_metric_indicator_aggregation.ts +++ b/x-pack/plugins/observability/server/services/slo/aggregations/get_custom_metric_indicator_aggregation.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MetricCustomIndicator } from '@kbn/slo-schema'; +import { metricCustomDocCountMetric, MetricCustomIndicator } from '@kbn/slo-schema'; import { getElastichsearchQueryOrThrow } from '../transform_generators'; type MetricCustomMetricDef = @@ -20,12 +20,22 @@ export class GetCustomMetricIndicatorAggregation { const filter = metric.filter ? getElastichsearchQueryOrThrow(metric.filter) : { match_all: {} }; + + if (metricCustomDocCountMetric.is(metric)) { + return { + ...acc, + [`_${type}_${metric.name}`]: { + filter, + }, + }; + } + return { ...acc, [`_${type}_${metric.name}`]: { filter, aggs: { - sum: { + metric: { [metric.aggregation]: { field: metric.field }, }, }, @@ -42,10 +52,11 @@ export class GetCustomMetricIndicatorAggregation { } private buildMetricEquation(type: 'good' | 'total', metricDef: MetricCustomMetricDef) { - const bucketsPath = metricDef.metrics.reduce( - (acc, metric) => ({ ...acc, [metric.name]: `_${type}_${metric.name}>sum` }), - {} - ); + const bucketsPath = metricDef.metrics.reduce((acc, metric) => { + const path = metricCustomDocCountMetric.is(metric) ? '_count' : 'metric'; + return { ...acc, [metric.name]: `_${type}_${metric.name}>${path}` }; + }, {}); + return { bucket_script: { buckets_path: bucketsPath, diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap index 7c1765953d154..55ed414bd2ec7 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap @@ -1,10 +1,38 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Metric Custom Transform Generator aggregates using doc_count for the denominator equation with filter 1`] = ` +Object { + "bucket_script": Object { + "buckets_path": Object { + "A": "_total_A>_count", + }, + "script": Object { + "lang": "painless", + "source": "params.A / 100", + }, + }, +} +`; + +exports[`Metric Custom Transform Generator aggregates using doc_count the numerator equation with filter 1`] = ` +Object { + "bucket_script": Object { + "buckets_path": Object { + "A": "_good_A>_count", + }, + "script": Object { + "lang": "painless", + "source": "params.A * 100", + }, + }, +} +`; + exports[`Metric Custom Transform Generator aggregates using the denominator equation 1`] = ` Object { "bucket_script": Object { "buckets_path": Object { - "A": "_total_A>sum", + "A": "_total_A>metric", }, "script": Object { "lang": "painless", @@ -18,7 +46,7 @@ exports[`Metric Custom Transform Generator aggregates using the denominator equa Object { "bucket_script": Object { "buckets_path": Object { - "A": "_total_A>sum", + "A": "_total_A>metric", }, "script": Object { "lang": "painless", @@ -32,7 +60,7 @@ exports[`Metric Custom Transform Generator aggregates using the numerator equati Object { "bucket_script": Object { "buckets_path": Object { - "A": "_good_A>sum", + "A": "_good_A>metric", }, "script": Object { "lang": "painless", @@ -46,7 +74,7 @@ exports[`Metric Custom Transform Generator aggregates using the numerator equati Object { "bucket_script": Object { "buckets_path": Object { - "A": "_good_A>sum", + "A": "_good_A>metric", }, "script": Object { "lang": "painless", @@ -101,7 +129,7 @@ Object { "aggregations": Object { "_good_A": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "total", }, @@ -113,7 +141,7 @@ Object { }, "_good_B": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "processed", }, @@ -125,7 +153,7 @@ Object { }, "_total_A": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "total", }, @@ -138,7 +166,7 @@ Object { "slo.denominator": Object { "bucket_script": Object { "buckets_path": Object { - "A": "_total_A>sum", + "A": "_total_A>metric", }, "script": Object { "lang": "painless", @@ -158,8 +186,8 @@ Object { "slo.numerator": Object { "bucket_script": Object { "buckets_path": Object { - "A": "_good_A>sum", - "B": "_good_B>sum", + "A": "_good_A>metric", + "B": "_good_B>metric", }, "script": Object { "lang": "painless", @@ -384,7 +412,7 @@ Object { "aggregations": Object { "_good_A": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "total", }, @@ -396,7 +424,7 @@ Object { }, "_good_B": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "processed", }, @@ -408,7 +436,7 @@ Object { }, "_total_A": Object { "aggs": Object { - "sum": Object { + "metric": Object { "sum": Object { "field": "total", }, @@ -421,7 +449,7 @@ Object { "slo.denominator": Object { "bucket_script": Object { "buckets_path": Object { - "A": "_total_A>sum", + "A": "_total_A>metric", }, "script": Object { "lang": "painless", @@ -432,8 +460,8 @@ Object { "slo.numerator": Object { "bucket_script": Object { "buckets_path": Object { - "A": "_good_A>sum", - "B": "_good_B>sum", + "A": "_good_A>metric", + "B": "_good_B>metric", }, "script": Object { "lang": "painless", @@ -629,3 +657,17 @@ Object { "transform_id": Any, } `; + +exports[`Metric Custom Transform Generator support the same field used twice in the equation 1`] = ` +Object { + "bucket_script": Object { + "buckets_path": Object { + "A": "_good_A>metric", + }, + "script": Object { + "lang": "painless", + "source": "params.A + params.A * 100", + }, + }, +} +`; diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.test.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.test.ts index beea8164b1c99..69685bad0c09e 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.test.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.test.ts @@ -142,6 +142,20 @@ describe('Metric Custom Transform Generator', () => { expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); + it('support the same field used twice in the equation', async () => { + const anSLO = createSLO({ + indicator: createMetricCustomIndicator({ + good: { + metrics: [{ name: 'A', aggregation: 'sum', field: 'good' }], + equation: 'A + A * 100', + }, + }), + }); + const transform = generator.getTransformParams(anSLO); + + expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); + }); + it('aggregates using the numerator equation with filter', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ @@ -158,6 +172,20 @@ describe('Metric Custom Transform Generator', () => { expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); + it('aggregates using doc_count the numerator equation with filter', async () => { + const anSLO = createSLO({ + indicator: createMetricCustomIndicator({ + good: { + metrics: [{ name: 'A', aggregation: 'doc_count', filter: 'outcome: "success" ' }], + equation: 'A * 100', + }, + }), + }); + const transform = generator.getTransformParams(anSLO); + + expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); + }); + it('aggregates using the denominator equation', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ @@ -185,4 +213,18 @@ describe('Metric Custom Transform Generator', () => { expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); + + it('aggregates using doc_count for the denominator equation with filter', async () => { + const anSLO = createSLO({ + indicator: createMetricCustomIndicator({ + total: { + metrics: [{ name: 'A', aggregation: 'doc_count', filter: 'outcome: *' }], + equation: 'A / 100', + }, + }), + }); + const transform = generator.getTransformParams(anSLO); + + expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); + }); }); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index d00b542c58131..6c64ec463940e 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -29682,12 +29682,10 @@ "xpack.observability.slo.sloEdit.sliType.customMetric.equationHelpText": "Accepte les équations mathématiques de base, les caractères valides sont : A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, =", "xpack.observability.slo.sloEdit.sliType.customMetric.equationLabel": "Équation", "xpack.observability.slo.sloEdit.sliType.customMetric.filterLabel": "Filtre", - "xpack.observability.slo.sloEdit.sliType.customMetric.goodQuery.tooltip": "Cette requête KQL doit renvoyer un sous-ensemble d'événements.", "xpack.observability.slo.sloEdit.sliType.customMetric.goodTitle": "Bons événements", "xpack.observability.slo.sloEdit.sliType.customMetric.metricField.placeholder": "Sélectionner un champ d’indicateur", "xpack.observability.slo.sloEdit.sliType.customMetric.metricLabel": "Indicateur", "xpack.observability.slo.sloEdit.sliType.customMetric.queryFilter": "Filtre de requête", - "xpack.observability.slo.sloEdit.sliType.customMetric.sumLabel": "Somme de", "xpack.observability.slo.sloEdit.sliType.customMetric.totalEquation.tooltip": "Ceci est compatible avec des calculs de base (A + B / C) et la logique booléenne (A < B ? A : B).", "xpack.observability.slo.sloEdit.sliType.customMetric.totalMetric.tooltip": "Les données de ce champ seront agrégées avec l’agréation de \"somme\".", "xpack.observability.slo.sloEdit.sliType.customMetric.totalTitle": "Total des événements", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 1ce0c2df38db5..a24d4d8cc7c10 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -29681,12 +29681,10 @@ "xpack.observability.slo.sloEdit.sliType.customMetric.equationHelpText": "基本的な数式をサポートします。有効な文字:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=", "xpack.observability.slo.sloEdit.sliType.customMetric.equationLabel": "式", "xpack.observability.slo.sloEdit.sliType.customMetric.filterLabel": "フィルター", - "xpack.observability.slo.sloEdit.sliType.customMetric.goodQuery.tooltip": "このKQLクエリはイベントのサブセットを返します。", "xpack.observability.slo.sloEdit.sliType.customMetric.goodTitle": "良好なイベント数", "xpack.observability.slo.sloEdit.sliType.customMetric.metricField.placeholder": "メトリックフィールドを選択", "xpack.observability.slo.sloEdit.sliType.customMetric.metricLabel": "メトリック", "xpack.observability.slo.sloEdit.sliType.customMetric.queryFilter": "クエリのフィルター", - "xpack.observability.slo.sloEdit.sliType.customMetric.sumLabel": "の合計", "xpack.observability.slo.sloEdit.sliType.customMetric.totalEquation.tooltip": "これは基本的な数学ロジック(A + B / C)とブールロジック(A < B ?A :B)をサポートします。", "xpack.observability.slo.sloEdit.sliType.customMetric.totalMetric.tooltip": "このフィールドのデータは「sum」集計で集約されます。", "xpack.observability.slo.sloEdit.sliType.customMetric.totalTitle": "合計イベント数", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 2fd8d38a579a5..d9aaa9c724465 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -29679,12 +29679,10 @@ "xpack.observability.slo.sloEdit.sliType.customMetric.equationHelpText": "支持基本数学方程,有效字符包括:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=", "xpack.observability.slo.sloEdit.sliType.customMetric.equationLabel": "方程", "xpack.observability.slo.sloEdit.sliType.customMetric.filterLabel": "筛选", - "xpack.observability.slo.sloEdit.sliType.customMetric.goodQuery.tooltip": "此 KQL 查询应返回一个事件子集。", "xpack.observability.slo.sloEdit.sliType.customMetric.goodTitle": "良好事件", "xpack.observability.slo.sloEdit.sliType.customMetric.metricField.placeholder": "选择指标字段", "xpack.observability.slo.sloEdit.sliType.customMetric.metricLabel": "指标", "xpack.observability.slo.sloEdit.sliType.customMetric.queryFilter": "查询筛选", - "xpack.observability.slo.sloEdit.sliType.customMetric.sumLabel": "求和", "xpack.observability.slo.sloEdit.sliType.customMetric.totalEquation.tooltip": "这支持基本数学 (A + B / C) 和布尔逻辑 (A < B ?A :B)。", "xpack.observability.slo.sloEdit.sliType.customMetric.totalMetric.tooltip": "来自该字段的此类数据将使用“求和”聚合进行汇总。", "xpack.observability.slo.sloEdit.sliType.customMetric.totalTitle": "事件合计", From 397061aebcca23b22d052cf240e566ca25dcc34d Mon Sep 17 00:00:00 2001 From: dkirchan <55240027+dkirchan@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:27:02 +0200 Subject: [PATCH 07/51] FTR Api Integration with the Second Security Quality Gate (#169422) ## Summary FTR Api Integration tests for Security Solution are now integrated with the Second Security Quality Gate. The tests are running in 5 scripts in `x-pack/test/security_solution_api_integration/package.json`. Each different script is creating its own task in buildkite so 5 scripts could be running in parallel, depending on the agents availability, however they all target the same environment for this first integration. Future needs: - The FTR runner serverless is needed to be introduced. ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Jon --- .../security_solution/api_integration.yml | 67 +++++++++++++++ .../api-integration-tests.sh | 82 +++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 .buildkite/pipelines/security_solution/api_integration.yml create mode 100755 .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh diff --git a/.buildkite/pipelines/security_solution/api_integration.yml b/.buildkite/pipelines/security_solution/api_integration.yml new file mode 100644 index 0000000000000..b4c6cece31c4b --- /dev/null +++ b/.buildkite/pipelines/security_solution/api_integration.yml @@ -0,0 +1,67 @@ +steps: + - label: Running exception_workflows:runner:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_workflows:qa:serverless + key: exception_workflows:runner:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '*' + limit: 2 + + - label: Running exception_operators_date_numeric_types:runner:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_date_numeric_types:qa:serverless + key: exception_operators_date_numeric_types:runner:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '*' + limit: 2 + + - label: Running exception_operators_keyword_text_long:runner:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_keyword_text_long:qa:serverless + key: exception_operators_keyword_text_long:runner:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '*' + limit: 2 + + - label: Running exception_operators_ips_text_array:runner:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_ips_text_array:qa:serverless + key: exception_operators_ips_text_array:runner:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running rule_creation:runner:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh rule_creation:qa:serverless + key: rule_creation:runner:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running actions:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh actions:qa:serverless + key: actions:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + diff --git a/.buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh b/.buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh new file mode 100755 index 0000000000000..ad7e488dfaea3 --- /dev/null +++ b/.buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh @@ -0,0 +1,82 @@ +#!/bin/bash +if [ -z "$1" ] + then + echo "No target script from the package.json file, is supplied" + exit 1 +fi + +source .buildkite/scripts/common/util.sh +.buildkite/scripts/bootstrap.sh + +buildkite-agent meta-data set "${BUILDKITE_JOB_ID}_is_test_execution_step" "true" + +echo "--- Serverless Security Second Quality Gate" +cd x-pack/test/security_solution_api_integration +set +e + +QA_API_KEY=$(retry 5 5 vault read -field=qa_api_key secret/kibana-issues/dev/security-solution-qg-enc-key) + +# Generate a random 5-digit number +random_number=$((10000 + $RANDOM % 90000)) +ENVIRONMENT_DETAILS=$(curl --location 'https://global.qa.cld.elstc.co/api/v1/serverless/projects/security' \ + --header "Authorization: ApiKey $QA_API_KEY" \ + --header 'Content-Type: application/json' \ + --data '{ + "name": "ftr-integration-tests-'$random_number'", + "region_id": "aws-eu-west-1"}' | jq '.') +NAME=$(echo $ENVIRONMENT_DETAILS | jq -r '.name') +ID=$(echo $ENVIRONMENT_DETAILS | jq -r '.id') +ES_URL=$(echo $ENVIRONMENT_DETAILS | jq -r '.endpoints.elasticsearch') +KB_URL=$(echo $ENVIRONMENT_DETAILS | jq -r '.endpoints.kibana') + +# Wait five seconds for the project to appear +sleep 5 + +# Resetting the credentials of the elastic user in the project +CREDS_BODY=$(curl -s --location --request POST "https://global.qa.cld.elstc.co/api/v1/serverless/projects/security/$ID/_reset-credentials" \ + --header "Authorization: ApiKey $QA_API_KEY" \ + --header 'Content-Type: application/json' | jq '.') +USERNAME=$(echo $CREDS_BODY | jq -r '.username') +PASSWORD=$(echo $CREDS_BODY | jq -r '.password') +AUTH=$(echo "$USERNAME:$PASSWORD") + +# Checking if Elasticsearch has status green +while : ; do + STATUS=$(curl -u $AUTH --location "$ES_URL:443/_cluster/health?wait_for_status=green&timeout=50s" | jq -r '.status') + if [ "$STATUS" != "green" ]; then + echo "Sleeping for 40s to wait for ES status to be green..." + sleep 40 + else + echo "Elasticsearch has status green." + break + fi +done + +# Checking if Kibana is available +while : ; do + STATUS=$(curl -u $AUTH --location "$KB_URL:443/api/status" | jq -r '.status.overall.level') + if [ "$STATUS" != "available" ]; then + echo "Sleeping for 15s to wait for Kibana to be available..." + sleep 15 + else + echo "Kibana is available." + break + fi +done + +# Removing the https:// part of the url provided in order to use it in the command below. +FORMATTED_ES_URL="${ES_URL/https:\/\//}" +FORMATTED_KB_URL="${KB_URL/https:\/\//}" + +# Find a way to remove this in the future +# This is used in order to wait for the environment to be ready. +sleep 150 + +TEST_CLOUD=1 TEST_ES_URL="https://elastic:$PASSWORD@$FORMATTED_ES_URL:443" TEST_KIBANA_URL="https://elastic:$PASSWORD@$FORMATTED_KB_URL:443" yarn run $1 +cmd_status=$? +echo "Exit code with status: $cmd_status" + +curl --location --request DELETE "https://global.qa.cld.elstc.co/api/v1/serverless/projects/security/$ID" \ + --header "Authorization: ApiKey $QA_API_KEY" + +exit $cmd_status \ No newline at end of file From 91c50c2873829f3f9f1e4606ea46991df0edd7ec Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Thu, 9 Nov 2023 16:14:54 +0000 Subject: [PATCH 08/51] [ML] Kibana context types clean up (#170868) Corrects the types describing the services added to ML's kibana context. Most of the churn here is me alphabetically sorting the lists of dependencies. Also Removes `appName` from the context as it was never actually set. In the places where it was being used I've switched to our `PLUGIN_ID` --- .../aiops/change_point_detection.tsx | 14 +-- .../application/aiops/log_categorization.tsx | 8 +- .../application/aiops/log_rate_analysis.tsx | 8 +- x-pack/plugins/ml/public/application/app.tsx | 38 ++++---- .../contexts/kibana/kibana_context.ts | 38 ++++---- .../exploration_query_bar.tsx | 16 +--- .../explorer_query_bar/explorer_query_bar.tsx | 4 +- x-pack/plugins/ml/public/plugin.ts | 86 +++++++++---------- 8 files changed, 103 insertions(+), 109 deletions(-) diff --git a/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx b/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx index 551e19a264463..3919f9f9e5ccd 100644 --- a/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx +++ b/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx @@ -51,22 +51,22 @@ export const ChangePointDetectionPage: FC = () => { appDependencies={{ ...pick(services, [ 'application', + 'cases', + 'charts', 'data', + 'embeddable', 'executionContext', - 'charts', 'fieldFormats', 'http', + 'i18n', + 'lens', 'notifications', + 'presentationUtil', 'share', 'storage', + 'theme', 'uiSettings', 'unifiedSearch', - 'theme', - 'lens', - 'presentationUtil', - 'embeddable', - 'cases', - 'i18n', 'usageCollection', ]), fieldStats: { useFieldStatsTrigger, FieldStatsFlyoutProvider }, diff --git a/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx b/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx index 22fd99136d6ab..455ff9bfc1377 100644 --- a/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx +++ b/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx @@ -45,19 +45,19 @@ export const LogCategorizationPage: FC = () => { showFrozenDataTierChoice={showNodeInfo} appDependencies={pick(services, [ 'application', + 'charts', 'data', 'executionContext', - 'charts', 'fieldFormats', 'http', + 'i18n', + 'lens', 'notifications', 'share', 'storage', + 'theme', 'uiSettings', 'unifiedSearch', - 'theme', - 'lens', - 'i18n', ])} /> )} diff --git a/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx b/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx index 6cc12921accad..c20264a129ea3 100644 --- a/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx +++ b/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx @@ -48,19 +48,19 @@ export const LogRateAnalysisPage: FC = () => { showFrozenDataTierChoice={showNodeInfo} appDependencies={pick(services, [ 'application', + 'charts', 'data', 'executionContext', - 'charts', 'fieldFormats', 'http', + 'i18n', + 'lens', 'notifications', 'share', 'storage', + 'theme', 'uiSettings', 'unifiedSearch', - 'theme', - 'lens', - 'i18n', ])} /> )} diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index 843f277c11eb5..449f03d81b9fd 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -32,10 +32,11 @@ import { mlApiServicesProvider } from './services/ml_api_service'; import { HttpService } from './services/http_service'; import type { PageDependencies } from './routing/router'; import { EnabledFeaturesContextProvider } from './contexts/ml'; +import type { StartServices } from './contexts/kibana'; export type MlDependencies = Omit< MlSetupDependencies, - 'share' | 'fieldFormats' | 'maps' | 'cases' | 'licensing' + 'share' | 'fieldFormats' | 'maps' | 'cases' | 'licensing' | 'uiActions' > & MlStartDependencies; @@ -78,31 +79,32 @@ const App: FC = ({ coreStart, deps, appMountParams, isServerless, mlFe setBreadcrumbs: coreStart.chrome!.setBreadcrumbs, }; - const services = useMemo(() => { + const services: StartServices = useMemo(() => { return { - kibanaVersion: deps.kibanaVersion, - share: deps.share, + cases: deps.cases, + charts: deps.charts, + contentManagement: deps.contentManagement, + dashboard: deps.dashboard, data: deps.data, dataViewEditor: deps.dataViewEditor, - security: deps.security, - licenseManagement: deps.licenseManagement, - storage: localStorage, - embeddable: deps.embeddable, - maps: deps.maps, - triggersActionsUi: deps.triggersActionsUi, + dataViews: deps.data.dataViews, dataVisualizer: deps.dataVisualizer, - usageCollection: deps.usageCollection, + embeddable: deps.embeddable, fieldFormats: deps.fieldFormats, - dashboard: deps.dashboard, - charts: deps.charts, - cases: deps.cases, - unifiedSearch: deps.unifiedSearch, - licensing: deps.licensing, + kibanaVersion: deps.kibanaVersion, lens: deps.lens, + licenseManagement: deps.licenseManagement, + maps: deps.maps, + presentationUtil: deps.presentationUtil, savedObjectsManagement: deps.savedObjectsManagement, savedSearch: deps.savedSearch, - contentManagement: deps.contentManagement, - presentationUtil: deps.presentationUtil, + security: deps.security, + share: deps.share, + storage: localStorage, + triggersActionsUi: deps.triggersActionsUi, + uiActions: deps.uiActions, + unifiedSearch: deps.unifiedSearch, + usageCollection: deps.usageCollection, ...coreStart, mlServices: getMlGlobalServices(coreStart.http, deps.usageCollection), }; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts index 3e999cb1d8aa4..29fdc7dc2f5b3 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts @@ -10,7 +10,7 @@ import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { useKibana, KibanaReactContextValue } from '@kbn/kibana-react-plugin/public'; -import type { SecurityPluginSetup } from '@kbn/security-plugin/public'; +import type { SecurityPluginStart } from '@kbn/security-plugin/public'; import type { LicenseManagementUIPluginSetup } from '@kbn/license-management-plugin/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; @@ -18,7 +18,6 @@ import type { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import type { MapsStartApi } from '@kbn/maps-plugin/public'; import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/public'; import type { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui-plugin/public'; -import type { FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; @@ -30,33 +29,34 @@ import type { ContentManagementPublicStart } from '@kbn/content-management-plugi import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; +import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import type { MlServicesContext } from '../../app'; interface StartPlugins { + cases?: CasesUiStart; + charts: ChartsPluginStart; + contentManagement: ContentManagementPublicStart; + dashboard: DashboardStart; data: DataPublicPluginStart; dataViewEditor: DataViewEditorStart; dataViews: DataViewsPublicPluginStart; - security?: SecurityPluginSetup; - licenseManagement?: LicenseManagementUIPluginSetup; - share: SharePluginStart; - embeddable: EmbeddableStart; - maps?: MapsStartApi; - triggersActionsUi?: TriggersAndActionsUIPublicPluginStart; dataVisualizer?: DataVisualizerPluginStart; - usageCollection?: UsageCollectionSetup; - fieldFormats: FieldFormatsRegistry; - dashboard: DashboardStart; - spacesApi?: SpacesPluginStart; - charts: ChartsPluginStart; - cases?: CasesUiStart; - unifiedSearch: UnifiedSearchPublicPluginStart; - core: CoreStart; - appName: string; + embeddable: EmbeddableStart; + fieldFormats: FieldFormatsStart; lens: LensPublicStart; + licenseManagement?: LicenseManagementUIPluginSetup; + maps?: MapsStartApi; + presentationUtil: PresentationUtilPluginStart; savedObjectsManagement: SavedObjectsManagementPluginStart; savedSearch: SavedSearchPublicPluginStart; - contentManagement: ContentManagementPublicStart; - presentationUtil: PresentationUtilPluginStart; + security?: SecurityPluginStart; + share: SharePluginStart; + spacesApi?: SpacesPluginStart; + triggersActionsUi?: TriggersAndActionsUIPublicPluginStart; + uiActions: UiActionsStart; + unifiedSearch: UnifiedSearchPublicPluginStart; + usageCollection?: UsageCollectionSetup; } export type StartServices = CoreStart & StartPlugins & { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx index 74ca6037f8a90..e2998651f2c21 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx @@ -19,6 +19,7 @@ import { QueryStringInput } from '@kbn/unified-search-plugin/public'; import { QueryErrorMessage } from '@kbn/ml-error-utils'; import { SEARCH_QUERY_LANGUAGE, SearchQueryLanguage } from '@kbn/ml-query-utils'; +import { PLUGIN_ID } from '../../../../../../../common/constants/app'; import { Dictionary } from '../../../../../../../common/types/common'; import { removeFilterFromQueryString } from '../../../../../explorer/explorer_utils'; import { useMlKibana } from '../../../../../contexts/kibana'; @@ -53,17 +54,8 @@ export const ExplorationQueryBar: FC = ({ ); const { services } = useMlKibana(); - const { - unifiedSearch, - data, - storage, - appName, - notifications, - http, - docLinks, - uiSettings, - dataViews, - } = services; + const { unifiedSearch, data, storage, notifications, http, docLinks, uiSettings, dataViews } = + services; const searchChangeHandler = (q: Query) => setSearchInput(q); @@ -206,7 +198,7 @@ export const ExplorationQueryBar: FC = ({ disableAutoFocus={true} dataTestSubj="mlDFAnalyticsQueryInput" languageSwitcherPopoverAnchorPosition="rightDown" - appName={appName} + appName={PLUGIN_ID} deps={{ unifiedSearch, notifications, diff --git a/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx b/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx index a98b4dc861a36..9e55ade9f6bd5 100644 --- a/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx +++ b/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx @@ -15,6 +15,7 @@ import type { DataView } from '@kbn/data-views-plugin/common'; import type { QueryErrorMessage } from '@kbn/ml-error-utils'; import type { InfluencersFilterQuery } from '@kbn/ml-anomaly-utils'; import { SEARCH_QUERY_LANGUAGE } from '@kbn/ml-query-utils'; +import { PLUGIN_ID } from '../../../../../common/constants/app'; import { useAnomalyExplorerContext } from '../../anomaly_explorer_context'; import { useMlKibana } from '../../../contexts/kibana'; @@ -113,7 +114,6 @@ export const ExplorerQueryBar: FC = ({ unifiedSearch, data, storage, - appName, notifications, http, docLinks, @@ -176,7 +176,7 @@ export const ExplorerQueryBar: FC = ({ disableAutoFocus dataTestSubj="explorerQueryInput" languageSwitcherPopoverAnchorPosition="rightDown" - appName={appName} + appName={PLUGIN_ID} deps={{ unifiedSearch, notifications, diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index 9b9bf6eddada2..c0356b0f40192 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -70,45 +70,45 @@ import type { MlCapabilities } from './shared'; import { ElasticModels } from './application/services/elastic_models_service'; export interface MlStartDependencies { - dataViewEditor: DataViewEditorStart; + cases?: CasesUiStart; + charts: ChartsPluginStart; + contentManagement: ContentManagementPublicStart; + dashboard: DashboardStart; data: DataPublicPluginStart; - unifiedSearch: UnifiedSearchPublicPluginStart; - licensing: LicensingPluginStart; - share: SharePluginStart; - uiActions: UiActionsStart; - spaces?: SpacesPluginStart; - embeddable: EmbeddableStart; - maps?: MapsStartApi; - triggersActionsUi?: TriggersAndActionsUIPublicPluginStart; + dataViewEditor: DataViewEditorStart; dataVisualizer: DataVisualizerPluginStart; + embeddable: EmbeddableStart; fieldFormats: FieldFormatsStart; - dashboard: DashboardStart; - charts: ChartsPluginStart; - lens?: LensPublicStart; - cases?: CasesUiStart; - security: SecurityPluginStart; + lens: LensPublicStart; + licensing: LicensingPluginStart; + maps?: MapsStartApi; + presentationUtil: PresentationUtilPluginStart; savedObjectsManagement: SavedObjectsManagementPluginStart; savedSearch: SavedSearchPublicPluginStart; - contentManagement: ContentManagementPublicStart; - presentationUtil: PresentationUtilPluginStart; + security: SecurityPluginStart; + share: SharePluginStart; + spaces?: SpacesPluginStart; + triggersActionsUi?: TriggersAndActionsUIPublicPluginStart; + uiActions: UiActionsStart; + unifiedSearch: UnifiedSearchPublicPluginStart; } export interface MlSetupDependencies { - maps?: MapsSetupApi; - licensing: LicensingPluginSetup; - management?: ManagementSetup; - licenseManagement?: LicenseManagementUIPluginSetup; - home?: HomePublicPluginSetup; + alerting?: AlertingSetup; + cases?: CasesUiSetup; + dashboard: DashboardSetup; embeddable: EmbeddableSetup; - uiActions: UiActionsSetup; + fieldFormats: FieldFormatsSetup; + home?: HomePublicPluginSetup; kibanaVersion: string; + licenseManagement?: LicenseManagementUIPluginSetup; + licensing: LicensingPluginSetup; + management?: ManagementSetup; + maps?: MapsSetupApi; share: SharePluginSetup; triggersActionsUi?: TriggersAndActionsUIPublicPluginSetup; - alerting?: AlertingSetup; + uiActions: UiActionsSetup; usageCollection?: UsageCollectionSetup; - fieldFormats: FieldFormatsSetup; - dashboard: DashboardSetup; - cases?: CasesUiSetup; } export type MlCoreSetup = CoreSetup; @@ -154,31 +154,31 @@ export class MlPlugin implements Plugin { return renderApp( coreStart, { + cases: pluginsStart.cases, charts: pluginsStart.charts, + contentManagement: pluginsStart.contentManagement, + dashboard: pluginsStart.dashboard, data: pluginsStart.data, dataViewEditor: pluginsStart.dataViewEditor, - unifiedSearch: pluginsStart.unifiedSearch, - dashboard: pluginsStart.dashboard, - share: pluginsStart.share, - security: pluginsStart.security, - licensing: pluginsStart.licensing, - management: pluginsSetup.management, - licenseManagement: pluginsSetup.licenseManagement, - home: pluginsSetup.home, - embeddable: { ...pluginsSetup.embeddable, ...pluginsStart.embeddable }, - maps: pluginsStart.maps, - uiActions: pluginsStart.uiActions, - kibanaVersion: this.initializerContext.env.packageInfo.version, - triggersActionsUi: pluginsStart.triggersActionsUi, dataVisualizer: pluginsStart.dataVisualizer, - usageCollection: pluginsSetup.usageCollection, + embeddable: { ...pluginsSetup.embeddable, ...pluginsStart.embeddable }, fieldFormats: pluginsStart.fieldFormats, + home: pluginsSetup.home, + kibanaVersion: this.initializerContext.env.packageInfo.version, lens: pluginsStart.lens, - cases: pluginsStart.cases, + licenseManagement: pluginsSetup.licenseManagement, + licensing: pluginsStart.licensing, + management: pluginsSetup.management, + maps: pluginsStart.maps, + presentationUtil: pluginsStart.presentationUtil, savedObjectsManagement: pluginsStart.savedObjectsManagement, savedSearch: pluginsStart.savedSearch, - contentManagement: pluginsStart.contentManagement, - presentationUtil: pluginsStart.presentationUtil, + security: pluginsStart.security, + share: pluginsStart.share, + triggersActionsUi: pluginsStart.triggersActionsUi, + uiActions: pluginsStart.uiActions, + unifiedSearch: pluginsStart.unifiedSearch, + usageCollection: pluginsSetup.usageCollection, }, params, this.isServerless, From ce33484da2fe40c116f181d39e70d2e5e81f3769 Mon Sep 17 00:00:00 2001 From: Jon Date: Thu, 9 Nov 2023 10:18:58 -0600 Subject: [PATCH 09/51] [ci/cloud-deploy] Skip CDN assets build (#170959) The cloud deploy image is created using a resume build, relying on an existing kibana.tar.gz. The source files needed to build CDN assets are not available and this step is not needed. --- .buildkite/scripts/steps/cloud/build_and_deploy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/scripts/steps/cloud/build_and_deploy.sh b/.buildkite/scripts/steps/cloud/build_and_deploy.sh index 40c223265856e..9876ea52fdd3b 100755 --- a/.buildkite/scripts/steps/cloud/build_and_deploy.sh +++ b/.buildkite/scripts/steps/cloud/build_and_deploy.sh @@ -37,6 +37,7 @@ else --skip-generic-folders \ --skip-platform-folders \ --skip-archives \ + --skip-cdn-assets \ --docker-images \ --docker-tag-qualifier="$GIT_COMMIT" \ --docker-push \ From 8b4da3eee3ee989df72739f4e20faedd6b0f5867 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 9 Nov 2023 18:11:41 +0100 Subject: [PATCH 10/51] [Fleet] changed log level to debug (#170967) Resolves https://github.com/elastic/kibana/issues/170951 Changed `Running Fleet metrics task` info log to debug --- .../fleet/server/services/metrics/fleet_metrics_task.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts b/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts index 03f44bf96ae96..bd72976fa603c 100644 --- a/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts +++ b/x-pack/plugins/fleet/server/services/metrics/fleet_metrics_task.ts @@ -72,10 +72,10 @@ export class FleetMetricsTask { return; } if (!this.esClient) { - appContextService.getLogger().info('esClient not set, skipping Fleet metrics task'); + appContextService.getLogger().debug('esClient not set, skipping Fleet metrics task'); return; } - appContextService.getLogger().info('Running Fleet metrics task'); + appContextService.getLogger().debug('Running Fleet metrics task'); try { const agentMetrics = await fetchAgentMetrics(); From ebe0d1b0bfe22eddae16d67ab3bd9588b1415908 Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Thu, 9 Nov 2023 18:33:47 +0100 Subject: [PATCH 11/51] [Security Solution] Removing `cy.session` from Cypress tests (#170969) --- .github/CODEOWNERS | 1 + .../cypress/tasks/login.ts | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c51318721ba81..b60e8c5effe45 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1418,6 +1418,7 @@ x-pack/plugins/security_solution/server/lib/telemetry/ @elastic/security-data-an ## Security Solution sub teams - security-engineering-productivity /x-pack/test/security_solution_cypress/* @elastic/security-engineering-productivity /x-pack/test/security_solution_cypress/cypress/* @elastic/security-engineering-productivity +/x-pack/test/security_solution_cypress/cypress/tasks/login.ts @elastic/security-engineering-productivity /x-pack/test/security_solution_cypress/es_archives @elastic/security-engineering-productivity /x-pack/plugins/security_solution/scripts/run_cypress @MadameSheema @patrykkopycinski @oatkiller @maximpn @banderror diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts index 26702a47c9427..07a91a903536b 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts @@ -62,9 +62,7 @@ export interface User { } export const loginWithUser = (user: User): void => { - cy.session(user, () => { - loginWithUsernameAndPassword(user.username, user.password); - }); + loginWithUsernameAndPassword(user.username, user.password); }; /** @@ -129,9 +127,7 @@ const loginWithRole = (role: SecurityRoleName): void => { const password = 'changeme'; cy.log(`origin: ${Cypress.config().baseUrl}`); - cy.session(role, () => { - loginWithUsernameAndPassword(role, password); - }); + loginWithUsernameAndPassword(role, password); }; /** @@ -154,10 +150,7 @@ const loginViaEnvironmentCredentials = (): void => { const username = Cypress.env(ELASTICSEARCH_USERNAME); const password = Cypress.env(ELASTICSEARCH_PASSWORD); - - cy.session([username, password], () => { - loginWithUsernameAndPassword(username, password); - }); + loginWithUsernameAndPassword(username, password); }; /** From 8e549a37b76414a6d22e6d00897e626b4413ae3e Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 9 Nov 2023 18:26:42 +0000 Subject: [PATCH 12/51] skip failing es promotion suites (#170980) --- .../apis/management/index_management/templates.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/management/index_management/templates.js b/x-pack/test/api_integration/apis/management/index_management/templates.js index 1cb58c0957e17..99b214f08332f 100644 --- a/x-pack/test/api_integration/apis/management/index_management/templates.js +++ b/x-pack/test/api_integration/apis/management/index_management/templates.js @@ -28,7 +28,8 @@ export default function ({ getService }) { describe('index templates', () => { after(() => Promise.all([cleanUpEsResources(), cleanUpTemplates()])); - describe('get all', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/170980 + describe.skip('get all', () => { const templateName = `template-${getRandomString()}`; const indexTemplate = getTemplatePayload(templateName, [getRandomString()]); const legacyTemplate = getTemplatePayload(templateName, [getRandomString()], true); From 059aa93a30394709ad8bf42489befb6f4572eddd Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Thu, 9 Nov 2023 13:32:27 -0500 Subject: [PATCH 13/51] [Fleet] Fix type error when creating custom integration (#170901) --- .../custom_integrations/utils.test.ts | 22 +++++++++++++++++++ .../epm/packages/custom_integrations/utils.ts | 1 + 2 files changed, 23 insertions(+) create mode 100644 x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.test.ts diff --git a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.test.ts new file mode 100644 index 0000000000000..1ba03cbd045a4 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.test.ts @@ -0,0 +1,22 @@ +/* + * 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 { convertStringToTitle } from './utils'; + +describe('convertStringToTitle', () => { + it('works without underscore: test', () => { + expect(convertStringToTitle('test')).toBe('Test'); + }); + + it('works with one underscore test_test', () => { + expect(convertStringToTitle('test_test')).toBe('Test Test'); + }); + + it('works with double underscore: test__test', () => { + expect(convertStringToTitle('test__test')).toBe('Test Test'); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.ts b/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.ts index d90c12d231f74..4c18941f6638d 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/utils.ts @@ -8,6 +8,7 @@ export const convertStringToTitle = (name: string) => { return name .split('_') + .filter((word) => word.length > 0) .map((word) => { return word[0].toUpperCase() + word.substring(1); }) From 0cb8a487c1e392cab9f995cc7672536529d84de8 Mon Sep 17 00:00:00 2001 From: Willie Hung Date: Thu, 9 Nov 2023 12:36:44 -0600 Subject: [PATCH 14/51] [uiSettings] Extend toast lifetime (#169899) ## Summary - Extend toast lifetime to `15s`. - Resolves #135950 ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) Signed-off-by: Willie Hung Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/management_app/components/form/form.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/advanced_settings/public/management_app/components/form/form.tsx b/src/plugins/advanced_settings/public/management_app/components/form/form.tsx index e5af8e871cf52..e45af3c98cce6 100644 --- a/src/plugins/advanced_settings/public/management_app/components/form/form.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/form/form.tsx @@ -191,6 +191,7 @@ export class Form extends PureComponent { title: i18n.translate('advancedSettings.form.requiresPageReloadToastDescription', { defaultMessage: 'One or more settings require you to reload the page to take effect.', }), + toastLifeTimeMs: 15000, text: toMountPoint( From ab1375cf62d380a1d104418d2e4b087f69534275 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Thu, 9 Nov 2023 14:33:26 -0500 Subject: [PATCH 15/51] [Fleet] Fix view agent activity for large action (#170971) --- .../components/agent_activity_flyout.tsx | 32 +++++++++++++++++-- .../scripts/create_agents/create_agents.ts | 13 ++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout.tsx index 2c1def3461118..d23358726c11e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout.tsx @@ -26,6 +26,7 @@ import { EuiButtonEmpty, EuiFlyoutFooter, EuiSpacer, + EuiToolTip, } from '@elastic/eui'; import styled from 'styled-components'; @@ -57,6 +58,8 @@ const FlyoutFooterWPadding = styled(EuiFlyoutFooter)` padding: 16px 24px !important; `; +const MAX_VIEW_AGENTS_COUNT = 2000; + export const AgentActivityFlyout: React.FunctionComponent<{ onClose: () => void; onAbortSuccess: () => void; @@ -702,17 +705,42 @@ const ViewAgentsButton: React.FunctionComponent<{ action: ActionStatus; onClickViewAgents: (action: ActionStatus) => void; }> = ({ action, onClickViewAgents }) => { - return action.type !== 'UPDATE_TAGS' ? ( + if (action.type === 'UPDATE_TAGS') { + return null; + } + + const button = ( onClickViewAgents(action)} flush="left" data-test-subj="agentActivityFlyout.viewAgentsButton" + disabled={action.nbAgentsActionCreated > MAX_VIEW_AGENTS_COUNT} > - ) : null; + ); + + if (action.nbAgentsActionCreated <= MAX_VIEW_AGENTS_COUNT) { + return button; + } + + return ( + + } + > + {button} + + ); }; diff --git a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts index 52723d0450351..2c510a2ca3ffe 100644 --- a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts +++ b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts @@ -43,7 +43,7 @@ const ES_PASSWORD = 'password'; const DEFAULT_AGENT_COUNT = 50000; -const INDEX_BULK_OP = '{ "index":{ } }\n'; +const INDEX_BULK_OP = '{ "index":{ "_id": "{{id}}" } }\n'; const { delete: deleteAgentsFirst = false, @@ -145,6 +145,10 @@ function createAgentWithStatus({ hostname: string; }) { const baseAgent = { + agent: { + id: uuidv4(), + version, + }, access_api_key_id: 'api-key-1', active: true, policy_id: policyId, @@ -235,7 +239,12 @@ async function deleteAgents() { async function createAgentDocsBulk(agents: Agent[]) { const auth = 'Basic ' + Buffer.from(ES_SUPERUSER + ':' + ES_PASSWORD).toString('base64'); - const body = agents.flatMap((agent) => [INDEX_BULK_OP, JSON.stringify(agent) + '\n']).join(''); + const body = agents + .flatMap((agent) => [ + INDEX_BULK_OP.replace(/{{id}}/, agent.agent?.id ?? ''), + JSON.stringify(agent) + '\n', + ]) + .join(''); const res = await fetch(`${ES_URL}/.fleet-agents/_bulk`, { method: 'post', body, From 3db389c5eeb8909bab44bde1c818eab97df6bcad Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 9 Nov 2023 19:48:47 +0000 Subject: [PATCH 16/51] skip failing es promotion suites (#170980) --- .../apis/management/index_management/templates.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/api_integration/apis/management/index_management/templates.js b/x-pack/test/api_integration/apis/management/index_management/templates.js index 99b214f08332f..2c7ba54bb9c98 100644 --- a/x-pack/test/api_integration/apis/management/index_management/templates.js +++ b/x-pack/test/api_integration/apis/management/index_management/templates.js @@ -25,11 +25,11 @@ export default function ({ getService }) { cleanUpTemplates, } = registerHelpers({ supertest }); - describe('index templates', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/170980 + describe.skip('index templates', () => { after(() => Promise.all([cleanUpEsResources(), cleanUpTemplates()])); - // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/170980 - describe.skip('get all', () => { + describe('get all', () => { const templateName = `template-${getRandomString()}`; const indexTemplate = getTemplatePayload(templateName, [getRandomString()]); const legacyTemplate = getTemplatePayload(templateName, [getRandomString()], true); From 9822d4926327742acf7cd882d9852d1fdae60aa6 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 9 Nov 2023 13:56:26 -0600 Subject: [PATCH 17/51] [Security Solution][Entity Analytics] Move OpenAPI Risk Engine schemae to common/api folder (#169440) # Summary * Splits into one file per route * Places reused components into a common.yml file ### Related Issues This is a followup to [this comment](https://github.com/elastic/kibana/pull/162400/files#r1282548131). --- .../risk_engine/calculation_route_schema.yml | 91 ++++++++ .../common/api/risk_engine/common.yml | 199 ++++++++++++++++++ .../engine_disable_route_schema.yml | 37 ++++ .../engine_enable_route_schema.yml | 37 ++++ .../risk_engine/engine_init_route_schema.yml | 46 ++++ .../engine_status_route_schema.yml | 45 ++++ .../api/risk_engine/preview_route_schema.yml | 90 ++++++++ 7 files changed, 545 insertions(+) create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/calculation_route_schema.yml create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/common.yml create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/engine_disable_route_schema.yml create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/engine_enable_route_schema.yml create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/engine_init_route_schema.yml create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/engine_status_route_schema.yml create mode 100644 x-pack/plugins/security_solution/common/api/risk_engine/preview_route_schema.yml diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/calculation_route_schema.yml b/x-pack/plugins/security_solution/common/api/risk_engine/calculation_route_schema.yml new file mode 100644 index 0000000000000..c851509c4f64a --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/calculation_route_schema.yml @@ -0,0 +1,91 @@ +openapi: 3.0.0 + +info: + version: 1.0.0 + title: Risk Scoring API + description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. + +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' + +paths: + /api/risk_scores/calculation: + post: + summary: Trigger calculation of Risk Scores + description: Calculates and persists a segment of Risk Scores, returning details about the calculation. + requestBody: + description: Details about the Risk Scores being calculated + content: + application/json: + schema: + $ref: '#/components/schemas/RiskScoresCalculationRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskScoresCalculationResponse' + '400': + description: Invalid request + +components: + schemas: + RiskScoresCalculationRequest: + type: object + required: + - data_view_id + - identifier_type + - range + properties: + after_keys: + description: Used to calculate a specific "page" of risk scores. If unspecified, the first "page" of scores is returned. See also the `after_keys` key in a risk scores response. + allOf: + - $ref: 'common.yml#/components/schemas/AfterKeys' + data_view_id: + $ref: 'common.yml#/components/schemas/DataViewId' + description: The identifier of the Kibana data view to be used when generating risk scores. If a data view is not found, the provided ID will be used as the query's index pattern instead. + debug: + description: If set to `true`, the internal ES requests/responses will be logged in Kibana. + type: boolean + filter: + $ref: 'common.yml#/components/schemas/Filter' + description: An elasticsearch DSL filter object. Used to filter the data being scored, which implicitly filters the risk scores calculated. + page_size: + $ref: 'common.yml#/components/schemas/PageSize' + identifier_type: + description: Used to restrict the type of risk scores calculated. + allOf: + - $ref: 'common.yml#/components/schemas/IdentifierType' + range: + $ref: 'common.yml#/components/schemas/DateRange' + description: Defines the time period over which scores will be evaluated. If unspecified, a range of `[now, now-30d]` will be used. + weights: + $ref: 'common.yml#/components/schemas/RiskScoreWeights' + + RiskScoresCalculationResponse: + type: object + required: + - after_keys + - errors + - scores_written + properties: + after_keys: + description: Used to obtain the next "page" of risk scores. See also the `after_keys` key in a risk scores request. If this key is empty, the calculation is complete. + allOf: + - $ref: 'common.yml#/components/schemas/AfterKeys' + errors: + type: array + description: A list of errors encountered during the calculation. + items: + type: string + scores_written: + type: number + format: integer + description: The number of risk scores persisted to elasticsearch. diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/common.yml b/x-pack/plugins/security_solution/common/api/risk_engine/common.yml new file mode 100644 index 0000000000000..ea4bd4bd86321 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/common.yml @@ -0,0 +1,199 @@ +openapi: 3.0.0 + +components: + schemas: + + AfterKeys: + type: object + properties: + host: + type: object + additionalProperties: + type: string + user: + type: object + additionalProperties: + type: string + example: + host: + 'host.name': 'example.host' + user: + 'user.name': 'example_user_name' + + DataViewId: + description: The identifier of the Kibana data view to be used when generating risk scores. + example: security-solution-default + type: string + + Filter: + description: An elasticsearch DSL filter object. Used to filter the risk inputs involved, which implicitly filters the risk scores themselves. + $ref: 'https://cloud.elastic.co/api/v1/api-docs/spec.json#/definitions/QueryContainer' + + PageSize: + description: Specifies how many scores will be involved in a given calculation. Note that this value is per `identifier_type`, i.e. a value of 10 will calculate 10 host scores and 10 user scores, if available. To avoid missed data, keep this value consistent while paginating through scores. + default: 1000 + type: number + + DateRange: + description: Defines the time period on which risk inputs will be filtered. + type: object + required: + - start + - end + properties: + start: + $ref: '#/components/schemas/KibanaDate' + end: + $ref: '#/components/schemas/KibanaDate' + + KibanaDate: + type: string + oneOf: + - format: date + - format: date-time + - format: datemath + example: '2017-07-21T17:32:28Z' + + IdentifierType: + type: string + enum: + - host + - user + + RiskScore: + type: object + required: + - '@timestamp' + - id_field + - id_value + - calculated_level + - calculated_score + - calculated_score_norm + - category_1_score + - category_1_count + - inputs + properties: + '@timestamp': + type: string + format: 'date-time' + example: '2017-07-21T17:32:28Z' + description: The time at which the risk score was calculated. + id_field: + type: string + example: 'host.name' + description: The identifier field defining this risk score. Coupled with `id_value`, uniquely identifies the entity being scored. + id_value: + type: string + example: 'example.host' + description: The identifier value defining this risk score. Coupled with `id_field`, uniquely identifies the entity being scored. + calculated_level: + type: string + example: 'Critical' + description: Lexical description of the entity's risk. + calculated_score: + type: number + format: double + description: The raw numeric value of the given entity's risk score. + calculated_score_norm: + type: number + format: double + minimum: 0 + maximum: 100 + description: The normalized numeric value of the given entity's risk score. Useful for comparing with other entities. + category_1_score: + type: number + format: double + description: The contribution of Category 1 to the overall risk score (`calculated_score`). Category 1 contains Detection Engine Alerts. + category_1_count: + type: number + format: integer + description: The number of risk input documents that contributed to the Category 1 score (`category_1_score`). + inputs: + type: array + description: A list of the highest-risk documents contributing to this risk score. Useful for investigative purposes. + items: + $ref: '#/components/schemas/RiskScoreInput' + + RiskScoreInput: + description: A generic representation of a document contributing to a Risk Score. + type: object + properties: + id: + type: string + example: 91a93376a507e86cfbf282166275b89f9dbdb1f0be6c8103c6ff2909ca8e1a1c + description: The unique identifier (`_id`) of the original source document + index: + type: string + example: .internal.alerts-security.alerts-default-000001 + description: The unique index (`_index`) of the original source document + category: + type: string + example: category_1 + description: The risk category of the risk input document. + description: + type: string + example: 'Generated from Detection Engine Rule: Malware Prevention Alert' + description: A human-readable description of the risk input document. + risk_score: + type: number + format: double + minimum: 0 + maximum: 100 + description: The weighted risk score of the risk input document. + timestamp: + type: string + example: '2017-07-21T17:32:28Z' + description: The @timestamp of the risk input document. + + RiskScoreWeight: + description: "Configuration used to tune risk scoring. Weights can be used to change the score contribution of risk inputs for hosts and users at both a global level and also for Risk Input categories (e.g. 'category_1')." + type: object + required: + - type + properties: + type: + type: string + value: + type: string + host: + type: number + format: double + minimum: 0 + maximum: 1 + user: + type: number + format: double + minimum: 0 + maximum: 1 + example: + type: 'risk_category' + value: 'category_1' + host: 0.8 + user: 0.4 + + RiskScoreWeights: + description: 'A list of weights to be applied to the scoring calculation.' + type: array + items: + $ref: '#/components/schemas/RiskScoreWeight' + example: + - type: 'risk_category' + value: 'category_1' + host: 0.8 + user: 0.4 + - type: 'global_identifier' + host: 0.5 + user: 0.1 + + RiskEngineInitStep: + type: object + required: + - type + - success + properties: + type: + type: string + success: + type: boolean + error: + type: string diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/engine_disable_route_schema.yml b/x-pack/plugins/security_solution/common/api/risk_engine/engine_disable_route_schema.yml new file mode 100644 index 0000000000000..71d4c96681814 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/engine_disable_route_schema.yml @@ -0,0 +1,37 @@ +openapi: 3.0.0 + +info: + version: 1.0.0 + title: Risk Scoring API + description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. + +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' + +paths: + /internal/risk_score/engine/disable: + post: + summary: Disable the Risk Engine + requestBody: + content: + application/json: {} + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskEngineDisableResponse' + +components: + schemas: + RiskEngineDisableResponse: + type: object + properties: + success: + type: boolean diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/engine_enable_route_schema.yml b/x-pack/plugins/security_solution/common/api/risk_engine/engine_enable_route_schema.yml new file mode 100644 index 0000000000000..42e4ec7af0a50 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/engine_enable_route_schema.yml @@ -0,0 +1,37 @@ +openapi: 3.0.0 + +info: + version: 1.0.0 + title: Risk Scoring API + description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. + +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' + +paths: + /internal/risk_score/engine/enable: + post: + summary: Enable the Risk Engine + requestBody: + content: + application/json: {} + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskEngineEnableResponse' + +components: + schemas: + RiskEngineEnableResponse: + type: object + properties: + success: + type: boolean diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/engine_init_route_schema.yml b/x-pack/plugins/security_solution/common/api/risk_engine/engine_init_route_schema.yml new file mode 100644 index 0000000000000..daa6b3a33bb22 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/engine_init_route_schema.yml @@ -0,0 +1,46 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: Risk Scoring API + description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' + +paths: + /internal/risk_score/engine/init: + post: + summary: Initialize the Risk Engine + description: Initializes the Risk Engine by creating the necessary indices and mappings, removing old transforms, and starting the new risk engine + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskEngineInitResponse' + +components: + schemas: + RiskEngineInitResponse: + type: object + properties: + result: + type: object + properties: + risk_engine_enabled: + type: boolean + risk_engine_resources_installed: + type: boolean + risk_engine_configuration_created: + type: boolean + legacy_risk_engine_disabled: + type: boolean + errors: + type: array + items: + type: string diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/engine_status_route_schema.yml b/x-pack/plugins/security_solution/common/api/risk_engine/engine_status_route_schema.yml new file mode 100644 index 0000000000000..4aed23d48a0d5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/engine_status_route_schema.yml @@ -0,0 +1,45 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: Risk Scoring API + description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' + +paths: + /engine/status: + get: + summary: Get the status of the Risk Engine + description: Returns the status of both the legacy transform-based risk engine, as well as the new risk engine + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskEngineStatusResponse' +components: + schemas: + + RiskEngineStatusResponse: + type: object + properties: + legacy_risk_engine_status: + $ref: '#/components/schemas/RiskEngineStatus' + risk_engine_status: + $ref: '#/components/schemas/RiskEngineStatus' + is_max_amount_of_risk_engines_reached: + description: Indicates whether the maximum amount of risk engines has been reached + type: boolean + + RiskEngineStatus: + type: string + enum: + - 'NOT_INSTALLED' + - 'DISABLED' + - 'ENABLED' diff --git a/x-pack/plugins/security_solution/common/api/risk_engine/preview_route_schema.yml b/x-pack/plugins/security_solution/common/api/risk_engine/preview_route_schema.yml new file mode 100644 index 0000000000000..fc66d3ed882c9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/risk_engine/preview_route_schema.yml @@ -0,0 +1,90 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: Risk Scoring API + description: These APIs allow the consumer to manage Entity Risk Scores within Entity Analytics. +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' + +paths: + /internal/risk_score/preview: + post: + summary: Preview the calculation of Risk Scores + description: Calculates and returns a list of Risk Scores, sorted by identifier_type and risk score. + requestBody: + description: Details about the Risk Scores being requested + content: + application/json: + schema: + $ref: '#/components/schemas/RiskScoresPreviewRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/RiskScoresPreviewResponse' + '400': + description: Invalid request + +components: + schemas: + RiskScoresPreviewRequest: + type: object + required: + - data_view_id + properties: + after_keys: + description: Used to retrieve a specific "page" of risk scores. If unspecified, the first "page" of scores is returned. See also the `after_keys` key in a risk scores response. + allOf: + - $ref: 'common.yml#/components/schemas/AfterKeys' + data_view_id: + $ref: 'common.yml#/components/schemas/DataViewId' + description: The identifier of the Kibana data view to be used when generating risk scores. If a data view is not found, the provided ID will be used as the query's index pattern instead. + debug: + description: If set to `true`, a `debug` key is added to the response, containing both the internal request and response with elasticsearch. + type: boolean + filter: + $ref: 'common.yml#/components/schemas/Filter' + description: An elasticsearch DSL filter object. Used to filter the data being scored, which implicitly filters the risk scores returned. + page_size: + $ref: 'common.yml#/components/schemas/PageSize' + identifier_type: + description: Used to restrict the type of risk scores involved. If unspecified, both `host` and `user` scores will be returned. + allOf: + - $ref: 'common.yml#/components/schemas/IdentifierType' + range: + $ref: 'common.yml#/components/schemas/DateRange' + description: Defines the time period over which scores will be evaluated. If unspecified, a range of `[now, now-30d]` will be used. + weights: + $ref: 'common.yml#/components/schemas/RiskScoreWeights' + + RiskScoresPreviewResponse: + type: object + required: + - after_keys + - scores + properties: + after_keys: + description: Used to obtain the next "page" of risk scores. See also the `after_keys` key in a risk scores request. If this key is empty, the calculation is complete. + allOf: + - $ref: 'common.yml#/components/schemas/AfterKeys' + debug: + description: Object containing debug information, particularly the internal request and response from elasticsearch + type: object + properties: + request: + type: string + response: + type: string + scores: + type: array + description: A list of risk scores + items: + $ref: 'common.yml#/components/schemas/RiskScore' From 3fae0b9d73e2b5cc1dcf95006aa15ddf2387ad54 Mon Sep 17 00:00:00 2001 From: Jorge Sanz Date: Thu, 9 Nov 2023 21:37:00 +0100 Subject: [PATCH 18/51] [EMS] Update to ems-client@8.5.1 (#170966) ## Summary Related to https://github.com/elastic/ems-client/pull/208 Update to a version of `ems-client` that supports Node 20. I'm creating new PRs for: * `@elastic/ems-client@8.4.1` in Kibana `8.11` branch * `@elastic/ems-client@7.17.1` for Kibana `7.17` branch Sorry for the small overhead on reviewing; this way, it seems faster to get CI running in parallel for the three releases and unblock the operations team on this issue. --- package.json | 2 +- src/dev/license_checker/config.ts | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 4e4c2441fe9fc..3a2052836d5de 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "@elastic/charts": "60.0.0", "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.9.1-canary.1", - "@elastic/ems-client": "8.5.0", + "@elastic/ems-client": "8.5.1", "@elastic/eui": "90.0.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 3646fe3ab65de..1680edb446e36 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -84,7 +84,7 @@ export const PER_PACKAGE_ALLOWED_LICENSES = { export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint - '@elastic/ems-client@8.5.0': ['Elastic License 2.0'], + '@elastic/ems-client@8.5.1': ['Elastic License 2.0'], '@elastic/eui@90.0.0': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary diff --git a/yarn.lock b/yarn.lock index 68faac71450cc..a2d0d454a4d34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1574,10 +1574,10 @@ "@elastic/transport" "^8.3.3" tslib "^2.4.0" -"@elastic/ems-client@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@elastic/ems-client/-/ems-client-8.5.0.tgz#5e3988ab01dee54bace9f8c2f9e71470b26a1bfa" - integrity sha512-uEI8teyS3gWErlEL4mEYh0MDHms9Rp3eEHKnMMSdMtAkaa3xs60SOm3Vd0ld9sIPsyarQHrAybAw30GXVXXRjw== +"@elastic/ems-client@8.5.1": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@elastic/ems-client/-/ems-client-8.5.1.tgz#60c179e53ad81f5e26680e7e1c6cbffe4fb64aed" + integrity sha512-lc65i/cW6fGuRMt3pUte35sL8HxXM7TbYJwx1bHWcWn4aN3zv8i5RhPKFz+Wr/1ubfFOTrIoFYCP4h1uq2O/dQ== dependencies: "@types/geojson" "^7946.0.10" "@types/lru-cache" "^5.1.0" From f92dbb76c7cec85f5bd5f71cc3a25a130139a981 Mon Sep 17 00:00:00 2001 From: Jon Date: Thu, 9 Nov 2023 15:16:35 -0600 Subject: [PATCH 19/51] [ci/artifacts] Fix docker context args (#170944) I incorrectly removed this previously, not finding any arguments missing. There was one - the `--release` flag, used to remove snapshot from the filename. https://buildkite.com/elastic/kibana-artifacts-snapshot/builds/3472 ~https://buildkite.com/elastic/kibana-artifacts-staging/builds/2337~ I'll verify on the backport, the failure here is expected. --- .buildkite/scripts/steps/artifacts/docker_context.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/scripts/steps/artifacts/docker_context.sh b/.buildkite/scripts/steps/artifacts/docker_context.sh index 26501fd5555d0..b6fe4834465fc 100755 --- a/.buildkite/scripts/steps/artifacts/docker_context.sh +++ b/.buildkite/scripts/steps/artifacts/docker_context.sh @@ -11,7 +11,7 @@ KIBANA_DOCKER_CONTEXT="${KIBANA_DOCKER_CONTEXT:="default"}" echo "--- Create contexts" mkdir -p target -node scripts/build --skip-initialize --skip-generic-folders --skip-platform-folders --skip-archives --skip-cdn-assets --docker-context-use-local-artifact +node scripts/build --skip-initialize --skip-generic-folders --skip-platform-folders --skip-archives --skip-cdn-assets --docker-context-use-local-artifact "${BUILD_ARGS[@]}" echo "--- Setup context" DOCKER_BUILD_FOLDER=$(mktemp -d) From 85d45226d7fa66349906119e20eeaf33b302a0be Mon Sep 17 00:00:00 2001 From: Brad White Date: Thu, 9 Nov 2023 15:09:51 -0700 Subject: [PATCH 20/51] Remove invalid license options from kbn/es (#170978) ## Summary - Removes invalid license options from docs. - Removes invalid `oss` license from cli --- packages/kbn-es/README.mdx | 2 +- packages/kbn-es/src/artifact.test.js | 31 ++++------- packages/kbn-es/src/artifact.ts | 4 +- .../src/cli_commands/build_snapshots.ts | 52 +++++++++---------- packages/kbn-es/src/cli_commands/snapshot.ts | 2 +- packages/kbn-es/src/cli_commands/source.ts | 2 +- packages/kbn-es/src/custom_snapshots.ts | 2 +- .../kbn-es/src/install/install_archive.ts | 18 +++---- packages/kbn-es/src/utils/build_snapshot.ts | 11 ++-- 9 files changed, 51 insertions(+), 73 deletions(-) diff --git a/packages/kbn-es/README.mdx b/packages/kbn-es/README.mdx index 5927670030cdf..eaacebdad54b5 100644 --- a/packages/kbn-es/README.mdx +++ b/packages/kbn-es/README.mdx @@ -68,7 +68,7 @@ es.run({ Type: `String` -License type, one of: trial, basic, gold, platinum +License type, one of: basic, trial ##### options.version diff --git a/packages/kbn-es/src/artifact.test.js b/packages/kbn-es/src/artifact.test.js index b16cb3ab54548..221248caefae8 100644 --- a/packages/kbn-es/src/artifact.test.js +++ b/packages/kbn-es/src/artifact.test.js @@ -67,24 +67,18 @@ beforeEach(() => { MOCKS = { valid: { - archives: [createArchive({ license: 'oss' }), createArchive({ license: 'default' })], + archives: [createArchive({ license: 'default' })], }, invalidArch: { - archives: [ - createArchive({ license: 'oss', architecture: 'invalid_arch' }), - createArchive({ license: 'default', architecture: 'invalid_arch' }), - ], + archives: [createArchive({ license: 'default', architecture: 'invalid_arch' })], }, differentVersion: { - archives: [ - createArchive({ license: 'oss', version: 'another-version' }), - createArchive({ license: 'default', version: 'another-version' }), - ], + archives: [createArchive({ license: 'default', version: 'another-version' })], }, multipleArch: { archives: [ - createArchive({ architecture: 'fake_arch', license: 'oss' }), - createArchive({ architecture: ARCHITECTURE, license: 'oss' }), + createArchive({ architecture: 'fake_arch', license: 'default' }), + createArchive({ architecture: ARCHITECTURE, license: 'default' }), ], }, }; @@ -116,8 +110,6 @@ describe('Artifact', () => { mockFetch(MOCKS.valid); }); - it('should return artifact metadata for a daily oss artifact', artifactTest('oss', 'oss')); - it( 'should return artifact metadata for a daily default artifact', artifactTest('default', 'default') @@ -147,11 +139,6 @@ describe('Artifact', () => { mockFetch(MOCKS.valid); }); - it( - 'should return artifact metadata for a permanent oss artifact', - artifactTest('oss', 'oss', 2) - ); - it( 'should return artifact metadata for a permanent default artifact', artifactTest('default', 'default', 2) @@ -181,8 +168,8 @@ describe('Artifact', () => { }); it('should return artifact metadata for the correct architecture', async () => { - const artifact = await Artifact.getSnapshot('oss', MOCK_VERSION, log); - expect(artifact.spec.filename).toEqual(MOCK_FILENAME + `-${ARCHITECTURE}.oss`); + const artifact = await Artifact.getSnapshot('default', MOCK_VERSION, log); + expect(artifact.spec.filename).toEqual(MOCK_FILENAME + `-${ARCHITECTURE}.default`); }); }); @@ -195,7 +182,7 @@ describe('Artifact', () => { }); it('should use the custom URL when looking for a snapshot', async () => { - await Artifact.getSnapshot('oss', MOCK_VERSION, log); + await Artifact.getSnapshot('default', MOCK_VERSION, log); expect(fetch.mock.calls[0][0]).toEqual(CUSTOM_URL); }); @@ -211,7 +198,7 @@ describe('Artifact', () => { }); it('should use the daily unverified URL when looking for a snapshot', async () => { - await Artifact.getSnapshot('oss', MOCK_VERSION, log); + await Artifact.getSnapshot('default', MOCK_VERSION, log); expect(fetch.mock.calls[0][0]).toEqual( `${DAILY_SNAPSHOT_BASE_URL}/${MOCK_VERSION}/manifest-latest.json` ); diff --git a/packages/kbn-es/src/artifact.ts b/packages/kbn-es/src/artifact.ts index 57a0e6fd5db06..3b11b6deac9cf 100644 --- a/packages/kbn-es/src/artifact.ts +++ b/packages/kbn-es/src/artifact.ts @@ -27,7 +27,7 @@ const PERMANENT_SNAPSHOTS_BASE_URL = 'https://storage.googleapis.com/kibana-ci-es-snapshots-permanent'; type ChecksumType = 'sha512'; -export type ArtifactLicense = 'oss' | 'basic' | 'trial'; +export type ArtifactLicense = 'basic' | 'trial'; interface ArtifactManifest { id: string; @@ -122,7 +122,7 @@ async function getArtifactSpecForSnapshot( log: ToolingLog ): Promise { const desiredVersion = urlVersion.replace('-SNAPSHOT', ''); - const desiredLicense = license === 'oss' ? 'oss' : 'default'; + const desiredLicense = 'default'; const customManifestUrl = process.env.ES_SNAPSHOT_MANIFEST; const primaryManifestUrl = `${DAILY_SNAPSHOTS_BASE_URL}/${desiredVersion}/manifest-latest${ diff --git a/packages/kbn-es/src/cli_commands/build_snapshots.ts b/packages/kbn-es/src/cli_commands/build_snapshots.ts index cc730418af338..458f515bb398a 100644 --- a/packages/kbn-es/src/cli_commands/build_snapshots.ts +++ b/packages/kbn-es/src/cli_commands/build_snapshots.ts @@ -49,35 +49,33 @@ export const buildSnapshots: Command = { del.sync(outputDir); Fs.mkdirSync(outputDir, { recursive: true }); - for (const license of ['oss', 'trial']) { - for (const platform of ['darwin', 'win32', 'linux']) { - log.info('Building', platform, license === 'trial' ? 'default' : 'oss', 'snapshot'); - await log.indent(4, async () => { - const snapshotPath = await buildSnapshot({ - license, - sourcePath: options.sourcePath, - log, - platform, - }); + for (const platform of ['darwin', 'win32', 'linux']) { + log.info('Building', platform, 'default snapshot'); + await log.indent(4, async () => { + const snapshotPath = await buildSnapshot({ + license: 'trial', + sourcePath: options.sourcePath, + log, + platform, + }); - const filename = basename(snapshotPath); - const outputPath = resolve(outputDir, filename); - const hash = createHash('sha512'); - await pipelineAsync( - Fs.createReadStream(snapshotPath), - new Transform({ - transform(chunk, _, cb) { - hash.update(chunk); - cb(undefined, chunk); - }, - }), - Fs.createWriteStream(outputPath) - ); + const filename = basename(snapshotPath); + const outputPath = resolve(outputDir, filename); + const hash = createHash('sha512'); + await pipelineAsync( + Fs.createReadStream(snapshotPath), + new Transform({ + transform(chunk, _, cb) { + hash.update(chunk); + cb(undefined, chunk); + }, + }), + Fs.createWriteStream(outputPath) + ); - Fs.writeFileSync(`${outputPath}.sha512`, `${hash.digest('hex')} ${filename}`); - log.success('snapshot and shasum written to', outputPath); - }); - } + Fs.writeFileSync(`${outputPath}.sha512`, `${hash.digest('hex')} ${filename}`); + log.success('snapshot and shasum written to', outputPath); + }); } }, }; diff --git a/packages/kbn-es/src/cli_commands/snapshot.ts b/packages/kbn-es/src/cli_commands/snapshot.ts index cf8a5149bc892..2395e480ee221 100644 --- a/packages/kbn-es/src/cli_commands/snapshot.ts +++ b/packages/kbn-es/src/cli_commands/snapshot.ts @@ -23,7 +23,7 @@ export const snapshot: Command = { return dedent` Options: - --license Run with a 'oss', 'basic', or 'trial' license [default: ${license}] + --license Run with a 'basic' or 'trial' license [default: ${license}] --version Version of ES to download [default: ${defaults.version}] --base-path Path containing cache/installations [default: ${basePath}] --install-path Installation path, defaults to 'source' within base-path diff --git a/packages/kbn-es/src/cli_commands/source.ts b/packages/kbn-es/src/cli_commands/source.ts index 6916c082676c0..3c50d50c50158 100644 --- a/packages/kbn-es/src/cli_commands/source.ts +++ b/packages/kbn-es/src/cli_commands/source.ts @@ -20,7 +20,7 @@ export const source: Command = { return dedent` Options: - --license Run with a 'oss', 'basic', or 'trial' license [default: ${license}] + --license Run with a 'basic' or 'trial' license [default: ${license}] --source-path Path to ES source [default: ${defaults['source-path']}] --base-path Path containing cache/installations [default: ${basePath}] --install-path Installation path, defaults to 'source' within base-path diff --git a/packages/kbn-es/src/custom_snapshots.ts b/packages/kbn-es/src/custom_snapshots.ts index f3e6d3ecaf857..dcd6f5b2c8406 100644 --- a/packages/kbn-es/src/custom_snapshots.ts +++ b/packages/kbn-es/src/custom_snapshots.ts @@ -42,7 +42,7 @@ export function resolveCustomSnapshotUrl( const ext = process.platform === 'win32' ? 'zip' : 'tar.gz'; const os = process.platform === 'win32' ? 'windows' : process.platform; - const name = license === 'oss' ? 'elasticsearch-oss' : 'elasticsearch'; + const name = 'elasticsearch'; const overrideUrl = customSnapshotUrl .replace('{name}', name) .replace('{ext}', ext) diff --git a/packages/kbn-es/src/install/install_archive.ts b/packages/kbn-es/src/install/install_archive.ts index 352b0fe6007db..78e200d4d47fb 100644 --- a/packages/kbn-es/src/install/install_archive.ts +++ b/packages/kbn-es/src/install/install_archive.ts @@ -66,17 +66,15 @@ export async function installArchive(archive: string, options?: InstallArchiveOp fs.mkdirSync(tmpdir, { recursive: true }); log.info('created %s', chalk.bold(tmpdir)); - if (license !== 'oss') { - // starting in 6.3, security is disabled by default. Since we bootstrap - // the keystore, we can enable security ourselves. - await appendToConfig(installPath, 'xpack.security.enabled', 'true'); + // starting in 6.3, security is disabled by default. Since we bootstrap + // the keystore, we can enable security ourselves. + await appendToConfig(installPath, 'xpack.security.enabled', 'true'); - await appendToConfig(installPath, 'xpack.license.self_generated.type', license); - await configureKeystore(installPath, log, [ - ['bootstrap.password', password], - ...parseSettings(esArgs, { filter: SettingsFilter.SecureOnly }), - ]); - } + await appendToConfig(installPath, 'xpack.license.self_generated.type', license); + await configureKeystore(installPath, log, [ + ['bootstrap.password', password], + ...parseSettings(esArgs, { filter: SettingsFilter.SecureOnly }), + ]); return { installPath }; } diff --git a/packages/kbn-es/src/utils/build_snapshot.ts b/packages/kbn-es/src/utils/build_snapshot.ts index 46d14910a27c2..ec20fc64d8f4b 100644 --- a/packages/kbn-es/src/utils/build_snapshot.ts +++ b/packages/kbn-es/src/utils/build_snapshot.ts @@ -31,9 +31,6 @@ interface BuildSnapshotOptions { * :distribution:archives:darwin-tar:assemble * :distribution:archives:linux-tar:assemble * :distribution:archives:windows-zip:assemble - * :distribution:archives:oss-darwin-tar:assemble - * :distribution:archives:oss-linux-tar:assemble - * :distribution:archives:oss-windows-zip:assemble */ export async function buildSnapshot({ license, @@ -67,15 +64,13 @@ export async function buildSnapshot({ } export function archiveForPlatform(platform: NodeJS.Platform, license: string) { - const taskPrefix = license === 'oss' ? 'oss-' : ''; - switch (platform) { case 'darwin': - return { format: 'tar', ext: 'tar.gz', task: `${taskPrefix}darwin-tar`, platform: 'darwin' }; + return { format: 'tar', ext: 'tar.gz', task: 'darwin-tar', platform: 'darwin' }; case 'win32': - return { format: 'zip', ext: 'zip', task: `${taskPrefix}windows-zip`, platform: 'windows' }; + return { format: 'zip', ext: 'zip', task: 'windows-zip', platform: 'windows' }; case 'linux': - return { format: 'tar', ext: 'tar.gz', task: `${taskPrefix}linux-tar`, platform: 'linux' }; + return { format: 'tar', ext: 'tar.gz', task: 'linux-tar', platform: 'linux' }; default: throw new Error(`unsupported platform: ${platform}`); } From 5900dff07d3be859e67189c24ae3853e0287e9ac Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Thu, 9 Nov 2023 16:26:19 -0600 Subject: [PATCH 21/51] [Security Solution] unskip serverless for expandable flyout right panel (#170189) --- .../alert_details_right_panel.cy.ts | 174 ++++++++---------- .../screens/expandable_flyout/common.ts | 9 +- .../alert_details_right_panel.ts | 29 ++- .../cypress/tasks/expandable_flyout/common.ts | 32 ---- 4 files changed, 98 insertions(+), 146 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts index 950d804ae352c..ed4476bcfe450 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts @@ -8,20 +8,11 @@ import { upperFirst } from 'lodash'; import { - DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON, - DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_DESCRIPTION_INPUT, - DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_NAME_INPUT, EXISTING_CASE_SELECT_BUTTON, VIEW_CASE_TOASTER_LINK, } from '../../../../screens/expandable_flyout/common'; -import { - createNewCaseFromCases, - expandFirstAlertExpandableFlyout, - navigateToAlertsPage, - navigateToCasesPage, -} from '../../../../tasks/expandable_flyout/common'; -import { ALERT_CHECKBOX } from '../../../../screens/alerts'; -import { CASE_DETAILS_PAGE_TITLE } from '../../../../screens/case_details'; +import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; +import { ALERT_CHECKBOX, EMPTY_ALERT_TABLE } from '../../../../screens/alerts'; import { DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON, DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON, @@ -51,6 +42,7 @@ import { import { collapseDocumentDetailsExpandableFlyoutLeftSection, expandDocumentDetailsExpandableFlyoutLeftSection, + fillOutFormToCreateNewCase, openJsonTab, openTableTab, openTakeActionButton, @@ -65,8 +57,7 @@ import { getNewRule } from '../../../../objects/rule'; import { ALERTS_URL } from '../../../../urls/navigation'; import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule'; -// FLAKY: https://github.com/elastic/kibana/issues/168317 -describe.skip('Alert details expandable flyout right panel', () => { +describe('Alert details expandable flyout right panel', { tags: ['@ess', '@serverless'] }, () => { const rule = getNewRule(); beforeEach(() => { @@ -77,14 +68,14 @@ describe.skip('Alert details expandable flyout right panel', () => { waitForAlertsToPopulate(); }); - it('should display header and footer basics', { tags: ['@ess', '@serverless'] }, () => { + it('should display header and footer basics', () => { expandFirstAlertExpandableFlyout(); - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('be.visible').and('have.text', rule.name); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('have.text', rule.name); - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_STATUS).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_STATUS).should('have.text', 'open'); - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE).should('have.text', 'Risk score:'); cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE_VALUE) .should('be.visible') .and('have.text', rule.risk_score); @@ -95,72 +86,65 @@ describe.skip('Alert details expandable flyout right panel', () => { cy.log('Verify all 3 tabs are visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB).should('be.visible').and('have.text', 'Overview'); - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB).should('be.visible').and('have.text', 'Table'); - cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB).should('be.visible').and('have.text', 'JSON'); + cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB) + .should('have.text', 'Overview') + .and('have.class', 'euiTab-isSelected'); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB) + .should('have.text', 'Table') + .and('not.have.class', 'euiTab-isSelected'); + cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB) + .should('have.text', 'JSON') + .and('not.have.class', 'euiTab-isSelected'); cy.log('Verify the expand/collapse button is visible and functionality works'); expandDocumentDetailsExpandableFlyoutLeftSection(); - cy.get(DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON) - .should('be.visible') - .and('have.text', 'Collapse details'); + cy.get(DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON).should('have.text', 'Collapse details'); collapseDocumentDetailsExpandableFlyoutLeftSection(); - cy.get(DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON) - .should('be.visible') - .and('have.text', 'Expand details'); + cy.get(DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON).should('have.text', 'Expand details'); cy.log('Verify the take action button is visible on all tabs'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).scrollIntoView(); cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); openTableTab(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).scrollIntoView(); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB).should('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); openJsonTab(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).scrollIntoView(); + cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB).should('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); }); // TODO this will change when add to existing case is improved // https://github.com/elastic/security-team/issues/6298 - it('should add to existing case', { tags: ['@ess', '@serverless'] }, () => { - navigateToCasesPage(); - createNewCaseFromCases(); - - cy.get(CASE_DETAILS_PAGE_TITLE).should('be.visible').and('have.text', 'case'); - navigateToAlertsPage(); + it('should add to existing case', () => { expandFirstAlertExpandableFlyout(); + openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE); + fillOutFormToCreateNewCase(); openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_EXISTING_CASE); cy.get(EXISTING_CASE_SELECT_BUTTON).should('be.visible').contains('Select').click(); + cy.get(VIEW_CASE_TOASTER_LINK).should('be.visible').and('contain.text', 'View case'); }); // TODO this will change when add to new case is improved // https://github.com/elastic/security-team/issues/6298 - it('should add to new case', { tags: ['@ess', '@serverless'] }, () => { + it('should add to new case', () => { expandFirstAlertExpandableFlyout(); openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE); - - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_NAME_INPUT).type('case'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_DESCRIPTION_INPUT).type( - 'case description' - ); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON).click(); + fillOutFormToCreateNewCase(); cy.get(VIEW_CASE_TOASTER_LINK).should('be.visible').and('contain.text', 'View case'); }); - // Issue reported int: https://github.com/elastic/kibana/issues/167809 - it('should mark as acknowledged', { tags: ['@ess', '@brokenInServerless'] }, () => { - cy.get(ALERT_CHECKBOX).should('have.length', 2); + it('should mark as acknowledged', () => { + cy.get(ALERT_CHECKBOX).should('have.length', 1); expandFirstAlertExpandableFlyout(); openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_MARK_AS_ACKNOWLEDGED); @@ -169,68 +153,62 @@ describe.skip('Alert details expandable flyout right panel', () => { // cy.get(KIBANA_TOAST) // .should('be.visible') // .and('have.text', 'Successfully marked 1 alert as acknowledged.'); - cy.get(ALERT_CHECKBOX).should('have.length', 1); + cy.get(EMPTY_ALERT_TABLE).should('exist'); }); - // Issue reported int: https://github.com/elastic/kibana/issues/167809 - it('should mark as closed', { tags: ['@ess', '@brokenInServerless'] }, () => { - cy.get(ALERT_CHECKBOX).should('have.length', 2); + it('should mark as closed', () => { + cy.get(ALERT_CHECKBOX).should('have.length', 1); expandFirstAlertExpandableFlyout(); openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_MARK_AS_CLOSED); // TODO figure out how to verify the toasts pops up // cy.get(KIBANA_TOAST).should('be.visible').and('have.text', 'Successfully closed 1 alert.'); - cy.get(ALERT_CHECKBOX).should('have.length', 1); + cy.get(EMPTY_ALERT_TABLE).should('exist'); }); // these actions are now grouped together as we're not really testing their functionality but just the existence of the option in the dropdown - // Issue reported int: https://github.com/elastic/kibana/issues/167809 - it( - 'should test other action within take action dropdown', - { tags: ['@ess', '@brokenInServerless'] }, - () => { - expandFirstAlertExpandableFlyout(); - - cy.log('should add endpoint exception'); - - // TODO figure out why this option is disabled in Cypress but not running the app locally - // https://github.com/elastic/security-team/issues/6300 - openTakeActionButton(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_ENDPOINT_EXCEPTION).should('be.disabled'); - - cy.log('should add rule exception'); - - // TODO this isn't fully testing the add rule exception yet - // https://github.com/elastic/security-team/issues/6301 - selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_HEADER).should('be.visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_CANCEL_BUTTON) - .should('be.visible') - .click(); - - // cy.log('should isolate host'); - - // TODO figure out why isolate host isn't showing up in the dropdown - // https://github.com/elastic/security-team/issues/6302 - // openTakeActionButton(); - // cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ISOLATE_HOST).should('be.visible'); - - cy.log('should respond'); - - // TODO this will change when respond is improved - // https://github.com/elastic/security-team/issues/6303 - openTakeActionButton(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_RESPOND).should('be.disabled'); - - cy.log('should investigate in timeline'); - - selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_SECTION) - .first() - .within(() => - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_ENTRY).should('be.visible') - ); - } - ); + it('should test other action within take action dropdown', () => { + expandFirstAlertExpandableFlyout(); + + cy.log('should add endpoint exception'); + + // TODO figure out why this option is disabled in Cypress but not running the app locally + // https://github.com/elastic/security-team/issues/6300 + openTakeActionButton(); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_ENDPOINT_EXCEPTION).should('be.disabled'); + + cy.log('should add rule exception'); + + // TODO this isn't fully testing the add rule exception yet + // https://github.com/elastic/security-team/issues/6301 + selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_HEADER).should('exist'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_CANCEL_BUTTON) + .should('be.visible') + .click(); + + // cy.log('should isolate host'); + + // TODO figure out why isolate host isn't showing up in the dropdown + // https://github.com/elastic/security-team/issues/6302 + // openTakeActionButton(); + // cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ISOLATE_HOST).should('be.visible'); + + cy.log('should respond'); + + // TODO this will change when respond is improved + // https://github.com/elastic/security-team/issues/6303 + openTakeActionButton(); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_RESPOND).should('be.disabled'); + + cy.log('should investigate in timeline'); + + selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_SECTION) + .first() + .within(() => + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_ENTRY).should('exist') + ); + }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/common.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/common.ts index bc0119464374c..f3c0df5cf8f31 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/common.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/common.ts @@ -10,18 +10,13 @@ import { getDataTestSubjectSelectorStartWith, } from '../../helpers/common'; -export const KIBANA_NAVBAR_ALERTS_PAGE = getDataTestSubjectSelector( - 'solutionSideNavItemLink-alerts' -); -export const KIBANA_NAVBAR_CASES_PAGE = getDataTestSubjectSelector('solutionSideNavItemLink-cases'); export const VIEW_CASE_TOASTER_LINK = getDataTestSubjectSelector('toaster-content-case-view-link'); -export const CREATE_CASE_BUTTON = `[data-test-subj="createNewCaseBtn"]`; export const NEW_CASE_NAME_INPUT = `[data-test-subj="input"][aria-describedby="caseTitle"]`; export const NEW_CASE_DESCRIPTION_INPUT = getDataTestSubjectSelector('euiMarkdownEditorTextArea'); -export const NEW_CASE_CREATE_BUTTON = getDataTestSubjectSelector('create-case-submit'); export const EXISTING_CASE_SELECT_BUTTON = getDataTestSubjectSelectorStartWith('cases-table-row-select-'); export const DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_NAME_INPUT = NEW_CASE_NAME_INPUT; export const DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_DESCRIPTION_INPUT = NEW_CASE_DESCRIPTION_INPUT; -export const DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON = NEW_CASE_CREATE_BUTTON; +export const DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON = + getDataTestSubjectSelector('create-case-submit'); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel.ts index 350c069639870..11e1b6a0b0ef9 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel.ts @@ -13,9 +13,15 @@ import { DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON, DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON_DROPDOWN, DOCUMENT_DETAILS_FLYOUT_JSON_TAB, - DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB, } from '../../screens/expandable_flyout/alert_details_right_panel'; +import { + DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON, + DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_DESCRIPTION_INPUT, + DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_NAME_INPUT, + VIEW_CASE_TOASTER_LINK, +} from '../../screens/expandable_flyout/common'; +import { TOASTER_CLOSE_ICON } from '../../screens/alerts_detection_rules'; /* Header */ @@ -35,14 +41,6 @@ export const collapseDocumentDetailsExpandableFlyoutLeftSection = () => { cy.get(DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON).click(); }; -/** - * Open the Overview tab in the document details expandable flyout right section - */ -export const openOverviewTab = () => { - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB).scrollIntoView(); - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB).click(); -}; - /** * Open the Table tab in the document details expandable flyout right section */ @@ -95,3 +93,16 @@ export const selectTakeActionItem = (option: string) => { .should('be.visible') .within(() => cy.get(option).should('be.visible').click()); }; + +/** + * Create new case from the expandable flyout take action button + */ +export const fillOutFormToCreateNewCase = () => { + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_NAME_INPUT).type('case'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_DESCRIPTION_INPUT).type('case description'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON).click(); + + cy.get(VIEW_CASE_TOASTER_LINK).should('be.visible'); + cy.get(TOASTER_CLOSE_ICON).should('be.visible').click(); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/common.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/common.ts index 424d723e732b5..bc1d8e1cd8171 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/common.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/common.ts @@ -8,33 +8,13 @@ import { EXPAND_ALERT_BTN } from '../../screens/alerts'; import { DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE } from '../../screens/expandable_flyout/alert_details_right_panel'; import { - CREATE_CASE_BUTTON, DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_CREATE_BUTTON, DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_DESCRIPTION_INPUT, DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE_NAME_INPUT, - KIBANA_NAVBAR_ALERTS_PAGE, - KIBANA_NAVBAR_CASES_PAGE, - NEW_CASE_CREATE_BUTTON, - NEW_CASE_DESCRIPTION_INPUT, - NEW_CASE_NAME_INPUT, VIEW_CASE_TOASTER_LINK, } from '../../screens/expandable_flyout/common'; import { openTakeActionButtonAndSelectItem } from './alert_details_right_panel'; -/** - * Navigates to the alerts page by clicking on the Kibana sidenav entry - */ -export const navigateToAlertsPage = () => { - cy.get(KIBANA_NAVBAR_ALERTS_PAGE).should('be.visible').click(); -}; - -/** - * Navigates to the cases page by clicking on the Kibana sidenav entry - */ -export const navigateToCasesPage = () => { - cy.get(KIBANA_NAVBAR_CASES_PAGE).click(); -}; - /** * Find the first alert row in the alerts table then click on the expand icon button to open the flyout */ @@ -42,18 +22,6 @@ export const expandFirstAlertExpandableFlyout = () => { cy.get(EXPAND_ALERT_BTN).first().click(); }; -/** - * Create a new case from the cases page - */ -export const createNewCaseFromCases = () => { - cy.get(CREATE_CASE_BUTTON).should('be.visible').click(); - cy.get(NEW_CASE_NAME_INPUT).should('be.visible').click(); - cy.get(NEW_CASE_NAME_INPUT).type('case'); - cy.get(NEW_CASE_DESCRIPTION_INPUT).should('be.visible').click(); - cy.get(NEW_CASE_DESCRIPTION_INPUT).type('case description'); - cy.get(NEW_CASE_CREATE_BUTTON).should('be.visible').click(); -}; - /** * create a new case from the expanded expandable flyout */ From afd020c63da1aff540b778e2e4303723ee15e00d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 10 Nov 2023 00:16:29 +0000 Subject: [PATCH 22/51] chore(NA): exports target branch when using a merge queue system at buildkite env script (#170918) This PR adds the ability for us to have an env var on buildkite to allow us to understand what is the final end target when running inside a merge queue environment. It will be useful to redirect a couple of dependent scripts that will start running inside the merge queue environment once we activate it again --------- Co-authored-by: Jon --- .buildkite/scripts/common/env.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.buildkite/scripts/common/env.sh b/.buildkite/scripts/common/env.sh index ccaeb7b0dc5d9..3e086cb4505ec 100755 --- a/.buildkite/scripts/common/env.sh +++ b/.buildkite/scripts/common/env.sh @@ -28,6 +28,24 @@ export KIBANA_BASE_BRANCH="$KIBANA_PKG_BRANCH" KIBANA_PKG_VERSION="$(jq -r .version "$KIBANA_DIR/package.json")" export KIBANA_PKG_VERSION +# Detects and exports the final target branch when using a merge queue +if [[ "$BUILDKITE_BRANCH" == "gh-readonly-queue"* ]]; then + # removes gh-readonly-queue/ + BKBRANCH_WITHOUT_GH_MQ_PREFIX="${BUILDKITE_BRANCH#gh-readonly-queue/}" + + # extracts target mqueue branch + MERGE_QUEUE_TARGET_BRANCH=${BKBRANCH_WITHOUT_GH_MQ_PREFIX%/*} +else + MERGE_QUEUE_TARGET_BRANCH="" +fi +export MERGE_QUEUE_TARGET_BRANCH + +# Exports BUILDKITE_BRANCH_MERGE_QUEUE which will use the value from MERGE_QUEUE_TARGET_BRANCH if defined otherwise +# will fallback to BUILDKITE_BRANCH. +BUILDKITE_BRANCH_MERGE_QUEUE="${MERGE_QUEUE_TARGET_BRANCH:-$BUILDKITE_BRANCH}" +export BUILDKITE_BRANCH_MERGE_QUEUE + + BUILDKITE_AGENT_GCP_REGION="" if [[ "$(curl -is metadata.google.internal || true)" ]]; then # projects/1003139005402/zones/us-central1-a -> us-central1-a -> us-central1 From f933647be8206a8487f1ad42b499a146ba2e6360 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 10 Nov 2023 03:33:17 +0000 Subject: [PATCH 23/51] skip failing es promotion suites (#170999) --- .../apis/management/index_management/component_templates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts index 0065057d762f4..6e2b7ba71e86b 100644 --- a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts +++ b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts @@ -26,7 +26,8 @@ export default function ({ getService }: FtrProviderContext) { createDatastream, } = initElasticsearchHelpers(getService); - describe('Component templates', function () { + // FLAKY: https://github.com/elastic/kibana/issues/170999 + describe.skip('Component templates', function () { after(async () => { await cleanUpIndexTemplates(); await cleanUpComponentTemplates(); From 69b2cb39736fe9501e007c21b29b431c8027857e Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 10 Nov 2023 00:55:38 -0500 Subject: [PATCH 24/51] [api-docs] 2023-11-10 Daily api_docs build (#171000) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/517 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.devdocs.json | 14 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- .../kbn_core_capabilities_server.devdocs.json | 101 ++- api_docs/kbn_core_capabilities_server.mdx | 4 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 68 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_es.devdocs.json | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.devdocs.json | 15 + api_docs/kbn_rule_data_utils.mdx | 4 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.devdocs.json | 600 +++++++++++++++--- api_docs/kbn_slo_schema.mdx | 4 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_subscription_tracking.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 268 ++++++-- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_log_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 10 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 606 files changed, 1466 insertions(+), 814 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 344807ea5132d..cfe971c8e01be 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index a2a6b40a9ccdd..7c724461a9e3e 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index b46a05e2363df..354011bbf232e 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 49ca7191cd276..46fcda0e2c7ce 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 36f382bc36132..35ca4197656a2 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 43d328df9039b..2b0e99da57c3f 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 4e295dca50997..df03fe9929c53 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index ec9c5e5473002..8ad89dcc15273 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 89cf976b4622f..8d55782e5e45d 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 060faaa44edc3..7de5bd76bdd44 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index fb10c175a2302..8efe25d7afca9 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 629ce39be1ef5..cc578932d279f 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index cb2127c8505ea..ba8c180b3c6ec 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index f8abeae02963f..1b8c2248a5190 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 09026ff0f4476..6a65f733471f3 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 81474e3ab7ca8..df453622062a9 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index fe937c723cc0a..198f9b4c75c7a 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index f0d0e702a2b4d..de571179a25c4 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index db12cae107313..bd57fd4ca7cd2 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 7572819ba54e9..3de4ebbf9f68f 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 8d6cfaa78fa05..e9d35f1e18a95 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 6536f0bb6f0e0..94b24cd8ddbe0 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 4d436399dd6ff..669ff705a81de 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 16b5857c07cf0..67837e8e89bef 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index be2d9d8750f93..6d3f601824fae 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index df638dcf093d7..44d105910a231 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 3d2e9d06d22b2..ad68e4efd36b6 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 8a627881d8e25..78443ee9661b8 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 86532f795550d..ef6968f88252e 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 6a72170ca2eb8..b7ab9bebaefdc 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index d11bb66eedd7c..a99330414e810 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 995d749149255..540826fdd6105 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index f528f151cc6b3..040f6fbead292 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 9a9ef2e3a32af..763c598f167b7 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 8d49eb79c439b..fcd8246f50352 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 618da8875e9b3..7399ac8d10609 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index eee34b2859336..2560ceff5721a 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index be96ff59a2a9a..4406ce8e35431 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 15322b822d1b7..389118ca73ba8 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 67453a2a6274a..69ff45a1b76f4 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 79ecd24c1f144..3814474a19718 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 2a8eb0f2160f0..683f865c62335 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index a4eb4e7f8058c..d4ead5258f45c 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 9979fcc1f61f3..b778008638278 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 0be3ead51ad11..cb2c5f6afd86b 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 77cb65e69eb63..67a44e81e21a6 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index e298adbb072d3..215034cef5227 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 3975741a49658..275cde683ddb8 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index a53b896de90c4..4826fc43a0cb1 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index e10c8812bc694..73f21468f7967 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 4f529919ee788..fbe776832cee1 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 21ede27908cd7..7df7e492abf66 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index d718a25a26886..d65cad5852ba5 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index ca69ef9c730d7..eb996bf5f6dbb 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 4ad0d0a4b033e..b20e31573ce0f 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 1819769eca519..6a35064c2b9e0 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 3b7997d5148be..b3bd8d94787b2 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 80b6090ec9bf5..bb7d4e54b665a 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 7c9035dc1a25c..ce33700ad9eae 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 23217edcda655..2abc263bab12a 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index f2936e776b367..3bfc54bff9421 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 70bcc3329a001..c098590e8f3aa 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 8ea88f0467676..940bf4813eb0f 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 014df4a3c1505..1acfc95029346 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 5ba13004e76a8..bf46c5e775d3b 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 7c95c19951cd1..cc2a4f021dc33 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 805bdaedf80fa..e5e76deedd669 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 2f28930fda786..76ace056690af 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 4e352ea4f03fa..8b01ecbd24e89 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index dfb72c9c2c124..8a8529e5ac1d2 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index b2f93eb65a44a..92a80f07a1cbf 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 3a530c412f322..2b3334256a6a6 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 85294a9426301..bcf41cc278360 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 876f2111604fd..663fa0cd35267 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 957dc08aa1338..8a9e88cf2db65 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index b019ca0c0d407..0b1e5ae24f771 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a48ffe71377ff..4c43e51e2d2ce 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index a2c63e47c48bc..8febe841d8e0c 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 15311fe69a911..94e5c48c4496c 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index c5dd7d818cbfa..5349f3af5fc60 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index ce2735b7c321f..39ef4801b139c 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index e4298d6fbd707..decbf54016491 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 7ce321468cc4c..a5d117d572322 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 8daefe2429c8a..ebbdbca8a9aaa 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index a033763e6e021..0b7dd80b3b3a9 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.devdocs.json b/api_docs/kbn_analytics_client.devdocs.json index b6c69aec07ca3..49f322df02d0f 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -796,15 +796,15 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.ts" }, { "plugin": "securitySolution", @@ -872,19 +872,19 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.test.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.test.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.test.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.test.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.test.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.test.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/tasks/risk_scoring_task.test.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/tasks/risk_scoring_task.test.ts" }, { "plugin": "@kbn/core-analytics-browser-mocks", diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index c5c36dbcbe364..7683e2bcb0267 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index b2a3e70841ff3..09c2b17d706d9 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 5d8d8c8b4dd2c..b4541ac4a4ad9 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 5115b70e1e2da..a40c3f4219596 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 05425f0e2d101..ca5f113a75fab 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 0437ad348e7cf..2df958d49823a 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 625ef98fdb119..de4b1ddda4dd5 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 1b2fb81f2a42f..b589198be82c3 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 4d61c4f6fab18..0b9ee3691bb01 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index b832156bd1b61..774ed2b89f517 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 27dbdcf751ae2..db125a6ec32dd 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 8701661ecf467..265aef6cd1063 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 37f2a6d0685e0..f7bff70376d92 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 53739bec858cc..9b3ade541eba7 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 4d85786eb2778..eb5afd131b328 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 66699c022bf2e..da16197e01961 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 72d6458a84cbb..683d382f170e7 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 88cd260cdba64..7e4341104281c 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 25001d7c88932..99384e0790712 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 06e29d0b56bdc..35ad1eedf78c0 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 4c6dfc56b99a1..9e51888259b4f 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 94475d709e84f..4f8985db93a7f 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 64c3cc5137f45..eff87cb5f2844 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index beaa056668544..cbd8024253a41 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 3e3e8f72664ae..1a35d390f9a61 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 5c86d95ce6cd5..e6c1a5458e2b5 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index e4232cd65aea9..ec4e5269bcf64 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 09291f5c2e352..b10cae22d456a 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 4697952a480bb..1469e133d487b 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index f03f1cba601c7..f712106cf8f09 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 4585636c2c211..6d359fc8194b8 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 0a3597f9d0a24..d3d0d35c6e692 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index f4b16d2ddc9d8..d35a823e2c64e 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 2d8b9ea7d93e1..9512f6077cc79 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 309cf898aa2e4..f968a4405c741 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index b228a4e9f74a4..cbcf773c9d7bb 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 8edef60f40ef1..20baf5fda9507 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index c2124609bfbab..9e7dcdcc5b9db 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 3d2224725e3ca..b74d90504b20c 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 2113da00397ae..8b2967a3980ff 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 207fd4ce683fb..738471d252a26 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index ed4d7be1c47a7..1c90a4d719469 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 8c3b2296b760d..c65cf3f6c3ace 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 3258c12ad837e..91d45dcd403bd 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 226b664174e92..aad01347e34dd 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 251378b2b4e09..346f7ae0cdf13 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index dde66329fb6b1..4b66e271eb6e9 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 3a8dbb54075e8..8c67aaf07c0c2 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.devdocs.json b/api_docs/kbn_core_capabilities_server.devdocs.json index 062051be28223..6c1f0a54810de 100644 --- a/api_docs/kbn_core_capabilities_server.devdocs.json +++ b/api_docs/kbn_core_capabilities_server.devdocs.json @@ -99,6 +99,14 @@ "section": "def-common.CapabilitiesSwitcher", "text": "CapabilitiesSwitcher" }, + ", options: ", + { + "pluginId": "@kbn/core-capabilities-server", + "scope": "common", + "docId": "kibKbnCoreCapabilitiesServerPluginApi", + "section": "def-common.CapabilitiesSwitcherOptions", + "text": "CapabilitiesSwitcherOptions" + }, ") => void" ], "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", @@ -125,6 +133,27 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/core-capabilities-server", + "id": "def-common.CapabilitiesSetup.registerSwitcher.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-capabilities-server", + "scope": "common", + "docId": "kibKbnCoreCapabilitiesServerPluginApi", + "section": "def-common.CapabilitiesSwitcherOptions", + "text": "CapabilitiesSwitcherOptions" + } + ], + "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [] @@ -152,7 +181,7 @@ "tags": [], "label": "resolveCapabilities", "description": [ - "\nResolve the {@link Capabilities} to be used for given request" + "\nResolve the {@link Capabilities} to be used for given request\n" ], "signature": [ "(request: ", @@ -163,7 +192,7 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - ", options?: ", + ", options: ", { "pluginId": "@kbn/core-capabilities-server", "scope": "common", @@ -171,7 +200,7 @@ "section": "def-common.ResolveCapabilitiesOptions", "text": "ResolveCapabilitiesOptions" }, - " | undefined) => Promise<", + ") => Promise<", { "pluginId": "@kbn/core-capabilities-common", "scope": "common", @@ -191,7 +220,9 @@ "type": "Object", "tags": [], "label": "request", - "description": [], + "description": [ + "The request to resolve capabilities for" + ], "signature": [ { "pluginId": "@kbn/core-http-server", @@ -221,13 +252,12 @@ "docId": "kibKbnCoreCapabilitiesServerPluginApi", "section": "def-common.ResolveCapabilitiesOptions", "text": "ResolveCapabilitiesOptions" - }, - " | undefined" + } ], "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", "deprecated": false, "trackAdoption": false, - "isRequired": false + "isRequired": true } ], "returnComment": [] @@ -235,6 +265,38 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-capabilities-server", + "id": "def-common.CapabilitiesSwitcherOptions", + "type": "Interface", + "tags": [], + "label": "CapabilitiesSwitcherOptions", + "description": [ + "\nOptions for the {@link CapabilitiesSetup.registerSwitcher} API.\n" + ], + "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-capabilities-server", + "id": "def-common.CapabilitiesSwitcherOptions.capabilityPath", + "type": "CompoundType", + "tags": [], + "label": "capabilityPath", + "description": [ + "\nThe path(s) of capabilities the switcher may alter. The '*' wildcard is supported as a suffix only.\n\nE.g. capabilityPath: \"myPlugin.*\" or capabilityPath: \"myPlugin.myKey\"" + ], + "signature": [ + "string | string[]" + ], + "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-capabilities-server", "id": "def-common.ResolveCapabilitiesOptions", @@ -242,20 +304,39 @@ "tags": [], "label": "ResolveCapabilitiesOptions", "description": [ - "\nDefines a set of additional options for the `resolveCapabilities` method of {@link CapabilitiesStart}.\n" + "\nOptions for {@link CapabilitiesStart.resolveCapabilities}.\n" ], "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "@kbn/core-capabilities-server", + "id": "def-common.ResolveCapabilitiesOptions.capabilityPath", + "type": "CompoundType", + "tags": [], + "label": "capabilityPath", + "description": [ + "\nThe path(s) of capabilities that the API consumer is interested in. The '*' wildcard is supported as a suffix only.\n\nE.g. capabilityPath: \"*\" or capabilityPath: \"myPlugin.*\" or capabilityPath: \"myPlugin.myKey\"\n" + ], + "signature": [ + "string | string[]" + ], + "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-capabilities-server", "id": "def-common.ResolveCapabilitiesOptions.useDefaultCapabilities", - "type": "boolean", + "type": "CompoundType", "tags": [], "label": "useDefaultCapabilities", "description": [ - "\nIndicates if capability switchers are supposed to return a default set of capabilities." + "\nIndicates if capability switchers are supposed to return a default set of capabilities.\n\nDefaults to `false`" + ], + "signature": [ + "boolean | undefined" ], "path": "packages/core/capabilities/core-capabilities-server/src/contracts.ts", "deprecated": false, diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index e749a37ace742..0cc75d1b69d90 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 16 | 0 | 7 | 0 | +| 20 | 0 | 7 | 0 | ## Common diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 190228528e7e9..820464c9b28aa 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index c5954ad61a0ec..89a72cbb0cfa8 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 11cbf264304a2..0fa1b61f658da 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 429593f78c724..aaab43682fe35 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 5aaf838342d34..68a60606dcd27 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 25d3faad0703d..44cc5278fd53b 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 5bd0dbea761bd..3608be1d96e46 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 080a8fdce04f0..9997ac0c27a7c 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index e93316cc35426..394ac4e44941d 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 46b6f7575f58a..30ee602f5fd7b 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 37ec8ad4f5499..2202c66110f4c 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 61f0b0dc8e2c0..e6b20f63b2074 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 2fc417d17b8be..78ad726dad015 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 07c42501f61cd..2af0d1fde963c 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 44bd5f23b2bb7..bf788ba7abf12 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 93633492d4228..464fb71e20fe8 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 692a0e89b64df..3f7a9d7414ed7 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 42794fb65bbde..b045cd749cabb 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 6ad48246e6314..0be92f2766113 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 635ad66568bdb..f4774a5a75447 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 92987ba43d591..3d93b32ce0017 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index edfe0586a4ace..d0c3624f10f6a 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 91236179b066a..9d7fb20dc9e27 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index df2e2045c3235..ca3a588fff62a 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index cf4e0a5bc2f0a..0315f579853c6 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index e268cce98dab0..2c48581f0b683 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 2b8f0360f08f6..109b228419c35 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index c31fe4d79fc8d..f46045bcdf1aa 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 35437dde95171..ed746cb511d11 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index eea3f43d0a6fa..a280d52377d60 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 405e300256fb4..1e527a1aa7a94 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index ad6333fe15333..0d3e541882929 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index ae89b5cf1f34e..6b74411a76b27 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 467dd5ecf0ddf..47ab866be2215 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 1f5b0c1ff55fe..2cafb5f2afa49 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 89815876f5e6d..92637b63638df 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 80e7d4a98e8a8..636d191bd921d 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index e72d91c4c4c5f..4abfa985ba28e 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 29a11eb7c331b..958c1086e2672 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 18c7fa52fe179..fd5258e49d831 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 9fd700842c09b..788743a3aedd4 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 26a2d106a963c..2bfde8199d4af 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 8e5d98c54213f..14e0ba6c45aae 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 91eff09d50d38..67cf62397ce85 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 74c361a888122..4d5ad2996daf2 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 48615d2a8dfab..753a7d5f550df 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 8aed458d214d9..8ccbc2e1c91f7 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 385daee249506..c9d6ae227fb9c 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index b2a59e0bcb5e0..c5166c225b4b0 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index be2c3b3b165c9..7798bb1d4ebed 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -105,9 +105,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.AddVersionOpts", "type": "Interface", - "tags": [ - "experimental" - ], + "tags": [], "label": "AddVersionOpts", "description": [ "\nOptions for a versioned route. Probably needs a lot more options like sunsetting\nof an endpoint etc." @@ -130,9 +128,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.AddVersionOpts.version", "type": "string", - "tags": [ - "experimental" - ], + "tags": [], "label": "version", "description": [ "\nVersion to assign to this route" @@ -145,9 +141,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.AddVersionOpts.validate", "type": "CompoundType", - "tags": [ - "experimental" - ], + "tags": [], "label": "validate", "description": [ "\nValidation for this version of a route" @@ -1003,9 +997,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.FullValidationConfig", "type": "Interface", - "tags": [ - "experimental" - ], + "tags": [], "label": "FullValidationConfig", "description": [ "\nVersioned route validation" @@ -1028,9 +1020,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.FullValidationConfig.request", "type": "CompoundType", - "tags": [ - "experimental" - ], + "tags": [], "label": "request", "description": [ "\nValidation to run against route inputs: params, query and body" @@ -1054,8 +1044,7 @@ "id": "def-common.FullValidationConfig.response", "type": "Object", "tags": [ - "note", - "experimental" + "note" ], "label": "response", "description": [ @@ -12689,9 +12678,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRoute", "type": "Interface", - "tags": [ - "experimental" - ], + "tags": [], "label": "VersionedRoute", "description": [ "\nA versioned route" @@ -12714,9 +12701,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRoute.addVersion", "type": "Function", - "tags": [ - "experimental" - ], + "tags": [], "label": "addVersion", "description": [ "\nAdd a new version of this route" @@ -12859,9 +12844,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRouter", "type": "Interface", - "tags": [ - "experimental" - ], + "tags": [], "label": "VersionedRouter", "description": [ "\nA router, very similar to {@link IRouter} that will return an {@link VersionedRoute}\ninstead.\n" @@ -12885,7 +12868,6 @@ "id": "def-common.VersionedRouter.get", "type": "Function", "tags": [ - "experimental", "track-adoption" ], "label": "get", @@ -13559,7 +13541,7 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_engine_status_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_status_route.ts" }, { "plugin": "securitySolution", @@ -13837,7 +13819,6 @@ "id": "def-common.VersionedRouter.put", "type": "Function", "tags": [ - "experimental", "track-adoption" ], "label": "put", @@ -14109,7 +14090,6 @@ "id": "def-common.VersionedRouter.post", "type": "Function", "tags": [ - "experimental", "track-adoption" ], "label": "post", @@ -14819,23 +14799,23 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_score_preview_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_score_preview_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_engine_init_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_init_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_engine_enable_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_enable_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_engine_disable_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_engine_disable_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/risk_engine/routes/risk_score_calculation_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/routes/risk_score_calculation_route.ts" }, { "plugin": "securitySolution", @@ -15025,7 +15005,6 @@ "id": "def-common.VersionedRouter.patch", "type": "Function", "tags": [ - "experimental", "track-adoption" ], "label": "patch", @@ -15153,7 +15132,6 @@ "id": "def-common.VersionedRouter.delete", "type": "Function", "tags": [ - "experimental", "track-adoption" ], "label": "delete", @@ -15399,9 +15377,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRouteResponseValidation", "type": "Interface", - "tags": [ - "experimental" - ], + "tags": [], "label": "VersionedRouteResponseValidation", "description": [], "path": "packages/core/http/core-http-server/src/versioning/types.ts", @@ -17844,9 +17820,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRouteConfig", "type": "Type", - "tags": [ - "experimental" - ], + "tags": [], "label": "VersionedRouteConfig", "description": [ "\nConfiguration for a versioned route" @@ -17879,9 +17853,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRouteRegistrar", "type": "Type", - "tags": [ - "experimental" - ], + "tags": [], "label": "VersionedRouteRegistrar", "description": [ "\nCreate an {@link VersionedRoute | versioned route}.\n" @@ -17951,9 +17923,7 @@ "parentPluginId": "@kbn/core-http-server", "id": "def-common.VersionedRouteRequestValidation", "type": "Type", - "tags": [ - "experimental" - ], + "tags": [], "label": "VersionedRouteRequestValidation", "description": [], "signature": [ diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index b5a6ed17e9528..a2c5bb67042a2 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 1a321803586a3..dd9452034c3bb 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 592a487137d7c..a8db8d4b21063 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 4fd9d08f9048e..4e787a04108be 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 6c59ee7599e21..467a4d2d7775b 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index a58614974cf24..f1956673ae7dd 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 5d0a734d1b2c3..fb3584a8f3fd3 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 24b0478a8aa73..1bffca1a004ab 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index ffada5d962a97..2b66e8eea0274 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index c09b4ee600d1f..f5623c603bd32 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index b5e6516038802..502f2a91308d0 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 11d14be91b38d..2b71abfc1ea8a 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 23308f7893c9a..9ca5ba14fbd83 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 88f1f242d9b8d..e1df7f4daea4b 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 3cdf970e13a61..b82e8a97c2d3a 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 1435a3b8801a7..df33f5414b56c 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index d70a9d0840daf..2719840e0362d 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index c95657c8f9cb9..65c9b911db15a 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 99d1cc738688f..2e1b08ebff16d 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 480dda23e0e6e..9381b0609991f 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index d7beed8118214..0ed40f70fa83d 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index d8e4327951340..f2b43f07cf11a 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 79fedf5392ea3..c184d56ab961f 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 692fcb3d4a911..e690a1a81c64e 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 2a600df292c2d..57cfb003b4051 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index b69b9f631f062..037f00fc1f2d4 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index b1ca302842941..e95d84d0fd7b1 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 02b282f2f033b..b59392aaeab6d 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 781da4845e02f..356d844323c81 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index d6337b83c13dc..6ee83a5d07fc1 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 800a3fb3d73bc..b9eda3aeff037 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 25e8a18ef474d..304696001866f 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 78b799734d2f3..085e40c56353a 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 8d4e9411e5381..3dd4adf128eb0 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 859828d6f64a3..8208fd34bcb45 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index cdfe21e88848e..1602a02dcea98 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 79f333e28c616..46a90d1cfcb72 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index b10478d876d27..a967dab339293 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 9014806598a62..90d1e2f22fe49 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 87a01f07b32da..dd5d2d6b365bc 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 7f85d09a9395d..f0978ccf5b1ea 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index d0a262e2a55df..afdb69e301635 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 762b4d0d17ca7..06b9e164301cb 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index ac60d73d17db0..588f6037cd1c6 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 07219474b2b0a..77eea817ce0c5 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 63ee8075087d6..8513fdbbcad6e 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 0bb5e523a3f7a..e2bedb048a9f8 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 6fbc4a9898fd3..181855a71a163 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 981d23a6e54fc..bb591388bd00b 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index cf3aa89e27729..8c8a4b5806f76 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 41242f7e42e6f..32ed91ad28a58 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index a31114b190341..658783e787c8f 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 33ecafd8a2f88..c4ea045c5d3ee 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 2c58d47cd0780..42c46012ed39d 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index e99b3eda698e4..a9c52995de521 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index c47cfaa541254..8c2d3b9195109 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index da54e0839ac0a..c37f9837a5166 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 75e2c7938710e..5d8322dd56ccc 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 874ef35853c40..3ffd7a95e8d43 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 7c1f0a84a4b82..912efca92b422 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 18f9948a40385..d6ac3fd90180a 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index ae89cf3a98457..1d08581d41ead 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 19cf620c10cdd..c56345a83ea35 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 7f8baf121215f..48b5572776339 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index bd2c8161f22fa..abe953e28d4a0 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index f65f5b44702b3..23392fefa6849 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index b6fe72d41cbe9..74130005e0b64 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 1c89712b97770..2405cae42ef0c 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 2f91a6bbd321a..9a830bc84f884 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 324036600778a..c44712e5ae99a 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index c5ac2de0d44c9..d57a951dc1236 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 71aa4202e64e4..370cc73d276c0 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index b364600190736..e6b5c40790fcb 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 41a80549ed4a7..cb5f59e90c280 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index b474db754102a..e818714e9c4f0 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 7e0524e0b4e24..cb33695a1bf1b 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index e36fe42be9c8f..3eb2726ff8dff 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 1b7eb9df4f5ae..0f9136192ab62 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 052412b877fd3..ff557a6ee5c84 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 4974df0266f2f..2437e23b3b063 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index df5a9e4609162..589502a6c70fb 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index d2090ee39a84b..695476f91b912 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 5429bc8d8d372..b4c5a99ac8c7c 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index db298418a1472..81e05e971d7b9 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index c69c42d7f1d64..0aaf205f33fbd 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 0cb78a8d62341..f325a7cd1500f 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 9dd0a5ac598ed..65f3204acdfcb 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index c022b8fcb4da2..036325e5cc1fe 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 63256de70c435..c5c0450197241 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 72f0067780b71..8c6fa7792422a 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 9c7a65a3f50fa..3557220b3b2a6 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 86512f12aa6db..6790f3501e4ad 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 2a7d7cfc9a2f3..14801203ee2e8 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 2a89e71bd1453..806ddd39465f0 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index a27761f9af1d3..7cf005cbc2809 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 6c718af09f897..563687e0ec1ed 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index ffeb2daeeb780..45c0fa05d081c 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 9f6281b9f1e79..f804a844ff8e1 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 54fa9230107c0..4f92dbe05e00b 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 64cde7b8b9f64..7c1d93f0b18f8 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 7ed0fb4cdd708..b942771d9a391 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index bfc0a00c94a8c..968890a199026 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 3564a72b28b3b..bf90f6f8018c1 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index baef54341310e..55cdf9fb776c7 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 57a8cdcf25502..05484e1161112 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 43604425a269a..a45fdbc62116c 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 0772384e49b5f..c70a020354634 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 78bfb054d9de1..6516a520cf45b 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index c1e919c94c392..422ea43ace47c 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index af90c9cbb0e69..8a1e67a87ccd6 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 9e7882dc21ea6..9f15d474a0cb7 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 9e4ac47a3d42a..d132a523f673e 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 79135a09c4981..1435adc05aa9a 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 7147130f2c737..cf006d20f611a 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 5cd81716d3510..1dd79a773c680 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 023dec8e101c5..ac42a93c6248f 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 9aff00c50b610..655633477010a 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 8f9ad3312abef..8c64e7d276b93 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.devdocs.json b/api_docs/kbn_es.devdocs.json index bd54f768077c2..00729743dcb2e 100644 --- a/api_docs/kbn_es.devdocs.json +++ b/api_docs/kbn_es.devdocs.json @@ -797,7 +797,7 @@ "label": "ArtifactLicense", "description": [], "signature": [ - "\"basic\" | \"trial\" | \"oss\"" + "\"basic\" | \"trial\"" ], "path": "packages/kbn-es/src/artifact.ts", "deprecated": false, diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index c15a006b986f3..9b6899d046e79 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index acafd621938b4..cfde8f5132094 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 7e93f07ecf8e4..ee15d944ea53f 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 21fbf44d6fd8b..a54cfc339e5e1 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 71d80dbbaeab2..2b438ddf0fc73 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 7f965e23722ec..7ac64671251ed 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 797b7eaa04704..98447ee7d00e8 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 61cb22977f866..d9d7f28c77183 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 498826cd816a6..282dcd8a40ce0 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 4fdfeedcedbd7..444f905a6ad60 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index b4476fbe97ac3..4af2dd125e418 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index e1cf8f12472d8..677aeb3cda9a9 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index c1df79c08b05d..938d20fe119a1 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 369182b8e471c..5802e421aab20 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 85cfae687c98a..cc00c519f6843 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 24f3f32e470ae..1f6af6e0ce386 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index dc47b2c7bf6d5..a4127854b3fc9 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 043110457fcd8..7ca43517a7058 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index b95afc2f00419..4d30fb27efc6f 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 09f62942cb7c5..c274bb3eb113a 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index bcdeeeb934193..ff88c770f0a92 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index a308cec0df168..73fec5b9715f9 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index f21779633d2f1..74724f71aac4a 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 2adf6f95a4ce9..316a26ab2987b 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 0bf27604f0f52..152f7990d01f5 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index fb00b83b24036..c8d453d363af0 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index ec28ed86bc40e..c80ba436eedca 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 0c0ca1f109dc7..f7678f9890fc6 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index c1aad9862892c..010c1ade34cb4 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index e1cdc50df24a7..6f153c672e7eb 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index d4a3d6a00e037..21be3675a11aa 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 196a10ce672bf..ef11a7da0bf96 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index e6b680f0c091d..5de6d034f507d 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 3424b3a134228..45dac88195793 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index ae6fc24cf04e2..2f58d6fea986c 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index ae9fc1be9b75b..d4d5fbe85d793 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index af35dffb4465d..59f4fb2b93434 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 5fffd9dbcd279..64dd616d28ddc 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index c8017ae261963..f6a0840ccf9bf 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index e5e1801782e8d..68b3e804e6e35 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index c536c9bd8e5cb..1e8fb3e17c2b9 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 3c50689b4a31c..f7f0e50d49260 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 0c51b436c9783..634dc16c0ca57 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 97453d0a366a9..f2c8b1117eb52 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index ecddc06a4a595..bbaf9cfa3fd3d 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 42a30037b9320..4362d975e2b02 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 0b326ed7a74ce..e3c5f1d14528f 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index d51f4f7b070d4..32919445c9ada 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index cb635bd73b33f..18f31e9ba6584 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 860646468f35e..be0b3dc7d5831 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 41004ca090223..dc43329b36e4d 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index ca80e400ea05a..2393fa9c52e42 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 95659db6c6412..bd992efab920d 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index b2e0c3fae7de3..55f2e0a8ec191 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index e81b3714f2a4e..a8d1ad72fc615 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 35b68daf75f80..a44266c0f9a62 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index f393988640f3a..1b24bb55f21a1 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 12114392bbd54..676f7d5cf674e 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index c88adac289e1d..a335e71c63b84 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 9a31262324cf5..3aaa696572ec0 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 775b02f93dbbd..c591337628e1e 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index cebadc630cc61..541335f302c89 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 3584886326327..d52bbbf3cfc6d 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index b37ba6c830c89..3a2a11db262c2 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index ff83a10ec6746..70ebaf2191303 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 4f7cc343cc372..16b14fc2224ec 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 1c067471841a1..a7229680877ce 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 569c9d6e3075c..bac5531a272e4 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 851e1d6531088..023a1b30198f1 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index fc7d88ce69d78..2d5dac3d22477 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 2eda7fdcea06a..ab284617e9736 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 67b2b74ab291d..ca8be667ad077 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 5b3723deab5da..e9aa70d134298 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index c17bc909615a7..dcc416aefcd29 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index caa68e2868c33..d9326f42d3ab3 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index ae1eb3b17ade9..50bb7fd91029f 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index c330d60337324..adff97b496ef4 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 7de49dba3bbb3..8be4d3ec13e90 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 2b516711627c0..4f4dcef65b1b0 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index f60244fdeaf78..1fb54e33a0544 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index eb9b6bbb50c6e..fb50d3d530346 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index c40d043aebd25..2de86998a5a02 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 48339da270407..be21d9b580363 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 6f54e9722e0bd..31b082132154b 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 5a0d5740a19ce..a0adee613bde5 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index e3052a337b23c..3e310269ff7a5 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 08b72c563bc34..7909bb48bfb9c 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 1d5572853c156..13b5ef7fe02b3 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index a48119d797489..f3a6766d9463c 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 81efb4c6a95d2..37a673eae009e 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index f2298c403a79b..8ad0ff5e2160d 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 1fda93bf012e7..f10e288cb222d 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 70a092abe7311..73705ad455a5c 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index bc274810cd408..5a1e5cf59dfb8 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index b970d2578b763..6672d274d7393 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 416ffd7b763a9..0d340875a75f8 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index b38795b5653d5..8856e45524404 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 81a98f5955e24..67879dd6e0765 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 272dd4c4e3737..ce39596ea601c 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 8f95c65a46a7d..b5c319501040a 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 850de40565d32..ce646a218bec6 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 8dfb0d4b9e96b..6675f7b7a2676 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index ab217896fcc0f..abc9f781b2569 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.devdocs.json b/api_docs/kbn_rule_data_utils.devdocs.json index 20def9bb105f6..f721e756a60e2 100644 --- a/api_docs/kbn_rule_data_utils.devdocs.json +++ b/api_docs/kbn_rule_data_utils.devdocs.json @@ -1586,6 +1586,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/rule-data-utils", + "id": "def-common.METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID", + "type": "string", + "tags": [], + "label": "METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID", + "description": [], + "signature": [ + "\"metrics.alert.inventory.threshold\"" + ], + "path": "packages/kbn-rule-data-utils/src/rule_types/o11y_rules.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/rule-data-utils", "id": "def-common.OBSERVABILITY_THRESHOLD_RULE_TYPE_ID", diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index e429a9e4fa4da..57322a84712a5 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-detections-response](https://github.com/orgs/elastic/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 115 | 0 | 112 | 0 | +| 116 | 0 | 113 | 0 | ## Common diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 5ea6e6109dcfd..f8812a5f99a07 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index db2e8743e143a..4d5bb7c6ee285 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 486d13deb0eee..b54f6751fc94f 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 58302b3b1dab7..717727a6f8aba 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 108c56eab0389..40f2ec9326b91 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index b502143cbcac9..f1ea786251d02 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 12b83d62f51e2..f6a85eb1b22b0 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 614f57ad2a42d..c2a939ccbcad7 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index a3fe74b32ba53..ffdcdf056987a 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 37a20446489b6..1190ca7644821 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 7dff81a34f9a7..0cbeffbcdff27 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 7b72047d8282c..323c13e48fb53 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 9ac5ac2967f28..1c7d1357c0449 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 8ef35b4f9bffb..35b71a8f9af68 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index dc92634e276aa..77957415ef3ed 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index bdda07d0d50db..3f48ae66fbb0e 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index a3286883b72ef..918cb773c4e87 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 0fd917a5ae11e..6e30d2c48b41e 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 8e18001fdee75..246a043063f7f 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index eba1068653b56..4e488db5b3290 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index fc2bbbc628a44..84080bd421236 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index be1e14a30b908..31d83b7b41778 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 971006815395b..512c6a09d094b 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 1988226db6a9c..719cba8a9b6d0 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 9fec5f7b068d7..4e03cdf5b73c0 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 2eef3c7f77e89..c8457990219b9 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index fcb6c1b95d840..e9b483fb89180 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 2d8491f1a9db9..e3b44fd839da4 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index f100f3549a49d..db838d30b6ba3 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index de992b35b41bd..819abbf3430c1 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 67a32fe45fe0c..25ade2bc4c5ff 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 69de44d8b9cc8..1f12da911ce27 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index cf1574a8bb80f..a55c03c341224 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index c43f03aff7b2f..d0a65c9583006 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 83394a64ab98b..7e629bb13419c 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 186e686dee278..8a53913f9f7e7 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 566f5d536fd02..d085adbf782b6 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 60a220b649057..4160c23c49864 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 74a0ca81726a0..2abf35b050f9d 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 8e1771c21abbf..358782c8b7005 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 614fdd5fd3510..f9ecbe1644a96 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 9c6709b1bc192..8e4e4c25d8f09 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 2cf8f5ff61597..3c539c58424ff 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 540e82ad00fc4..b132bde96a8e3 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 587abaad862f9..f87049da34650 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index cec7fa8b80fd8..80ab3fa803ebe 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 2c157dabb2e34..0133656dffbad 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 1db76063af305..f05164714efb5 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 8cfba30237699..df743198d5eeb 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index ae2c444598010..2dc3ad597bde2 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 2c5c99c7f42ec..533dda0f6af2d 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 4b50ad5292780..482c09f26df62 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 0abcbcc8a2336..13549825dc01f 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index cadc78dd3a2ef..6a4b750516e03 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 57c4187f3c736..4100d9f348c0f 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 3468f5455e114..bceeca64e0636 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 4426f9b62e59b..c492e180e625e 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index ea4964774591d..aebc621b8120b 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index c8f111729c83b..0afac69e5cc6a 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 875dbe31dce9a..cdcdf4ec9c98c 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 8f2ac04d85ad5..0b02f9e7ba2ee 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 303b1347b41ea..052729a9704f6 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 60c1e4628f4d1..d534d9cbce8b6 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index a6e7e60d6b2cc..2fc85cb04f0e4 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index cd8d9d9795acf..2865602f3f3cf 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index b5ac636bc8456..f9b1d12110871 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 2e6214f4582a7..05246fe66de3a 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 9b31fa1e2b0d4..634779f091cb0 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 56ee6c64a7ba4..15cac9a77a8a0 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 119adaf54c563..68e84be049f44 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 595c91e63e455..48a8e9b21915a 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index b762ba946e38f..59e3d93307721 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index ac66676fb7fe1..cc9ffc9b40385 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index dd2e3dbef0a5a..c782633b8fb9b 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -482,7 +482,7 @@ "label": "CreateSLOInput", "description": [], "signature": [ - "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; } & { id?: string | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }" + "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; } & { id?: string | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -497,7 +497,7 @@ "label": "CreateSLOParams", "description": [], "signature": [ - "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: ", + "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -631,7 +631,7 @@ "\nThe response type for /internal/observability/slo/_definitions\n" ], "signature": [ - "({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]" + "({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -661,7 +661,7 @@ "label": "FindSLOResponse", "description": [], "signature": [ - "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }" + "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -676,7 +676,7 @@ "label": "GetPreviewDataParams", "description": [], "signature": [ - "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }" + "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -751,7 +751,7 @@ "label": "GetSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -796,7 +796,7 @@ "label": "Indicator", "description": [], "signature": [ - "{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }" + "{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -856,7 +856,7 @@ "label": "MetricCustomIndicator", "description": [], "signature": [ - "{ type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; }" + "{ type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -871,7 +871,7 @@ "label": "SLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -886,7 +886,7 @@ "label": "SLOWithSummaryResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -976,7 +976,7 @@ "label": "UpdateSLOInput", "description": [], "signature": [ - "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; } | undefined; budgetingMethod?: \"occurrences\" | \"timeslices\" | undefined; objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }) | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }" + "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; } | undefined; budgetingMethod?: \"occurrences\" | \"timeslices\" | undefined; objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }) | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -991,7 +991,7 @@ "label": "UpdateSLOParams", "description": [], "signature": [ - "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: ", + "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -1046,7 +1046,7 @@ "label": "UpdateSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -1409,40 +1409,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -2075,40 +2103,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -2557,40 +2613,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -3007,40 +3091,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -3501,40 +3613,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -4123,40 +4263,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -4431,6 +4599,60 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.metricCustomBasicMetric", + "type": "Object", + "tags": [], + "label": "metricCustomBasicMetric", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"sum\">; field: ", + "StringC", + "; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>" + ], + "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.metricCustomDocCountMetric", + "type": "Object", + "tags": [], + "label": "metricCustomDocCountMetric", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>" + ], + "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.metricCustomIndicatorSchema", @@ -4453,40 +4675,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -4850,40 +5100,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -5278,40 +5556,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -5702,40 +6008,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -6158,40 +6492,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -7086,40 +7448,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -7500,40 +7890,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index d24724b3e7859..de3cbf08d0c98 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 129 | 0 | 126 | 0 | +| 131 | 0 | 128 | 0 | ## Common diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 4d0e133285caf..d847191cad35b 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index b62b9e3e164e4..6ccf9c1225983 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 1aaacdaffd811..dad5ae36ef322 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 45dc120a15bb4..d26aa25b18068 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_subscription_tracking.mdx b/api_docs/kbn_subscription_tracking.mdx index 531fbc6f5653d..aec338d9e3243 100644 --- a/api_docs/kbn_subscription_tracking.mdx +++ b/api_docs/kbn_subscription_tracking.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-subscription-tracking title: "@kbn/subscription-tracking" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/subscription-tracking plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/subscription-tracking'] --- import kbnSubscriptionTrackingObj from './kbn_subscription_tracking.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 73cc2b44e84a5..f135c68fd82e8 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index b6b3866a7b711..f4c516a7b72c1 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 6fa4571742c68..e8192760ab8c4 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index f9eb7fbe61b99..75a62bafb9c3c 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 681b1c3751c70..14dc22301d438 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index c0c610ab4af84..bce266d5e3d05 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index bff45de4cf6b2..9adb1fd506d4c 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index a1d61e47a4706..920bdacfc5822 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 55fcf8055bae5..ae156a3f67df1 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 6b762d38358be..3aed0337f2875 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 27d57ca5190d2..33e8784499ade 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 78471dc41276f..02e6afdcfb395 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index cf4ce3779c9a0..f5e9c9d1f06bd 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index adbc9f4911b7f..ab60706a182c7 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 01c08c77b269c..c8b7c990839ed 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 081e72351b312..45233fbc1cedb 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 81e8636adbdfe..22ca484767fad 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index a92d2b393861e..58719f00482f7 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 48e1fa438c454..6646d78632b75 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index d70fb4d6e7ad7..f0758e421a49a 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 269b5630aa125..2ea082493eb7b 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 86603c8ce76d7..b3047a5ff7a35 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 90ea9da16ea1b..b5c7c8d40499e 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 5418192352c30..3f2411d31c72f 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index acda13eec48f9..2cee78c2e41e9 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 148e2fd1ff899..22882b08c02f8 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 5b2c927e52ab3..505cd1eb8ac16 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 7398253f9ec4b..810752c805ff3 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 4c425c02c4b0f..c2f0248c6aa2f 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 2389f1fc1ab89..b1ccd2542831f 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 30828241be287..4c76a1a3e2ee4 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index f0b23f27f3769..7521a9dc4ac28 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index f40501769034f..ac1a861627109 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 675946f917b11..c19ec2587da2e 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 21bba29b8d30c..f8dc452b80c8f 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 07c5395ae596c..1bcc3fe34feec 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 7070c3891da91..aa783f0036d36 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 94e4f40853f92..f5d502d0bf5a5 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 0d88f2fddfbb9..f007519399b52 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index def0fc90c6bf2..7852488e4c394 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index fafff77be6326..4777f154c8204 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 0d90802e1d002..74f95298cc6d2 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 40177041b010c..d96d48b661d55 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 57cbeac274314..238e7abab807a 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 0cbffc666898a..c09b5ff9ce8ba 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index c3ab370fade51..d324fbaf4638f 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 78e6044611743..9be02bb30098e 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 06942864aef60..0610ed9ace5c9 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -8297,40 +8297,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -8492,7 +8520,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }; }; }) => Promise<{ date: string; sliValue: number; }[]>; } & ", + " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }; }; }) => Promise<{ date: string; sliValue: number; }[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -8703,40 +8731,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -8986,7 +9042,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { path: { id: string; }; body: { name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: ", + " & { params: { path: { id: string; }; body: { name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -9026,7 +9082,7 @@ "section": "def-common.Duration", "text": "Duration" }, - " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }>; } & ", + " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -9060,7 +9116,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", + " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -9102,7 +9158,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", + " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -9124,7 +9180,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { query: { search: string; }; }; }) => Promise<({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]>; } & ", + " & { params: { query: { search: string; }; }; }) => Promise<({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -9383,40 +9439,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -9670,7 +9754,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: ", + " & { params: { body: { name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -9917,40 +10001,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -10112,7 +10224,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }; }; }) => Promise<{ date: string; sliValue: number; }[]>; } & ", + " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }; }; }) => Promise<{ date: string; sliValue: number; }[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -10323,40 +10435,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -10606,7 +10746,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { path: { id: string; }; body: { name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: ", + " & { params: { path: { id: string; }; body: { name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; } | undefined; timeWindow?: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -10646,7 +10786,7 @@ "section": "def-common.Duration", "text": "Duration" }, - " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }>; } & ", + " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -10680,7 +10820,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", + " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -10722,7 +10862,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", + " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -10744,7 +10884,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { query: { search: string; }; }; }) => Promise<({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]>; } & ", + " & { params: { query: { search: string; }; }; }) => Promise<({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -11003,40 +11143,68 @@ "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; total: ", "TypeC", "<{ metrics: ", "ArrayC", "<", + "UnionC", + "<[", "IntersectionC", "<[", "TypeC", "<{ name: ", "StringC", "; aggregation: ", - "KeyofC", - "<{ sum: boolean; }>; field: ", + "LiteralC", + "<\"sum\">; field: ", "StringC", "; }>, ", "PartialC", "<{ filter: ", "StringC", - "; }>]>>; equation: ", + "; }>]>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; aggregation: ", + "LiteralC", + "<\"doc_count\">; }>, ", + "PartialC", + "<{ filter: ", + "StringC", + "; }>]>]>>; equation: ", "StringC", "; }>; timestampField: ", "StringC", @@ -11290,7 +11458,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; total: { metrics: ({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; })[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: ", + " & { params: { body: { name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 2045af15dd41b..3628c75b6ceed 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index cab458c4a6bd2..3af073c1f66f0 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 28bf25c745233..156ff2060adf6 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 93737144855d0..395daffaed93d 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 15f0bd436fa67..49b4b7060b8f7 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 60b55c41fab64..48b66b1e51692 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index e23405ae26578..57e905be4b5af 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index e282bac34027d..898241c4b1413 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 76082 | 233 | 65046 | 1597 | +| 76089 | 233 | 65049 | 1597 | ## Plugin Directory @@ -273,7 +273,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 0 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 7 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 165 | 0 | 70 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | @@ -544,7 +544,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A component for creating resizable layouts containing a fixed width panel and a flexible panel, with support for horizontal and vertical layouts. | 18 | 0 | 5 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 2 | 8 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | -| | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 115 | 0 | 112 | 0 | +| | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 116 | 0 | 113 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 68 | 0 | 68 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2211 | 0 | 2211 | 0 | @@ -618,7 +618,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 3 | 0 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 129 | 0 | 126 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 131 | 0 | 128 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 102 | 2 | 65 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 6fafaebb019af..f58a021c502b5 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index c8aa1e8ba86f9..cd7539fc60ab3 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 7339d402d4812..9e484291281bf 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index e3a2975e71a79..122eb47b5f108 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 3ea1700a77434..7218c2d384f9a 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 6a64d6ac1575e..80f6f81edc01a 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 6056b7f00fd5c..2484623c379ea 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 96f5504d74d7c..73f40c7ef02bb 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index efe2afd257e77..787d563cf833f 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 08722ac7171b6..fe075a2d14aef 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index d025a862f60cd..f9535fb570137 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index f47c7dd2b25a7..b176edd0697b3 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index a499008d9a782..dfed121fe9d03 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 28bc3a72a472d..498512acef634 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 7f7102506320a..04d8a5f1f47be 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 81374d6c55653..2f152b467d568 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 672ca2128baa4..bc227e0d57c92 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 699574fab35e2..56233e694a44a 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index e347cd66d4b40..d27a0e8a6a917 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 37414db4c395e..74f1db94af42b 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 51d33d2367c61..3da87901fd716 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 7391544ff8663..77380a3af0bb0 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index dc8fbfe48556e..c31e05f44e48a 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index d331e1c9e78c7..124a0266a746d 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index db9678e4f9498..e8f6e5bcc84b7 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index b64a746e6b2d4..659e64e03c94c 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 9aec3b6727545..65f8b144fd5bd 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index b1baae66b6c3c..afb734134ec30 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 71302d492d6b2..72008768874e1 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 87e0b6ebda619..57e274d294d3c 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 131742d7aa7a9..80b7e4ae53110 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 07198ec59ae8c..1fcb29570c40b 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 3610ff9250a8b..cd97d832161f5 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 55119da9d38db..7a5a7677b71c4 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 1ab1aec171c8d..34df0015bac47 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 8a72db2d58893..98999fd7710b6 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index cfa2b74f8abcf..819609450dcd6 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 584484ffd70e1..89c3394ff9228 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 4670b9bcfd53c..8c73bb0d5aa73 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index dbb5318f9ea6e..09ea8571e5e37 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 1ad622851630a..ab66378e46af6 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index febe3a84e4a06..97b7dd9ecef17 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index c9d326d7babb2..e387084a28c5a 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 693a43ffa73e7..a5485bf130a5d 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 7e5808a1a4083..ce1b8e55bbcab 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 536073b7a449d..a2218269f4ce5 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index fca96973e7d69..b1a9193a7fae2 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 6d61d40f1b1b1..17cb54fde2442 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 2f02e1cf2d3d9..adc6a59bc27d4 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index bad86282b61d9..5d83a164601eb 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 16d0a8b7b848c..0c10deb217431 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 681470f8991ac..c532426fb7916 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 164bb2345ebd5..a8635835c673a 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 0acaca2ab1f5f..65cc4d4adacb9 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index d142d0ae25da8..4855114b873fe 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 9538ee36852c6..d32b566d45383 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 8d984e502640c..6ccc3abe170cf 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 80799364b2c58..00f2ea78e7d66 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 0bc6246152ee6..7df847499812f 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 58cdbe5bced47..3d9c01a701c3a 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-11-09 +date: 2023-11-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 7c327573357064618865183e18f6b43a82b68f74 Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Fri, 10 Nov 2023 03:29:09 -0500 Subject: [PATCH 25/51] Exclude DGA integration from serverless projects (#170982) ## Summary Excludes the DGA integration from serverless projects, as it can cause issues due to the size of its trained ML model assets. --- config/serverless.oblt.yml | 5 +++++ config/serverless.security.yml | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 885bdcb9962b1..68f340fb64c05 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -47,14 +47,19 @@ xpack.fleet.internal.registry.excludePackages: [ 'endpoint', 'beaconing', 'osquery_manager', + # synthetics is not enabled yet 'synthetics', 'synthetics_dashboards', + # Removed in 8.11 integrations 'cisco', 'microsoft', 'symantec', 'cyberark', + + # ML integrations + 'dga', ] ## Required for force installation of APM Package diff --git a/config/serverless.security.yml b/config/serverless.security.yml index 0e59a104317c5..7f749afc7626d 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -48,11 +48,15 @@ xpack.fleet.internal.registry.excludePackages: [ 'apm', 'synthetics', 'synthetics_dashboards', + # Removed in 8.11 integrations 'cisco', 'microsoft', 'symantec', 'cyberark', + + # ML integrations + 'dga', ] # fleet_server package installed to publish agent metrics xpack.fleet.packages: From 4b28ec439763188b4a037c2ade90202c2b4888de Mon Sep 17 00:00:00 2001 From: Juan Pablo Djeredjian Date: Fri, 10 Nov 2023 09:42:18 +0100 Subject: [PATCH 26/51] [Security Solution] Migrate Prebuilt rules API integration tests to `security_solution_api_integration` folder (#169951) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses partially: https://github.com/elastic/kibana/issues/151902 ## Summary - Migrates Prebuilt rules-related API integration tests to `security_solution_api_integration` folder. - Moves tests from `x-pack/test/detection_engine_api_integration/security_and_spaces` into `x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license`. - PR moves following folders: - `/prebuilt_rules` - `/bundled_prebuilt_rules_package` - `/large_prebuilt_rules_package` - `/update_prebuilt_rules_package` - Duplicates or completely moves needed utils into: - `x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules`, depending if they are no longer used in the original folder or they still are in the remaining test (should be moved shortly as well) - All tests run on both **ESS** and **Serverless** ## Flaky test runner - [ ] [`/prebuilt_rules`](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3888) 🟢 - [ ] [`/bundled_prebuilt_rules_package`](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3916)🟢 - [ ] [`/large_prebuilt_rules_package`](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3917)🟢 - [ ] [`/update_prebuilt_rules_package`](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3920)🟢 [Link to all for PR](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds?branch=refs%2Fpull%2F169951%2Fhead) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/ftr_configs.yml | 17 ++++---- .github/CODEOWNERS | 1 + .../utils/index.ts | 6 --- ...get_prebuilt_rules_and_timelines_status.ts | 31 -------------- .../config/serverless/config.base.ts | 12 +++++- .../package.json | 22 +++++++++- .../configs/ess.config.ts} | 16 ++++---- .../configs/serverless.config.ts | 29 +++++++++++++ .../security_detection_engine-99.0.0.zip | Bin ...ecurity_detection_engine-99.0.1-beta.1.zip | Bin .../bundled_prebuilt_rules_package/index.ts | 15 +++++++ .../install_latest_bundled_prebuilt_rules.ts | 16 ++++---- .../prerelease_packages.ts | 38 +++++++++++++----- .../configs/ess.config.ts} | 16 +++++--- .../configs/serverless.config.ts | 37 +++++++++++++++++ .../security_detection_engine-100.0.0.zip | Bin .../large_prebuilt_rules_package/index.ts | 14 +++++++ .../install_large_prebuilt_rules_package.ts | 14 ++++--- .../management/configs/ess.config.ts} | 10 +++-- .../management/configs/serverless.config.ts | 15 +++++++ .../management}/fleet_integration.ts | 17 ++++---- .../management}/get_prebuilt_rules_status.ts | 27 ++++++------- .../get_prebuilt_timelines_status.ts | 7 ++-- .../prebuilt_rules/management}/index.ts | 5 +-- .../install_and_upgrade_prebuilt_rules.ts | 28 ++++++------- .../configs/ess.config.ts} | 10 +++-- .../configs/serverless.config.ts | 16 ++++++++ .../update_prebuilt_rules_package/index.ts | 14 +++++++ .../update_prebuilt_rules_package.ts | 16 ++++---- .../delete_all_prebuilt_rule_assets.ts | 23 +++++++++++ .../prebuilt_rules/delete_all_timelines.ts | 23 +++++++++++ .../delete_prebuilt_rules_fleet_package.ts | 7 ++-- .../prebuilt_rules/get_installed_rules.ts | 0 .../get_prebuilt_rules_fleet_package.ts | 23 +++++++++++ .../get_prebuilt_rules_status.ts | 1 + .../utils/rules/prebuilt_rules/index.ts | 12 ++++++ .../install_fleet_package_by_url.ts | 5 ++- .../prebuilt_rules/install_prebuilt_rules.ts | 1 + .../install_prebuilt_rules_fleet_package.ts | 0 .../review_install_prebuilt_rules.ts | 1 + .../review_upgrade_prebuilt_rules.ts | 1 + .../prebuilt_rules/upgrade_prebuilt_rules.ts | 1 + .../tsconfig.json | 4 +- 43 files changed, 401 insertions(+), 150 deletions(-) delete mode 100644 x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_and_timelines_status.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/config.ts => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/ess.config.ts} (78%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/serverless.config.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.0.zip (100%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.1-beta.1.zip (100%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/index.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts (86%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/bundled_prebuilt_rules_package/prerelease_packages.ts (70%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/config.ts => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/ess.config.ts} (80%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/serverless.config.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/large_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-100.0.0.zip (100%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/index.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts (78%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/config.ts => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/ess.config.ts} (61%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/serverless.config.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces/prebuilt_rules => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management}/fleet_integration.ts (79%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/prebuilt_rules => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management}/get_prebuilt_rules_status.ts (96%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/prebuilt_rules => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management}/get_prebuilt_timelines_status.ts (88%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/prebuilt_rules => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management}/index.ts (73%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/prebuilt_rules => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management}/install_and_upgrade_prebuilt_rules.ts (95%) rename x-pack/test/{detection_engine_api_integration/security_and_spaces/prebuilt_rules/config.ts => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/ess.config.ts} (60%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/serverless.config.ts create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/index.ts rename x-pack/test/{detection_engine_api_integration/security_and_spaces => security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules}/update_prebuilt_rules_package/update_prebuilt_rules_package.ts (93%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_prebuilt_rule_assets.ts create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_timelines.ts rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts (84%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/get_installed_rules.ts (100%) create mode 100644 x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_fleet_package.ts rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/get_prebuilt_rules_status.ts (95%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/install_fleet_package_by_url.ts (93%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/install_prebuilt_rules.ts (98%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/install_prebuilt_rules_fleet_package.ts (100%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/review_install_prebuilt_rules.ts (95%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/review_upgrade_prebuilt_rules.ts (94%) rename x-pack/test/{detection_engine_api_integration/utils => security_solution_api_integration/test_suites/detections_response/utils/rules}/prebuilt_rules/upgrade_prebuilt_rules.ts (98%) diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index c817c9f8442e5..95588c63f7489 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -228,10 +228,6 @@ enabled: - x-pack/test/detection_engine_api_integration/security_and_spaces/group5/config.ts - x-pack/test/detection_engine_api_integration/security_and_spaces/group10/config.ts - x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/config.ts - - x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/config.ts - x-pack/test/disable_ems/config.ts - x-pack/test/encrypted_saved_objects_api_integration/config.ts - x-pack/test/examples/config.ts @@ -467,8 +463,11 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/configs/ess.config.ts - - - - - + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/ess.config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b60e8c5effe45..19b62559fa3c0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1299,6 +1299,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details @elastic/security-detection-rule-management /x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules @elastic/security-detection-rule-management /x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/rule_management @elastic/security-detection-rule-management +/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/common/components/health_truncate_text @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/common/components/links_to_docs @elastic/security-detection-rule-management diff --git a/x-pack/test/detection_engine_api_integration/utils/index.ts b/x-pack/test/detection_engine_api_integration/utils/index.ts index 432923baefb1d..1c62f3dc2c123 100644 --- a/x-pack/test/detection_engine_api_integration/utils/index.ts +++ b/x-pack/test/detection_engine_api_integration/utils/index.ts @@ -93,12 +93,6 @@ export * from './wait_for_rule_status'; export * from './wait_for_signals_to_be_present'; export * from './prebuilt_rules/create_prebuilt_rule_saved_objects'; export * from './prebuilt_rules/delete_all_prebuilt_rule_assets'; -export * from './prebuilt_rules/delete_prebuilt_rules_fleet_package'; -export * from './prebuilt_rules/get_prebuilt_rules_status'; -export * from './prebuilt_rules/get_prebuilt_rules_and_timelines_status'; -export * from './prebuilt_rules/install_prebuilt_rules_fleet_package'; -export * from './prebuilt_rules/install_prebuilt_rules'; -export * from './prebuilt_rules/upgrade_prebuilt_rules'; export * from './prebuilt_rules/install_mock_prebuilt_rules'; export * from './prebuilt_rules/install_prebuilt_rules_and_timelines'; export * from './get_legacy_action_so'; diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_and_timelines_status.ts b/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_and_timelines_status.ts deleted file mode 100644 index 2d03e597dc5af..0000000000000 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_and_timelines_status.ts +++ /dev/null @@ -1,31 +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 { - GetPrebuiltRulesAndTimelinesStatusResponse, - PREBUILT_RULES_STATUS_URL, -} from '@kbn/security-solution-plugin/common/api/detection_engine/prebuilt_rules'; -import type SuperTest from 'supertest'; - -/** - * (LEGACY) - * Helper to retrieve the prebuilt rules status - * - * @param supertest The supertest deps - */ -export const getPrebuiltRulesAndTimelinesStatus = async ( - supertest: SuperTest.SuperTest -): Promise => { - const response = await supertest - .get(PREBUILT_RULES_STATUS_URL) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') - .send() - .expect(200); - - return response.body; -}; diff --git a/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts b/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts index 6790c39c85115..6238282722cfc 100644 --- a/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts +++ b/x-pack/test/security_solution_api_integration/config/serverless/config.base.ts @@ -8,6 +8,8 @@ import { FtrConfigProviderContext } from '@kbn/test'; export interface CreateTestConfigOptions { testFiles: string[]; junit: { reportName: string }; + kbnTestServerArgs?: string[]; + kbnTestServerEnv?: Record; } export function createTestConfig(options: CreateTestConfigOptions) { @@ -20,7 +22,15 @@ export function createTestConfig(options: CreateTestConfigOptions) { ...svlSharedConfig.getAll(), kbnTestServer: { ...svlSharedConfig.get('kbnTestServer'), - serverArgs: [...svlSharedConfig.get('kbnTestServer.serverArgs'), '--serverless=security'], + serverArgs: [ + ...svlSharedConfig.get('kbnTestServer.serverArgs'), + '--serverless=security', + ...(options.kbnTestServerArgs || []), + ], + env: { + ...svlSharedConfig.get('kbnTestServer.env'), + ...options.kbnTestServerEnv, + }, }, testFiles: options.testFiles, junit: options.junit, diff --git a/x-pack/test/security_solution_api_integration/package.json b/x-pack/test/security_solution_api_integration/package.json index a2bbd939fade2..89f6e0f164f8e 100644 --- a/x-pack/test/security_solution_api_integration/package.json +++ b/x-pack/test/security_solution_api_integration/package.json @@ -48,6 +48,26 @@ "entity_analytics:runner:serverless": "npm run run-tests:ea:default risk_engine serverless serverlessEnv", "entity_analytics:qa:serverless": "npm run run-tests:ea:default risk_engine serverless qaEnv", "entity_analytics:server:ess": "npm run initialize-server:ea:default risk_engine ess", - "entity_analytics:runner:ess": "npm run run-tests:ea:default risk_engine ess essEnv" + "entity_analytics:runner:ess": "npm run run-tests:ea:default risk_engine ess essEnv", + "prebuilt_rules_management:server:serverless": "npm run initialize-server:dr:default prebuilt_rules/management serverless", + "prebuilt_rules_management:runner:serverless": "npm run run-tests:dr:default prebuilt_rules/management serverless serverlessEnv", + "prebuilt_rules_management:qa:serverless": "npm run run-tests:dr:default prebuilt_rules/management serverless qaEnv", + "prebuilt_rules_management:server:ess": "npm run initialize-server:dr:default prebuilt_rules/management ess", + "prebuilt_rules_management:runner:ess": "npm run run-tests:dr:default prebuilt_rules/management ess essEnv", + "prebuilt_rules_bundled_prebuilt_rules_package:server:serverless": "npm run initialize-server:dr:default prebuilt_rules/bundled_prebuilt_rules_package serverless", + "prebuilt_rules_bundled_prebuilt_rules_package:runner:serverless": "npm run run-tests:dr:default prebuilt_rules/bundled_prebuilt_rules_package serverless serverlessEnv", + "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless": "npm run run-tests:dr:default prebuilt_rules/bundled_prebuilt_rules_package serverless qaEnv", + "prebuilt_rules_bundled_prebuilt_rules_package:server:ess": "npm run initialize-server:dr:default prebuilt_rules/bundled_prebuilt_rules_package ess", + "prebuilt_rules_bundled_prebuilt_rules_package:runner:ess": "npm run run-tests:dr:default prebuilt_rules/bundled_prebuilt_rules_package ess essEnv", + "prebuilt_rules_large_prebuilt_rules_package:server:serverless": "npm run initialize-server:dr:default prebuilt_rules/large_prebuilt_rules_package serverless", + "prebuilt_rules_large_prebuilt_rules_package:runner:serverless": "npm run run-tests:dr:default prebuilt_rules/large_prebuilt_rules_package serverless serverlessEnv", + "prebuilt_rules_large_prebuilt_rules_package:qa:serverless": "npm run run-tests:dr:default prebuilt_rules/large_prebuilt_rules_package serverless qaEnv", + "prebuilt_rules_large_prebuilt_rules_package:server:ess": "npm run initialize-server:dr:default prebuilt_rules/large_prebuilt_rules_package ess", + "prebuilt_rules_large_prebuilt_rules_package:runner:ess": "npm run run-tests:dr:default prebuilt_rules/large_prebuilt_rules_package ess essEnv", + "prebuilt_rules_update_prebuilt_rules_package:server:serverless": "npm run initialize-server:dr:default prebuilt_rules/update_prebuilt_rules_package serverless", + "prebuilt_rules_update_prebuilt_rules_package:runner:serverless": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package serverless serverlessEnv", + "prebuilt_rules_update_prebuilt_rules_package:qa:serverless": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package serverless qaEnv", + "prebuilt_rules_update_prebuilt_rules_package:server:ess": "npm run initialize-server:dr:default prebuilt_rules/update_prebuilt_rules_package ess", + "prebuilt_rules_update_prebuilt_rules_package:runner:ess": "npm run run-tests:dr:default prebuilt_rules/update_prebuilt_rules_package ess essEnvs" } } diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/ess.config.ts similarity index 78% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/ess.config.ts index 28f71daa1f0f4..87c0b1b3c43d8 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/ess.config.ts @@ -4,24 +4,26 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { FtrConfigProviderContext } from '@kbn/test'; import path from 'path'; export const BUNDLED_PACKAGE_DIR = path.join( path.dirname(__filename), - './fleet_bundled_packages/fixtures' + './../fleet_bundled_packages/fixtures' ); -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [ - require.resolve('./prerelease_packages.ts'), - require.resolve('./install_latest_bundled_prebuilt_rules.ts'), - ], + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine ESS / Bundled Prebuilt Rules Package API Integration Tests', + }, kbnTestServer: { ...functionalConfig.get('kbnTestServer'), serverArgs: [ diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/serverless.config.ts new file mode 100644 index 0000000000000..db6e8e11082e0 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/serverless.config.ts @@ -0,0 +1,29 @@ +/* + * 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 path from 'path'; +import { createTestConfig } from '../../../../../../config/serverless/config.base'; + +export const BUNDLED_PACKAGE_DIR = path.join( + path.dirname(__filename), + './../fleet_bundled_packages/fixtures' +); +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: + 'Detection Engine Serverless / Bundled Prebuilte Rules Package API Integration Tests', + }, + kbnTestServerArgs: [ + /* Tests in this directory simulate an air-gapped environment in which the instance doesn't have access to EPR. + * To do that, we point the Fleet url to an invalid URL, and instruct Fleet to fetch bundled packages at the + * location defined in BUNDLED_PACKAGE_DIR. + */ + `--xpack.fleet.registryUrl=http://invalidURL:8080`, + `--xpack.fleet.developer.bundledPackageLocation=${BUNDLED_PACKAGE_DIR}`, + ], +}); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.0.zip b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.0.zip similarity index 100% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.0.zip rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.0.zip diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.1-beta.1.zip b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.1-beta.1.zip similarity index 100% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.1-beta.1.zip rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-99.0.1-beta.1.zip diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/index.ts new file mode 100644 index 0000000000000..6d1e677426b32 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/index.ts @@ -0,0 +1,15 @@ +/* + * 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 { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default ({ loadTestFile }: FtrProviderContext): void => { + describe('Detection Engine API - Bundled Prebuilt Rules Package', function () { + loadTestFile(require.resolve('./install_latest_bundled_prebuilt_rules')); + loadTestFile(require.resolve('./prerelease_packages')); + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts similarity index 86% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts index d9f710ba6afcf..bd306b0d65654 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts @@ -6,18 +6,18 @@ */ import fs from 'fs/promises'; import path from 'path'; -// @ts-expect-error we have to check types with "allowJs: false" for now, causing this import to fail import { REPO_ROOT } from '@kbn/repo-info'; import JSON5 from 'json5'; import expect from 'expect'; import { PackageSpecManifest } from '@kbn/fleet-plugin/common'; import { ALL_SAVED_OBJECT_INDICES } from '@kbn/core-saved-objects-server'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { deleteAllPrebuiltRuleAssets, deleteAllRules } from '../../utils'; -import { getPrebuiltRulesStatus } from '../../utils/prebuilt_rules/get_prebuilt_rules_status'; -import { installPrebuiltRulesPackageByVersion } from '../../utils/prebuilt_rules/install_fleet_package_by_url'; - -// eslint-disable-next-line import/no-default-export +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { + deleteAllRules, + deleteAllPrebuiltRuleAssets, + getPrebuiltRulesStatus, + installPrebuiltRulesPackageByVersion, +} from '../../../utils'; export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const supertest = getService('supertest'); @@ -28,7 +28,7 @@ export default ({ getService }: FtrProviderContext): void => { /* attempt to install it from the local file system. The API response from EPM provides /* us with the information of whether the package was installed from the registry or /* from a package that was bundled with Kibana */ - describe('install_bundled_prebuilt_rules', () => { + describe('@ess @serverless @skipInQA install_bundled_prebuilt_rules', () => { beforeEach(async () => { await deleteAllRules(supertest, log); await deleteAllPrebuiltRuleAssets(es); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/prerelease_packages.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/prerelease_packages.ts similarity index 70% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/prerelease_packages.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/prerelease_packages.ts index 7348b596d1404..448e325892a5f 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/bundled_prebuilt_rules_package/prerelease_packages.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/prerelease_packages.ts @@ -5,14 +5,19 @@ * 2.0. */ import expect from 'expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { deleteAllPrebuiltRuleAssets, deleteAllRules } from '../../utils'; -import { getInstalledRules } from '../../utils/prebuilt_rules/get_installed_rules'; -import { getPrebuiltRulesStatus } from '../../utils/prebuilt_rules/get_prebuilt_rules_status'; -import { installPrebuiltRulesPackageViaFleetAPI } from '../../utils/prebuilt_rules/install_fleet_package_by_url'; -import { installPrebuiltRules } from '../../utils/prebuilt_rules/install_prebuilt_rules'; -// eslint-disable-next-line import/no-default-export +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { + deleteAllPrebuiltRuleAssets, + deleteAllRules, + deletePrebuiltRulesFleetPackage, + getInstalledRules, + getPrebuiltRulesFleetPackage, + getPrebuiltRulesStatus, + installPrebuiltRules, + installPrebuiltRulesPackageViaFleetAPI, +} from '../../../utils'; + export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const supertest = getService('supertest'); @@ -25,10 +30,11 @@ export default ({ getService }: FtrProviderContext): void => { /* (We use high mock version numbers to prevent clashes with real packages downloaded in other tests.) /* To do assertions on which packages have been installed, 99.0.0 has a single rule to install, /* while 99.0.1-beta.1 has 2 rules to install. Also, both packages have the version as part of the rule names. */ - describe('prerelease_packages', () => { + describe('@ess @serverless @skipInQA prerelease_packages', () => { beforeEach(async () => { await deleteAllRules(supertest, log); await deleteAllPrebuiltRuleAssets(es); + await deletePrebuiltRulesFleetPackage(supertest); }); it('should install latest stable version and ignore prerelease packages', async () => { @@ -38,13 +44,27 @@ export default ({ getService }: FtrProviderContext): void => { expect(statusBeforePackageInstallation.stats.num_prebuilt_rules_to_install).toBe(0); expect(statusBeforePackageInstallation.stats.num_prebuilt_rules_to_upgrade).toBe(0); - await installPrebuiltRulesPackageViaFleetAPI(es, supertest); + // Install package without specifying version to check if latest stable version is installed + const fleetPackageInstallationResponse = await installPrebuiltRulesPackageViaFleetAPI( + es, + supertest + ); + + expect(fleetPackageInstallationResponse.items.length).toBe(1); + expect(fleetPackageInstallationResponse.items[0].id).toBe('rule_99.0.0'); // Name of the rule in package 99.0.0 + + // Get the installed package and check if the version is 99.0.0 + const prebuiltRulesFleetPackage = await getPrebuiltRulesFleetPackage(supertest); + expect(prebuiltRulesFleetPackage.body.item.version).toBe('99.0.0'); + expect(prebuiltRulesFleetPackage.status).toBe(200); + // Get status of our prebuilt rules (nothing should be instaled yet) const statusAfterPackageInstallation = await getPrebuiltRulesStatus(supertest); expect(statusAfterPackageInstallation.stats.num_prebuilt_rules_installed).toBe(0); expect(statusAfterPackageInstallation.stats.num_prebuilt_rules_to_install).toBe(1); // 1 rule in package 99.0.0 expect(statusAfterPackageInstallation.stats.num_prebuilt_rules_to_upgrade).toBe(0); + // Install prebuilt rules await installPrebuiltRules(es, supertest); // Verify that status is updated after package installation diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/ess.config.ts similarity index 80% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/ess.config.ts index cba7488572593..9b056de5b8252 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/ess.config.ts @@ -4,21 +4,27 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { FtrConfigProviderContext } from '@kbn/test'; import path from 'path'; export const BUNDLED_PACKAGE_DIR = path.join( path.dirname(__filename), - './fleet_bundled_packages/fixtures' + './../fleet_bundled_packages/fixtures' ); -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [require.resolve('./install_large_prebuilt_rules_package.ts')], + testFiles: [require.resolve('..')], + junit: { + reportName: + 'Detection Engine ESS / Large Prebuilt Rules Package Installation API Integration Tests', + }, kbnTestServer: { ...functionalConfig.get('kbnTestServer'), serverArgs: [ @@ -36,7 +42,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { /* Limit the heap memory to the lowest amount with which Kibana doesn't crash with an out of memory error * when installing the large package. */ - NODE_OPTIONS: '--max-old-space-size=700', + NODE_OPTIONS: '--max-old-space-size=800', }, }, }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/serverless.config.ts new file mode 100644 index 0000000000000..29b6ec1c4cc6c --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/configs/serverless.config.ts @@ -0,0 +1,37 @@ +/* + * 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 path from 'path'; +import { createTestConfig } from '../../../../../../config/serverless/config.base'; + +export const BUNDLED_PACKAGE_DIR = path.join( + path.dirname(__filename), + './../fleet_bundled_packages/fixtures' +); +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: + 'Detection Engine Serverless / Large Prebuilt Rules Package Installation API Integration Tests', + }, + kbnTestServerArgs: [ + /* Tests in this directory simulate an air-gapped environment in which the instance doesn't have access to EPR. + * To do that, we point the Fleet url to an invalid URL, and instruct Fleet to fetch bundled packages at the + * location defined in BUNDLED_PACKAGE_DIR. + * Since we want to test the installation of a large package, we created a specific package `security_detection_engine-100.0.0` + * which contains 15000 rules assets and 750 unique rules, and attempt to install it. + */ + `--xpack.fleet.registryUrl=http://invalidURL:8080`, + `--xpack.fleet.developer.bundledPackageLocation=${BUNDLED_PACKAGE_DIR}`, + ], + kbnTestServerEnv: { + /* Limit the heap memory to the lowest amount with which Kibana doesn't crash with an out of memory error + * when installing the large package. + */ + NODE_OPTIONS: '--max-old-space-size=800', + }, +}); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-100.0.0.zip b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-100.0.0.zip similarity index 100% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-100.0.0.zip rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/fleet_bundled_packages/fixtures/security_detection_engine-100.0.0.zip diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/index.ts new file mode 100644 index 0000000000000..74959124978ae --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/index.ts @@ -0,0 +1,14 @@ +/* + * 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 { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default ({ loadTestFile }: FtrProviderContext): void => { + describe('Detection Engine API - Large Prebuilt Rules Package', function () { + loadTestFile(require.resolve('./install_large_prebuilt_rules_package')); + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts similarity index 78% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts index c047413bdb90a..e059cab5ae64b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/large_prebuilt_rules_package/install_large_prebuilt_rules_package.ts @@ -5,18 +5,20 @@ * 2.0. */ import expect from 'expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { deleteAllRules, getPrebuiltRulesAndTimelinesStatus } from '../../utils'; -import { deleteAllPrebuiltRuleAssets } from '../../utils/prebuilt_rules/delete_all_prebuilt_rule_assets'; -import { installPrebuiltRulesAndTimelines } from '../../utils/prebuilt_rules/install_prebuilt_rules_and_timelines'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { + deleteAllPrebuiltRuleAssets, + deleteAllRules, + getPrebuiltRulesAndTimelinesStatus, + installPrebuiltRulesAndTimelines, +} from '../../../utils'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const supertest = getService('supertest'); const log = getService('log'); - describe('install_large_prebuilt_rules_package', () => { + describe('@ess @serverless @skipInQA install_large_prebuilt_rules_package', () => { beforeEach(async () => { await deleteAllRules(supertest, log); await deleteAllPrebuiltRuleAssets(es); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/ess.config.ts similarity index 61% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/ess.config.ts index 63e43d962a52e..7fec27a5d9276 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/ess.config.ts @@ -7,12 +7,16 @@ import { FtrConfigProviderContext } from '@kbn/test'; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [require.resolve('./update_prebuilt_rules_package.ts')], + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine ESS / Prebuilt Rules Management API Integration Tests', + }, }; } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/serverless.config.ts new file mode 100644 index 0000000000000..89916d26e7a73 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/serverless.config.ts @@ -0,0 +1,15 @@ +/* + * 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 { createTestConfig } from '../../../../../../config/serverless/config.base'; + +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine Serverless / Prebuilt Rules Management API Integration Tests', + }, +}); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/fleet_integration.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts similarity index 79% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/fleet_integration.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts index 1433cb7cac2ff..0eff0a25c2cb8 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/fleet_integration.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts @@ -5,24 +5,23 @@ * 2.0. */ import expect from 'expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { deleteAllRules, - deleteAllTimelines, getPrebuiltRulesAndTimelinesStatus, -} from '../../utils'; -import { deleteAllPrebuiltRuleAssets } from '../../utils/prebuilt_rules/delete_all_prebuilt_rule_assets'; -import { installPrebuiltRulesFleetPackage } from '../../utils/prebuilt_rules/install_prebuilt_rules_fleet_package'; -import { installPrebuiltRulesAndTimelines } from '../../utils/prebuilt_rules/install_prebuilt_rules_and_timelines'; -import { deletePrebuiltRulesFleetPackage } from '../../utils/prebuilt_rules/delete_prebuilt_rules_fleet_package'; + installPrebuiltRulesAndTimelines, +} from '../../../utils'; +import { deleteAllPrebuiltRuleAssets } from '../../../utils/rules/prebuilt_rules/delete_all_prebuilt_rule_assets'; +import { deleteAllTimelines } from '../../../utils/rules/prebuilt_rules/delete_all_timelines'; +import { deletePrebuiltRulesFleetPackage } from '../../../utils/rules/prebuilt_rules/delete_prebuilt_rules_fleet_package'; +import { installPrebuiltRulesFleetPackage } from '../../../utils/rules/prebuilt_rules/install_prebuilt_rules_fleet_package'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const supertest = getService('supertest'); const log = getService('log'); - describe('install_prebuilt_rules_from_real_package', () => { + describe('@ess @serverless @skipInQA install_prebuilt_rules_from_real_package', () => { beforeEach(async () => { await deletePrebuiltRulesFleetPackage(supertest); await deleteAllRules(supertest, log); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/get_prebuilt_rules_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/get_prebuilt_rules_status.ts similarity index 96% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/get_prebuilt_rules_status.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/get_prebuilt_rules_status.ts index ae43e3bdd5098..16dba27616947 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/get_prebuilt_rules_status.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/get_prebuilt_rules_status.ts @@ -6,32 +6,29 @@ */ import expect from 'expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { - createRule, + deleteAllPrebuiltRuleAssets, deleteAllRules, + getPrebuiltRulesStatus, + createRule, + getSimpleRule, + createRuleAssetSavedObject, + createPrebuiltRuleAssetSavedObjects, + installPrebuiltRules, deleteRule, + upgradePrebuiltRules, + createHistoricalPrebuiltRuleAssetSavedObjects, getPrebuiltRulesAndTimelinesStatus, - getSimpleRule, installPrebuiltRulesAndTimelines, -} from '../../utils'; -import { - createHistoricalPrebuiltRuleAssetSavedObjects, - createPrebuiltRuleAssetSavedObjects, - createRuleAssetSavedObject, -} from '../../utils/prebuilt_rules/create_prebuilt_rule_saved_objects'; -import { deleteAllPrebuiltRuleAssets } from '../../utils/prebuilt_rules/delete_all_prebuilt_rule_assets'; -import { getPrebuiltRulesStatus } from '../../utils/prebuilt_rules/get_prebuilt_rules_status'; -import { installPrebuiltRules } from '../../utils/prebuilt_rules/install_prebuilt_rules'; -import { upgradePrebuiltRules } from '../../utils/prebuilt_rules/upgrade_prebuilt_rules'; +} from '../../../utils'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); const es = getService('es'); const log = getService('log'); - describe('Prebuilt Rules status', () => { + describe('@ess @serverless @skipInQA Prebuilt Rules status', () => { describe('get_prebuilt_rules_status', () => { beforeEach(async () => { await deleteAllPrebuiltRuleAssets(es); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/get_prebuilt_timelines_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/get_prebuilt_timelines_status.ts similarity index 88% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/get_prebuilt_timelines_status.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/get_prebuilt_timelines_status.ts index 05b34ffa98ed7..9acef16bfbeb1 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/get_prebuilt_timelines_status.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/get_prebuilt_timelines_status.ts @@ -6,19 +6,18 @@ */ import expect from 'expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { deleteAllTimelines, getPrebuiltRulesAndTimelinesStatus, installPrebuiltRulesAndTimelines, -} from '../../utils'; +} from '../../../utils'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); const es = getService('es'); - describe('get_prebuilt_timelines_status', () => { + describe('@ess @serverless @skipInQA get_prebuilt_timelines_status', () => { beforeEach(async () => { await deleteAllTimelines(es); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/index.ts similarity index 73% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/index.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/index.ts index 67ae12c357351..52a745e0e7975 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/index.ts @@ -5,11 +5,10 @@ * 2.0. */ -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default ({ loadTestFile }: FtrProviderContext): void => { - describe('detection engine api security and spaces enabled - Prebuilt Rules', function () { + describe('Detection Engine API - Prebuilt Rules Management', function () { loadTestFile(require.resolve('./get_prebuilt_rules_status')); loadTestFile(require.resolve('./get_prebuilt_timelines_status')); loadTestFile(require.resolve('./install_and_upgrade_prebuilt_rules')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/install_and_upgrade_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/install_and_upgrade_prebuilt_rules.ts similarity index 95% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/install_and_upgrade_prebuilt_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/install_and_upgrade_prebuilt_rules.ts index 85af64415c95e..a75c8f87bd783 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/install_and_upgrade_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/install_and_upgrade_prebuilt_rules.ts @@ -4,34 +4,30 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import expect from 'expect'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { deleteAllRules, deleteAllTimelines, + deleteAllPrebuiltRuleAssets, + createRuleAssetSavedObject, + createPrebuiltRuleAssetSavedObjects, + installPrebuiltRulesAndTimelines, deleteRule, getPrebuiltRulesAndTimelinesStatus, -} from '../../utils'; -import { createHistoricalPrebuiltRuleAssetSavedObjects, - createPrebuiltRuleAssetSavedObjects, - createRuleAssetSavedObject, -} from '../../utils/prebuilt_rules/create_prebuilt_rule_saved_objects'; -import { deleteAllPrebuiltRuleAssets } from '../../utils/prebuilt_rules/delete_all_prebuilt_rule_assets'; -import { installPrebuiltRulesAndTimelines } from '../../utils/prebuilt_rules/install_prebuilt_rules_and_timelines'; -import { installPrebuiltRules } from '../../utils/prebuilt_rules/install_prebuilt_rules'; -import { getPrebuiltRulesStatus } from '../../utils/prebuilt_rules/get_prebuilt_rules_status'; -import { upgradePrebuiltRules } from '../../utils/prebuilt_rules/upgrade_prebuilt_rules'; -import { getInstalledRules } from '../../utils/prebuilt_rules/get_installed_rules'; - -// eslint-disable-next-line import/no-default-export + getPrebuiltRulesStatus, + installPrebuiltRules, + getInstalledRules, + upgradePrebuiltRules, +} from '../../../utils'; + export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const supertest = getService('supertest'); const log = getService('log'); - describe('install and upgrade prebuilt rules with mock rule assets', () => { + describe('@ess @serverless @skipInQA install and upgrade prebuilt rules with mock rule assets', () => { beforeEach(async () => { await deleteAllRules(supertest, log); await deleteAllTimelines(es); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/ess.config.ts similarity index 60% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/config.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/ess.config.ts index 2430b8f2148d9..0def0b0f17a5f 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/prebuilt_rules/config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/ess.config.ts @@ -7,12 +7,16 @@ import { FtrConfigProviderContext } from '@kbn/test'; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const functionalConfig = await readConfigFile(require.resolve('../config.base.ts')); + const functionalConfig = await readConfigFile( + require.resolve('../../../../../../config/ess/config.base.trial') + ); return { ...functionalConfig.getAll(), - testFiles: [require.resolve('.')], + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine ESS / Update Prebuilt Rules Package - API Integration Tests', + }, }; } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/serverless.config.ts new file mode 100644 index 0000000000000..5f6716342c924 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/configs/serverless.config.ts @@ -0,0 +1,16 @@ +/* + * 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 { createTestConfig } from '../../../../../../config/serverless/config.base'; + +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: + 'Detection Engine Serverless / Update Prebuilt Rules Package - API Integration Tests', + }, +}); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/index.ts new file mode 100644 index 0000000000000..48d0fb1f1fd99 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/index.ts @@ -0,0 +1,14 @@ +/* + * 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 { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default ({ loadTestFile }: FtrProviderContext): void => { + describe('Detection Engine API - Update Prebuilt Rules Package', function () { + loadTestFile(require.resolve('./update_prebuilt_rules_package')); + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/update_prebuilt_rules_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/update_prebuilt_rules_package.ts similarity index 93% rename from x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/update_prebuilt_rules_package.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/update_prebuilt_rules_package.ts index 1d7939e83f9ab..981bfd7126780 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/update_prebuilt_rules_package/update_prebuilt_rules_package.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/update_prebuilt_rules_package/update_prebuilt_rules_package.ts @@ -8,25 +8,23 @@ import fs from 'fs/promises'; import path from 'path'; import getMajorVersion from 'semver/functions/major'; import getMinorVersion from 'semver/functions/minor'; -// @ts-expect-error we have to check types with "allowJs: false" for now, causing this import to fail import { REPO_ROOT } from '@kbn/repo-info'; import JSON5 from 'json5'; import expect from 'expect'; import { PackageSpecManifest } from '@kbn/fleet-plugin/common'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { deleteAllPrebuiltRuleAssets, deleteAllRules, + getInstalledRules, getPrebuiltRulesStatus, installPrebuiltRules, + installPrebuiltRulesPackageByVersion, upgradePrebuiltRules, -} from '../../utils'; -import { reviewPrebuiltRulesToInstall } from '../../utils/prebuilt_rules/review_install_prebuilt_rules'; -import { reviewPrebuiltRulesToUpgrade } from '../../utils/prebuilt_rules/review_upgrade_prebuilt_rules'; -import { installPrebuiltRulesPackageByVersion } from '../../utils/prebuilt_rules/install_fleet_package_by_url'; -import { getInstalledRules } from '../../utils/prebuilt_rules/get_installed_rules'; + reviewPrebuiltRulesToInstall, + reviewPrebuiltRulesToUpgrade, +} from '../../../utils'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const supertest = getService('supertest'); @@ -63,7 +61,7 @@ export default ({ getService }: FtrProviderContext): void => { return getPackageResponse.body.item.version ?? ''; }; - describe('update_prebuilt_rules_package', () => { + describe('@ess @serverless @skipInQA update_prebuilt_rules_package', () => { before(async () => { const configFilePath = path.resolve(REPO_ROOT, 'fleet_packages.json'); const fleetPackages = await fs.readFile(configFilePath, 'utf8'); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_prebuilt_rule_assets.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_prebuilt_rule_assets.ts new file mode 100644 index 0000000000000..899d5ddd7f83f --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_prebuilt_rule_assets.ts @@ -0,0 +1,23 @@ +/* + * 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 type { Client } from '@elastic/elasticsearch'; +import { SECURITY_SOLUTION_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; + +/** + * Remove all prebuilt rule assets from the security solution savedObjects index + * @param es The ElasticSearch handle + */ +export const deleteAllPrebuiltRuleAssets = async (es: Client): Promise => { + await es.deleteByQuery({ + index: SECURITY_SOLUTION_SAVED_OBJECT_INDEX, + q: 'type:security-rule', + wait_for_completion: true, + refresh: true, + body: {}, + }); +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_timelines.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_timelines.ts new file mode 100644 index 0000000000000..291cd269580b0 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_all_timelines.ts @@ -0,0 +1,23 @@ +/* + * 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 type { Client } from '@elastic/elasticsearch'; +import { SECURITY_SOLUTION_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; + +/** + * Remove all timelines from the security solution savedObjects index + * @param es The ElasticSearch handle + */ +export const deleteAllTimelines = async (es: Client): Promise => { + await es.deleteByQuery({ + index: SECURITY_SOLUTION_SAVED_OBJECT_INDEX, + q: 'type:siem-ui-timeline', + wait_for_completion: true, + refresh: true, + body: {}, + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts similarity index 84% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts index 1bb596e2baeb1..1647ff301a324 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/delete_prebuilt_rules_fleet_package.ts @@ -18,10 +18,11 @@ export async function deletePrebuiltRulesFleetPackage( ) { const resp = await supertest .get(epmRouteService.getInfoPath('security_detection_engine')) - .send() - .expect(200); + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31') + .send(); - if (resp.body.response.status === 'installed') { + if (resp.status === 200 && resp.body.response.status === 'installed') { await supertest .delete( epmRouteService.getRemovePath('security_detection_engine', resp.body.response.version) diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_installed_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_installed_rules.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_installed_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_installed_rules.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_fleet_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_fleet_package.ts new file mode 100644 index 0000000000000..ec69b6cfb14c2 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_fleet_package.ts @@ -0,0 +1,23 @@ +/* + * 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 { epmRouteService } from '@kbn/fleet-plugin/common'; +import type SuperTest from 'supertest'; + +/** + * Gets the security_detection_engine package using fleet API. + * + * @param supertest Supertest instance + * @returns The API endpoint response. Will have status 200 if package installed or 404 if not + */ +export async function getPrebuiltRulesFleetPackage(supertest: SuperTest.SuperTest) { + return await supertest + .get(epmRouteService.getInfoPath('security_detection_engine')) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31') + .send(); +} diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_status.ts similarity index 95% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_status.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_status.ts index db7d8553ad946..0f785f8a77453 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/get_prebuilt_rules_status.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/get_prebuilt_rules_status.ts @@ -23,6 +23,7 @@ export const getPrebuiltRulesStatus = async ( .get(GET_PREBUILT_RULES_STATUS_URL) .set('kbn-xsrf', 'true') .set('elastic-api-version', '1') + .set('x-elastic-internal-origin', 'foo') .send() .expect(200); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/index.ts index 9970b6b13eeec..fbf9ab7b36384 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/index.ts @@ -5,6 +5,18 @@ * 2.0. */ export * from './create_prebuilt_rule_saved_objects'; +export * from './delete_all_prebuilt_rule_assets'; +export * from './delete_all_timelines'; +export * from './delete_prebuilt_rules_fleet_package'; +export * from './get_installed_rules'; export * from './get_prebuilt_rules_and_timelines_status'; +export * from './get_prebuilt_rules_status'; +export * from './get_prebuilt_rules_fleet_package'; +export * from './install_fleet_package_by_url'; export * from './install_mock_prebuilt_rules'; export * from './install_prebuilt_rules_and_timelines'; +export * from './install_prebuilt_rules_fleet_package'; +export * from './install_prebuilt_rules'; +export * from './review_install_prebuilt_rules'; +export * from './review_upgrade_prebuilt_rules'; +export * from './upgrade_prebuilt_rules'; diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_fleet_package_by_url.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_fleet_package_by_url.ts similarity index 93% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_fleet_package_by_url.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_fleet_package_by_url.ts index bccdf28906e23..259369346cc8b 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_fleet_package_by_url.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_fleet_package_by_url.ts @@ -8,6 +8,7 @@ import type { Client } from '@elastic/elasticsearch'; import type SuperTest from 'supertest'; import { ALL_SAVED_OBJECT_INDICES } from '@kbn/core-saved-objects-server'; import { InstallPackageResponse } from '@kbn/fleet-plugin/common/types'; +import { epmRouteService } from '@kbn/fleet-plugin/common'; /** * Installs latest available non-prerelease prebuilt rules package `security_detection_engine`. @@ -25,6 +26,7 @@ export const installPrebuiltRulesPackageViaFleetAPI = async ( const fleetResponse = await supertest .post(`/api/fleet/epm/packages/security_detection_engine`) .set('kbn-xsrf', 'xxxx') + .set('elastic-api-version', '2023-10-31') .type('application/json') .send({ force: true }) .expect(200); @@ -63,8 +65,9 @@ export const installPrebuiltRulesPackageByVersion = async ( version: string ): Promise => { const fleetResponse = await supertest - .post(`/api/fleet/epm/packages/security_detection_engine/${version}`) + .post(epmRouteService.getInstallPath('security_detection_engine', version)) .set('kbn-xsrf', 'xxxx') + .set('elastic-api-version', '2023-10-31') .type('application/json') .send({ force: true }) .expect(200); diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_prebuilt_rules.ts similarity index 98% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_prebuilt_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_prebuilt_rules.ts index 52e34d67a1936..308fef271e987 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_prebuilt_rules.ts @@ -43,6 +43,7 @@ export const installPrebuiltRules = async ( .post(PERFORM_RULE_INSTALLATION_URL) .set('kbn-xsrf', 'true') .set('elastic-api-version', '1') + .set('x-elastic-internal-origin', 'foo') .send(payload) .expect(200); diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_prebuilt_rules_fleet_package.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_prebuilt_rules_fleet_package.ts similarity index 100% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/install_prebuilt_rules_fleet_package.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/install_prebuilt_rules_fleet_package.ts diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/review_install_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/review_install_prebuilt_rules.ts similarity index 95% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/review_install_prebuilt_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/review_install_prebuilt_rules.ts index ff7987d776213..573b481a3b30f 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/review_install_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/review_install_prebuilt_rules.ts @@ -22,6 +22,7 @@ export const reviewPrebuiltRulesToInstall = async ( .post(REVIEW_RULE_INSTALLATION_URL) .set('kbn-xsrf', 'true') .set('elastic-api-version', '1') + .set('x-elastic-internal-origin', 'securitySolution') .send() .expect(200); diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/review_upgrade_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/review_upgrade_prebuilt_rules.ts similarity index 94% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/review_upgrade_prebuilt_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/review_upgrade_prebuilt_rules.ts index fdcdab5dd9ed3..9bbf980dcccca 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/review_upgrade_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/review_upgrade_prebuilt_rules.ts @@ -22,6 +22,7 @@ export const reviewPrebuiltRulesToUpgrade = async ( .post(REVIEW_RULE_UPGRADE_URL) .set('kbn-xsrf', 'true') .set('elastic-api-version', '1') + .set('x-elastic-internal-origin', 'securitySolution') .send() .expect(200); diff --git a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/upgrade_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/upgrade_prebuilt_rules.ts similarity index 98% rename from x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/upgrade_prebuilt_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/upgrade_prebuilt_rules.ts index 1fbbe46e1e7ff..caadba2619a74 100644 --- a/x-pack/test/detection_engine_api_integration/utils/prebuilt_rules/upgrade_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/prebuilt_rules/upgrade_prebuilt_rules.ts @@ -39,6 +39,7 @@ export const upgradePrebuiltRules = async ( .post(PERFORM_RULE_UPGRADE_URL) .set('kbn-xsrf', 'true') .set('elastic-api-version', '1') + .set('x-elastic-internal-origin', 'foo') .send(payload) .expect(200); diff --git a/x-pack/test/security_solution_api_integration/tsconfig.json b/x-pack/test/security_solution_api_integration/tsconfig.json index 2c3b9082ac7cc..4dfd3ef6ba30d 100644 --- a/x-pack/test/security_solution_api_integration/tsconfig.json +++ b/x-pack/test/security_solution_api_integration/tsconfig.json @@ -31,6 +31,8 @@ "@kbn/core", "@kbn/alerting-plugin", "@kbn/core-http-common", - "@kbn/securitysolution-ecs" + "@kbn/securitysolution-ecs", + "@kbn/fleet-plugin", + "@kbn/repo-info", ] } From 6c5ffd2efa4d0a4523e0934ca5505f5b4fa9be2b Mon Sep 17 00:00:00 2001 From: Gerard Soldevila Date: Fri, 10 Nov 2023 10:23:30 +0100 Subject: [PATCH 27/51] Rework `application_leave_confirm` functional tests (#170449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Reworks https://github.com/elastic/kibana/issues/166838 for better readability and maintainability. Refactors `waitForUrlToBe`, moving it as part of the `browser.ts` API. Flaky test runer pipeline - 100x ⌛ https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3879 🔴 ➡️ https://github.com/elastic/kibana/pull/170449/commits/be19f7efe4bffe9c666e68e47109e935651d5bad https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3884 🟢 --- test/functional/page_objects/common_page.ts | 13 +-- test/functional/services/common/browser.ts | 53 ++++++++- .../core_plugins/application_deep_links.ts | 39 ++----- .../core_plugins/application_leave_confirm.ts | 106 +++--------------- .../test_suites/core_plugins/applications.ts | 67 +++-------- 5 files changed, 88 insertions(+), 190 deletions(-) diff --git a/test/functional/page_objects/common_page.ts b/test/functional/page_objects/common_page.ts index 4c71693dd4125..2c5b8bff30d47 100644 --- a/test/functional/page_objects/common_page.ts +++ b/test/functional/page_objects/common_page.ts @@ -417,18 +417,9 @@ export class CommonPageObject extends FtrService { * Clicks cancel button on modal * @param overlayWillStay pass in true if your test will show multiple modals in succession */ - async clickCancelOnModal(overlayWillStay = true, ignorePageLeaveWarning = false) { + async clickCancelOnModal(overlayWillStay = true) { this.log.debug('Clicking modal cancel'); - await this.testSubjects.exists('confirmModalTitleText'); - - await this.retry.try(async () => { - const warning = await this.testSubjects.exists('confirmModalTitleText'); - if (warning) { - await this.testSubjects.click( - ignorePageLeaveWarning ? 'confirmModalConfirmButton' : 'confirmModalCancelButton' - ); - } - }); + await this.testSubjects.click('confirmModalCancelButton'); if (!overlayWillStay) { await this.ensureModalOverlayHidden(); } diff --git a/test/functional/services/common/browser.ts b/test/functional/services/common/browser.ts index 0a1798442f360..4172e7087ea36 100644 --- a/test/functional/services/common/browser.ts +++ b/test/functional/services/common/browser.ts @@ -6,18 +6,23 @@ * Side Public License, v 1. */ +import Url from 'url'; import { setTimeout as setTimeoutAsync } from 'timers/promises'; import { cloneDeepWith, isString } from 'lodash'; -import { Key, Origin, WebDriver } from 'selenium-webdriver'; +import { Key, Origin, type WebDriver } from 'selenium-webdriver'; import { Driver as ChromiumWebDriver } from 'selenium-webdriver/chrome'; import { modifyUrl } from '@kbn/std'; import sharp from 'sharp'; import { NoSuchSessionError } from 'selenium-webdriver/lib/error'; import { WebElementWrapper } from '../lib/web_element_wrapper'; -import { FtrProviderContext, FtrService } from '../../ftr_provider_context'; +import { type FtrProviderContext, FtrService } from '../../ftr_provider_context'; import { Browsers } from '../remote/browsers'; -import { NetworkOptions, NetworkProfile, NETWORK_PROFILES } from '../remote/network_profiles'; +import { + type NetworkOptions, + type NetworkProfile, + NETWORK_PROFILES, +} from '../remote/network_profiles'; export type Browser = BrowserService; @@ -164,17 +169,53 @@ class BrowserService extends FtrService { /** * Gets the URL that is loaded in the focused window/frame. * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#getCurrentUrl - * + * @param relativeUrl (optional) set to true to return the relative URL (without the hostname and protocol) * @return {Promise} */ - public async getCurrentUrl() { + public async getCurrentUrl(relativeUrl: boolean = false): Promise { // strip _t=Date query param when url is read const current = await this.driver.getCurrentUrl(); const currentWithoutTime = modifyUrl(current, (parsed) => { delete (parsed.query as any)._t; return void 0; }); - return currentWithoutTime; + + if (relativeUrl) { + const { path } = Url.parse(currentWithoutTime); + return path!; // this property includes query params and anchors + } else { + return currentWithoutTime; + } + } + + /** + * Uses the 'retry' service and waits for the current browser URL to match the provided path. + * NB the provided path can contain query params as well as hash anchors. + * Using retry logic makes URL assertions less flaky + * @param expectedPath The relative path that we are expecting the browser to be on + * @returns a Promise that will reject if the browser URL does not match the expected one + */ + public async waitForUrlToBe(expectedPath: string) { + const retry = await this.ctx.getService('retry'); + const log = this.ctx.getService('log'); + + await retry.waitForWithTimeout(`URL to be ${expectedPath}`, 5000, async () => { + const currentPath = await this.getCurrentUrl(true); + + if (currentPath !== expectedPath) { + log.debug(`Expected URL to be ${expectedPath}, got ${currentPath}`); + } + return currentPath === expectedPath; + }); + + // wait some time before checking the URL again + await new Promise((resolve) => setTimeout(resolve, 1000)); + + // ensure the URL stays the same and we did not go through any redirects + const currentPath = await this.getCurrentUrl(true); + if (currentPath !== expectedPath) { + throw new Error(`Expected URL to continue to be ${expectedPath}, got ${currentPath}`); + } } /** diff --git a/test/plugin_functional/test_suites/core_plugins/application_deep_links.ts b/test/plugin_functional/test_suites/core_plugins/application_deep_links.ts index e4973b05bd955..1d326bcdfef82 100644 --- a/test/plugin_functional/test_suites/core_plugins/application_deep_links.ts +++ b/test/plugin_functional/test_suites/core_plugins/application_deep_links.ts @@ -6,16 +6,14 @@ * Side Public License, v 1. */ -import url from 'url'; import expect from '@kbn/expect'; import type { PluginFunctionalProviderContext } from '../../services'; -export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { - const PageObjects = getPageObjects(['common']); +export default function ({ getService, getPageObject }: PluginFunctionalProviderContext) { + const common = getPageObject('common'); const browser = getService('browser'); const appsMenu = getService('appsMenu'); const testSubjects = getService('testSubjects'); - const retry = getService('retry'); const esArchiver = getService('esArchiver'); const log = getService('log'); @@ -27,25 +25,6 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide await testSubjects.click(appLink); }; - const getKibanaUrl = (pathname?: string, search?: string) => - url.format({ - protocol: 'http:', - hostname: process.env.TEST_KIBANA_HOST || 'localhost', - port: process.env.TEST_KIBANA_PORT || '5620', - pathname, - search, - }); - - /** Use retry logic to make URL assertions less flaky */ - const waitForUrlToBe = (pathname?: string, search?: string) => { - const expectedUrl = getKibanaUrl(pathname, search); - return retry.waitFor(`Url to be ${expectedUrl}`, async () => { - const currentUrl = await browser.getCurrentUrl(); - log?.debug(`waiting for currentUrl ${currentUrl} to be expectedUrl ${expectedUrl}`); - return currentUrl === expectedUrl; - }); - }; - const loadingScreenNotShown = async () => expect(await testSubjects.exists('kbnLoadingMessage')).to.be(false); @@ -57,7 +36,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide describe('application deep links navigation', function describeDeepLinksTests() { before(async () => { await esArchiver.emptyKibanaIndex(); - await PageObjects.common.navigateToApp('dl'); + await common.navigateToApp('dl'); }); it('should start on home page', async () => { @@ -66,42 +45,42 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should navigate to page A when navlink is clicked', async () => { await clickAppLink('PageA'); - await waitForUrlToBe('/app/dl/page-a'); + await browser.waitForUrlToBe('/app/dl/page-a'); await loadingScreenNotShown(); await checkAppVisible('PageA'); }); it('should be able to use the back button to navigate back to previous deep link', async () => { await browser.goBack(); - await waitForUrlToBe('/app/dl/home'); + await browser.waitForUrlToBe('/app/dl/home'); await loadingScreenNotShown(); await checkAppVisible('Home'); }); it('should navigate to nested page B when navlink is clicked', async () => { await clickAppLink('DeepPageB'); - await waitForUrlToBe('/app/dl/page-b'); + await browser.waitForUrlToBe('/app/dl/page-b'); await loadingScreenNotShown(); await checkAppVisible('PageB'); }); it('should navigate to Home when navlink is clicked inside the defined category group', async () => { await clickAppLink('Home'); - await waitForUrlToBe('/app/dl/home'); + await browser.waitForUrlToBe('/app/dl/home'); await loadingScreenNotShown(); await checkAppVisible('Home'); }); it('should navigate to nested page B using navigateToApp path', async () => { await clickAppLink('DeepPageB'); - await waitForUrlToBe('/app/dl/page-b'); + await browser.waitForUrlToBe('/app/dl/page-b'); await loadingScreenNotShown(); await checkAppVisible('PageB'); }); it('should navigate to nested page A using navigateToApp deepLinkId', async () => { await clickAppLink('DeepPageAById'); - await waitForUrlToBe('/app/dl/page-a'); + await browser.waitForUrlToBe('/app/dl/page-a'); await loadingScreenNotShown(); await checkAppVisible('PageA'); }); diff --git a/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts b/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts index 4d0f837108b73..5ec44365f7a64 100644 --- a/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts +++ b/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts @@ -6,110 +6,34 @@ * Side Public License, v 1. */ -import expect from '@kbn/expect'; -import url from 'url'; -import { PluginFunctionalProviderContext } from '../../services'; +import type { PluginFunctionalProviderContext } from '../../services'; -const getKibanaUrl = (pathname?: string, search?: string) => - url.format({ - protocol: 'http:', - hostname: process.env.TEST_KIBANA_HOST || 'localhost', - port: process.env.TEST_KIBANA_PORT || '5620', - pathname, - search, - }); - -export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { - const PageObjects = getPageObjects(['common', 'header']); +export default function ({ getService, getPageObject }: PluginFunctionalProviderContext) { + const common = getPageObject('common'); const browser = getService('browser'); const appsMenu = getService('appsMenu'); - const log = getService('log'); - const retry = getService('retry'); const testSubjects = getService('testSubjects'); - const config = getService('config'); - - const waitForUrlToBe = async (pathname?: string, search?: string) => { - const expectedUrl = getKibanaUrl(pathname, search); - return await retry.waitFor(`Url to be ${expectedUrl}`, async () => { - const currentUrl = await browser.getCurrentUrl(); - log.debug(`waiting for currentUrl ${currentUrl} to be expectedUrl ${expectedUrl}`); - return currentUrl === expectedUrl; - }); - }; - - const ensureModalOpen = async ( - defaultTryTimeout: number, - attempts: number, - timeMultiplier: number, - action: 'cancel' | 'confirm', - linkText: string = 'home' - ): Promise => { - let isConfirmCancelModalOpenState = false; - - await retry.tryForTime(defaultTryTimeout * timeMultiplier, async () => { - await appsMenu.clickLink(linkText); - isConfirmCancelModalOpenState = await testSubjects.exists('confirmModalTitleText', { - allowHidden: true, - timeout: defaultTryTimeout * timeMultiplier, - }); - }); - if (isConfirmCancelModalOpenState) { - log.debug(`defaultTryTimeout * ${timeMultiplier} is long enough`); - return action === 'cancel' - ? await PageObjects.common.clickCancelOnModal(true, false) - : await PageObjects.common.clickConfirmOnModal(); - } else { - log.debug(`defaultTryTimeout * ${timeMultiplier} is not long enough`); - return await ensureModalOpen( - defaultTryTimeout, - (attempts = attempts > 0 ? attempts - 1 : 0), - (timeMultiplier = timeMultiplier < 10 ? timeMultiplier + 1 : 10), - action, - linkText - ); - } - }; describe('application using leave confirmation', () => { - const defaultTryTimeout = config.get('timeouts.try'); - const attempts = 5; describe('when navigating to another app', () => { - const timeMultiplier = 10; - beforeEach(async () => { - await PageObjects.common.navigateToApp('home'); - }); it('prevents navigation if user click cancel on the confirmation dialog', async () => { - await PageObjects.common.navigateToApp('appleave1'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await waitForUrlToBe('/app/appleave1'); + await common.navigateToApp('appleave1'); + await browser.waitForUrlToBe('/app/appleave1'); - await ensureModalOpen(defaultTryTimeout, attempts, timeMultiplier, 'cancel', 'AppLeave 2'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await retry.waitFor('navigate to appleave1', async () => { - const currentUrl = await browser.getCurrentUrl(); - log.debug(`currentUrl ${currentUrl}`); - return currentUrl.includes('appleave1'); - }); - const currentUrl = await browser.getCurrentUrl(); - expect(currentUrl).to.contain('appleave1'); - await PageObjects.common.navigateToApp('home'); + await appsMenu.clickLink('AppLeave 2', { category: 'kibana' }); + await testSubjects.existOrFail('appLeaveConfirmModal'); + await common.clickCancelOnModal(false); + await browser.waitForUrlToBe('/app/appleave1'); }); it('allows navigation if user click confirm on the confirmation dialog', async () => { - await PageObjects.common.navigateToApp('appleave1'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await waitForUrlToBe('/app/appleave1'); + await common.navigateToApp('appleave1'); + await browser.waitForUrlToBe('/app/appleave1'); - await ensureModalOpen(defaultTryTimeout, attempts, timeMultiplier, 'confirm', 'AppLeave 2'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await retry.waitFor('navigate to appleave1', async () => { - const currentUrl = await browser.getCurrentUrl(); - log.debug(`currentUrl ${currentUrl}`); - return currentUrl.includes('appleave2'); - }); - const currentUrl = await browser.getCurrentUrl(); - expect(currentUrl).to.contain('appleave2'); - await PageObjects.common.navigateToApp('home'); + await appsMenu.clickLink('AppLeave 2', { category: 'kibana' }); + await testSubjects.existOrFail('appLeaveConfirmModal'); + await common.clickConfirmOnModal(); + await browser.waitForUrlToBe('/app/appleave2'); }); }); }); diff --git a/test/plugin_functional/test_suites/core_plugins/applications.ts b/test/plugin_functional/test_suites/core_plugins/applications.ts index b780ef125b71b..862cb6acfb6df 100644 --- a/test/plugin_functional/test_suites/core_plugins/applications.ts +++ b/test/plugin_functional/test_suites/core_plugins/applications.ts @@ -6,24 +6,17 @@ * Side Public License, v 1. */ -import url from 'url'; import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; -export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { - const PageObjects = getPageObjects(['common', 'header']); +export default function ({ getService, getPageObject }: PluginFunctionalProviderContext) { + const common = getPageObject('common'); const browser = getService('browser'); const appsMenu = getService('appsMenu'); const testSubjects = getService('testSubjects'); const find = getService('find'); - const retry = getService('retry'); const deployment = getService('deployment'); const esArchiver = getService('esArchiver'); - const log = getService('log'); - - function waitUntilLoadingIsDone() { - return PageObjects.header.waitUntilLoadingHasFinished(); - } const loadingScreenNotShown = async () => expect(await testSubjects.exists('kbnLoadingMessage')).to.be(false); @@ -33,33 +26,6 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide return (await wrapper.getSize()).height; }; - const getKibanaUrl = (pathname?: string, search?: string) => - url.format({ - protocol: 'http:', - hostname: process.env.TEST_KIBANA_HOST || 'localhost', - port: process.env.TEST_KIBANA_PORT || '5620', - pathname, - search, - }); - - async function navigateToAppFromAppsMenu(title: string) { - await retry.try(async () => { - await appsMenu.clickLink(title); - await waitUntilLoadingIsDone(); - }); - } - - /** Use retry logic to make URL assertions less flaky */ - const waitForUrlToBe = (pathname?: string, search?: string) => { - const expectedUrl = getKibanaUrl(pathname, search); - return retry.waitFor(`Url to be ${expectedUrl}`, async () => { - const currentUrl = await browser.getCurrentUrl(); - if (currentUrl !== expectedUrl) - log.debug(`expected url to be ${expectedUrl}, got ${currentUrl}`); - return currentUrl === expectedUrl; - }); - }; - const navigateTo = async (path: string) => await browser.navigateTo(`${deployment.getHostPort()}${path}`); @@ -67,8 +33,8 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide describe.skip('ui applications', function describeIndexTests() { before(async () => { await esArchiver.emptyKibanaIndex(); - await PageObjects.common.navigateToApp('foo'); - await PageObjects.common.dismissBanner(); + await common.navigateToApp('foo'); + await common.dismissBanner(); }); it('starts on home page', async () => { @@ -77,40 +43,37 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('redirects and renders correctly regardless of trailing slash', async () => { await navigateTo(`/app/foo`); - await waitForUrlToBe('/app/foo/home'); + await browser.waitForUrlToBe('/app/foo/home'); await testSubjects.existOrFail('fooAppHome'); await navigateTo(`/app/foo/`); - await waitForUrlToBe('/app/foo/home'); + await browser.waitForUrlToBe('/app/foo/home'); await testSubjects.existOrFail('fooAppHome'); }); it('navigates to its own pages', async () => { // Go to page A await testSubjects.click('fooNavPageA'); - await waitForUrlToBe('/app/foo/page-a'); + await browser.waitForUrlToBe('/app/foo/page-a'); await loadingScreenNotShown(); await testSubjects.existOrFail('fooAppPageA'); // Go to home page await testSubjects.click('fooNavHome'); - await waitForUrlToBe('/app/foo/home'); + await browser.waitForUrlToBe('/app/foo/home'); await loadingScreenNotShown(); await testSubjects.existOrFail('fooAppHome'); }); it('can use the back button to navigate within an app', async () => { await browser.goBack(); - await waitForUrlToBe('/app/foo/page-a'); + await browser.waitForUrlToBe('/app/foo/page-a'); await loadingScreenNotShown(); await testSubjects.existOrFail('fooAppPageA'); }); it('navigates to app root when navlink is clicked', async () => { - await testSubjects.click('fooNavHome'); - - navigateToAppFromAppsMenu('Foo'); - - await waitForUrlToBe('/app/foo/home'); + await appsMenu.clickLink('Foo', { category: 'kibana' }); + await browser.waitForUrlToBe('/app/foo/home'); await loadingScreenNotShown(); await testSubjects.existOrFail('fooAppHome'); }); @@ -119,7 +82,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide await testSubjects.click('fooNavBarPageB'); await loadingScreenNotShown(); await testSubjects.existOrFail('barAppPageB'); - await waitForUrlToBe('/app/bar/page-b', 'query=here'); + await browser.waitForUrlToBe('/app/bar/page-b?query=here'); }); it('preserves query parameters across apps', async () => { @@ -129,7 +92,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('can use the back button to navigate back to previous app', async () => { await browser.goBack(); - await waitForUrlToBe('/app/foo/home'); + await browser.waitForUrlToBe('/app/foo/home'); await loadingScreenNotShown(); await testSubjects.existOrFail('fooAppHome'); }); @@ -139,7 +102,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); it('navigating to chromeless application hides chrome', async () => { - await PageObjects.common.navigateToApp('chromeless'); + await common.navigateToApp('chromeless'); await loadingScreenNotShown(); expect(await testSubjects.exists('headerGlobalNav')).to.be(false); @@ -149,7 +112,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); it('navigating away from chromeless application shows chrome', async () => { - await PageObjects.common.navigateToApp('foo'); + await common.navigateToApp('foo'); await loadingScreenNotShown(); expect(await testSubjects.exists('headerGlobalNav')).to.be(true); From cc2f8866699592d6506ad192eab76fe21f021cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:28:37 +0000 Subject: [PATCH 28/51] [Profiling] ES client (#170844) We should use the Profiling ES credential when it's provided. That should not be a problem for production clusters, as the settings are never set. --- .../profiling_data_access/server/services/setup_state/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/profiling_data_access/server/services/setup_state/index.ts b/x-pack/plugins/profiling_data_access/server/services/setup_state/index.ts index d11668e1af6e9..6e1b62b28f85d 100644 --- a/x-pack/plugins/profiling_data_access/server/services/setup_state/index.ts +++ b/x-pack/plugins/profiling_data_access/server/services/setup_state/index.ts @@ -28,7 +28,7 @@ export async function getSetupState({ }: RegisterServicesParams & SetupStateParams): Promise { const kibanaInternalProfilingESClient = createProfilingEsClient({ esClient: esClient.asInternalUser, - useDefaultAuth: true, + useDefaultAuth: false, }); const profilingESClient = createProfilingEsClient({ esClient: esClient.asCurrentUser, From 0ddbfc0bba8442faa4820f3fb5893fdf469dee09 Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Fri, 10 Nov 2023 12:32:53 +0100 Subject: [PATCH 29/51] [Security Solution] Unskips and fixes `detection_response` tests (#170937) --- .../dasbhoards/detection_response.cy.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts index 694209bbc8b22..e19e4ca043b3c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts @@ -31,6 +31,7 @@ import { import { QUERY_TAB_BUTTON, TIMELINE_DATA_PROVIDERS_CONTAINER } from '../../../screens/timeline'; import { waitForAlerts } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; +import { deleteAlertsAndRules } from '../../../tasks/common'; import { investigateDashboardItemInTimeline } from '../../../tasks/dashboards/common'; import { waitToNavigateAwayFrom } from '../../../tasks/kibana_navigation'; import { login } from '../../../tasks/login'; @@ -42,10 +43,10 @@ import { ALERTS_URL, DASHBOARDS_URL, DETECTION_AND_RESPONSE_URL } from '../../.. const TEST_USER_NAME = 'test'; const SIEM_KIBANA_HOST_NAME = 'siem-kibana'; -// FLAKY: https://github.com/elastic/kibana/issues/168772 -// FLAKY: https://github.com/elastic/kibana/issues/168771 -describe.skip('Detection response view', { tags: ['@ess', '@serverless'] }, () => { +describe('Detection response view', { tags: ['@ess', '@serverless'] }, () => { before(() => { + deleteAlertsAndRules(); + cy.task('esArchiverLoad', { archiveName: 'auditbeat_multiple' }); createRule(getNewRule()); }); @@ -67,8 +68,8 @@ describe.skip('Detection response view', { tags: ['@ess', '@serverless'] }, () = kqlSearch(`host.name : ${SIEM_KIBANA_HOST_NAME}{enter}`); cy.get(HOST_TABLE_ROW_TOTAL_ALERTS).should('have.length', 1); - cy.get(RULE_TABLE_ROW_TOTAL_ALERTS).should('have.text', 2); - cy.get(ALERTS_DONUT_CHART).first().should('include.text', '2Open'); + cy.get(RULE_TABLE_ROW_TOTAL_ALERTS).should('have.text', 1); + cy.get(ALERTS_DONUT_CHART).first().should('include.text', '1Open'); }); it(`filters out the users with KQL search bar query`, () => { @@ -83,8 +84,8 @@ describe.skip('Detection response view', { tags: ['@ess', '@serverless'] }, () = kqlSearch(`user.name : ${TEST_USER_NAME}{enter}`); cy.get(USER_TABLE_ROW_TOTAL_ALERTS).should('have.length', 1); - cy.get(RULE_TABLE_ROW_TOTAL_ALERTS).should('have.text', 2); - cy.get(ALERTS_DONUT_CHART).first().should('include.text', '2Open'); + cy.get(RULE_TABLE_ROW_TOTAL_ALERTS).should('have.text', 1); + cy.get(ALERTS_DONUT_CHART).first().should('include.text', '1Open'); }); }); @@ -229,7 +230,7 @@ describe.skip('Detection response view', { tags: ['@ess', '@serverless'] }, () = expect(url.pathname.endsWith(ALERTS_URL)).eq(true); }); waitForAlerts(); - cy.get(ALERTS_COUNT).should('be.visible').should('have.text', `${alertCount} alerts`); + cy.get(ALERTS_COUNT).should('be.visible').should('have.text', `${alertCount} alert`); cy.get(CONTROL_FRAMES).should('have.length', 2); cy.get(OPTION_LIST_LABELS).eq(0).should('have.text', `Status`); cy.get(OPTION_LIST_VALUES(0)).should('have.text', 'open1'); @@ -254,7 +255,7 @@ describe.skip('Detection response view', { tags: ['@ess', '@serverless'] }, () = cy.get(USER_TABLE_ROW_SEV(severityVal)).click(); waitToNavigateAwayFrom(DASHBOARDS_URL); waitForAlerts(); - cy.get(ALERTS_COUNT).should('be.visible').should('have.text', `${alertCount} alerts`); + cy.get(ALERTS_COUNT).should('be.visible').should('have.text', `${alertCount} alert`); cy.get(CONTROL_FRAMES).should('have.length', 3); cy.get(OPTION_LIST_LABELS).eq(0).should('have.text', `Status`); cy.get(OPTION_LIST_VALUES(0)).should('have.text', 'open1'); From 7a6d009002a4c8e8284f4400fc3cde55eaf6a186 Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Fri, 10 Nov 2023 12:52:53 +0100 Subject: [PATCH 30/51] [Index management] Unskip flaky enrich policies test (#171006) --- .../common/management/index_management/create_enrich_policy.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts b/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts index b3e248ea82de4..f5b51c815e0fe 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index_management/create_enrich_policy.ts @@ -20,8 +20,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const POLICY_NAME = `policy-${Math.random()}`; describe('Create enrich policy', function () { - // TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="enrichPoliciesEmptyPromptCreateButton"]) - this.tags(['failsOnMKI']); before(async () => { log.debug('Creating test index'); try { From 875268d55888b598bb765bd7d4adc3527d671de2 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Fri, 10 Nov 2023 13:07:04 +0100 Subject: [PATCH 31/51] [ML] Show alerts data on the Anomaly timeline (#167998) ## Summary With alerts-as-data integration added in https://github.com/elastic/kibana/pull/166349, we're enabled to incorporate alerts historical data into views in the ML UI to see how it correlates with the anomaly results. This PR add alerts data to the Anomaly Explorer page. If selected anomaly detection jobs have associated alerting rules, we show a new "Alerts" panel. It contains: image #### A line chart with alerts count over time using the Lens embeddable It support sync cursor with the Anomaly swim lane making it easier to align anomalous buckets with alerts spikes. image #### Summary of the alerting rules Shows an aggregated information for each alerting rule associated with the current job selection: - An indicator if alerting rule is active - Total number of alerts - Duration of the latest alerts - Start time for active rules and Recovery time for recovered Rules summary has a descending order based on the following criteria: - Number of active alerts in rule - Total number of alerts in rule - Duration of the most recent alert in rule image #### Alert details It contains an alerts table provided by `triggersActionsUI` plugin. For each alert the user can: - Open alerts details page - Attach an alert to a new case - Attach n alert to an existing case image #### Alert context menu When an anomaly swim lane cells are selected, and there are alerts within the chosen time range, a context menu displaying alert details is shown. image ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../src/alerts_as_data_rbac.ts | 1 + .../src/default_alerts_as_data.ts | 2 +- x-pack/plugins/ml/common/constants/alerts.ts | 39 +++ .../alert_actions.tsx | 228 ++++++++++++++ .../anomaly_detection_alerts_table/index.ts | 8 + .../register_alerts_table_configuration.tsx | 149 ++++++++++ .../render_cell_value.tsx | 115 +++++++ .../use_alerts_flyout.tsx | 52 ++++ .../ml/public/alerting/register_ml_alerts.ts | 9 + .../components/chart_tooltip/index.ts | 2 +- .../collapsible_panel/collapsible_panel.tsx | 24 +- .../components/collapsible_panel/index.ts | 1 + .../collapsible_panel/panel_header_items.tsx | 45 +++ .../contexts/kibana/kibana_context.ts | 4 +- .../contexts/kibana/use_field_formatter.ts | 26 +- .../explorer/alerts/alerts_panel.tsx | 118 ++++++++ .../explorer/alerts/alerts_summary.tsx | 128 ++++++++ .../anomaly_detection_alerts_state_service.ts | 226 ++++++++++++++ .../application/explorer/alerts/chart.tsx | 189 ++++++++++++ .../application/explorer/alerts/const.ts | 31 ++ .../alerts/get_alerts_summary.test.ts | 128 ++++++++ .../explorer/alerts/get_alerts_summary.ts | 60 ++++ .../application/explorer/alerts/index.ts | 11 + .../explorer/alerts/swim_lane_wrapper.tsx | 281 ++++++++++++++++++ .../explorer/annotation_timeline.tsx | 184 ++++++++++++ .../explorer/anomaly_explorer_context.tsx | 11 + .../application/explorer/anomaly_timeline.tsx | 52 ++-- .../anomaly_timeline_state_service.ts | 54 ++++ .../public/application/explorer/explorer.tsx | 13 +- .../explorer/swimlane_container.tsx | 2 +- x-pack/plugins/ml/public/plugin.ts | 11 +- .../ml/server/lib/alerts/alerting_service.ts | 14 +- .../register_anomaly_detection_alert_type.ts | 27 +- x-pack/plugins/ml/tsconfig.json | 2 + 34 files changed, 2168 insertions(+), 79 deletions(-) create mode 100644 x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx create mode 100644 x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/index.ts create mode 100644 x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx create mode 100644 x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/render_cell_value.tsx create mode 100644 x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/use_alerts_flyout.tsx create mode 100644 x-pack/plugins/ml/public/application/components/collapsible_panel/panel_header_items.tsx create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/alerts_panel.tsx create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/alerts_summary.tsx create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/anomaly_detection_alerts_state_service.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/chart.tsx create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/const.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.test.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/index.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/alerts/swim_lane_wrapper.tsx create mode 100644 x-pack/plugins/ml/public/application/explorer/annotation_timeline.tsx diff --git a/packages/kbn-rule-data-utils/src/alerts_as_data_rbac.ts b/packages/kbn-rule-data-utils/src/alerts_as_data_rbac.ts index 06fe06c63b4b9..0427570b1cbc6 100644 --- a/packages/kbn-rule-data-utils/src/alerts_as_data_rbac.ts +++ b/packages/kbn-rule-data-utils/src/alerts_as_data_rbac.ts @@ -23,6 +23,7 @@ export const AlertConsumers = { SLO: 'slo', SIEM: 'siem', UPTIME: 'uptime', + ML: 'ml', } as const; export type AlertConsumers = typeof AlertConsumers[keyof typeof AlertConsumers]; export type STATUS_VALUES = 'open' | 'acknowledged' | 'closed' | 'in-progress'; // TODO: remove 'in-progress' after migration to 'acknowledged' diff --git a/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts b/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts index 3b2ea148591dc..d1aec24a9b26e 100644 --- a/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts +++ b/packages/kbn-rule-data-utils/src/default_alerts_as_data.ts @@ -27,7 +27,7 @@ const ALERT_ACTION_GROUP = `${ALERT_NAMESPACE}.action_group` as const; // kibana.alert.case_ids - array of cases associated with the alert const ALERT_CASE_IDS = `${ALERT_NAMESPACE}.case_ids` as const; -// kibana.alert.duration.us - alert duration in nanoseconds - updated each execution +// kibana.alert.duration.us - alert duration in microseconds - updated each execution // that the alert is active const ALERT_DURATION = `${ALERT_NAMESPACE}.duration.us` as const; diff --git a/x-pack/plugins/ml/common/constants/alerts.ts b/x-pack/plugins/ml/common/constants/alerts.ts index 1b373b2ec435b..4582f06b214b6 100644 --- a/x-pack/plugins/ml/common/constants/alerts.ts +++ b/x-pack/plugins/ml/common/constants/alerts.ts @@ -6,6 +6,13 @@ */ import { i18n } from '@kbn/i18n'; +import { + ALERT_DURATION, + ALERT_NAMESPACE, + ALERT_RULE_NAME, + ALERT_START, + ALERT_STATUS, +} from '@kbn/rule-data-utils'; import { JobsHealthTests } from '../types/alerts'; export const ML_ALERT_TYPES = { @@ -75,3 +82,35 @@ export const HEALTH_CHECK_NAMES: Record>({ + [ALERT_RULE_NAME]: i18n.translate('xpack.ml.alertsTable.columns.ruleName', { + defaultMessage: 'Rule name', + }), + [ALERT_STATUS]: i18n.translate('xpack.ml.alertsTable.columns.status', { + defaultMessage: 'Status', + }), + [ALERT_ANOMALY_DETECTION_JOB_ID]: i18n.translate('xpack.ml.alertsTable.columns.jobId', { + defaultMessage: 'Job ID', + }), + [ALERT_ANOMALY_SCORE]: i18n.translate('xpack.ml.alertsTable.columns.anomalyScore', { + defaultMessage: 'Latest anomaly score', + }), + [ALERT_ANOMALY_TIMESTAMP]: i18n.translate('xpack.ml.alertsTable.columns.anomalyTime', { + defaultMessage: 'Latest anomaly time', + }), + [ALERT_DURATION]: i18n.translate('xpack.ml.alertsTable.columns.duration', { + defaultMessage: 'Duration', + }), + [ALERT_START]: i18n.translate('xpack.ml.alertsTable.columns.start', { + defaultMessage: 'Start time', + }), +}); diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx new file mode 100644 index 0000000000000..e0206043d5442 --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx @@ -0,0 +1,228 @@ +/* + * 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 { + EuiButtonIcon, + EuiContextMenuItem, + EuiContextMenuPanel, + EuiPopover, + EuiToolTip, +} from '@elastic/eui'; + +import React, { useCallback, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { CaseAttachmentsWithoutOwner } from '@kbn/cases-plugin/public'; +import { AttachmentType } from '@kbn/cases-plugin/common'; +import { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; +import { + ALERT_RULE_NAME, + ALERT_RULE_UUID, + ALERT_STATUS, + ALERT_STATUS_ACTIVE, + ALERT_UUID, +} from '@kbn/rule-data-utils'; +import { useBulkUntrackAlerts } from '@kbn/triggers-actions-ui-plugin/public'; +import { type Alert } from '@kbn/triggers-actions-ui-plugin/public/types'; +import { PLUGIN_ID } from '../../../common/constants/app'; +import { useMlKibana } from '../../application/contexts/kibana'; + +export interface AlertActionsProps { + alert: Alert; + ecsData: Ecs; + id?: string; + refresh: () => void; + setFlyoutAlert: React.Dispatch>; +} + +const CASES_ACTIONS_ENABLED = false; + +export function AlertActions({ + alert, + ecsData, + id: pageId, + refresh, + setFlyoutAlert, +}: AlertActionsProps) { + const alertDoc = Object.entries(alert).reduce((acc, [key, val]) => { + return { ...acc, [key]: val?.[0] }; + }, {}); + + const { + cases, + http: { + basePath: { prepend }, + }, + } = useMlKibana().services; + const casesPrivileges = cases?.helpers.canUseCases(); + + const { mutateAsync: untrackAlerts } = useBulkUntrackAlerts(); + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const ruleId = alert[ALERT_RULE_UUID]?.[0] ?? null; + const alertId = alert[ALERT_UUID]?.[0] ?? ''; + + const linkToRule = ruleId + ? prepend(`/app/management/insightsAndAlerting/triggersActions/rule/${ruleId}`) + : null; + + const caseAttachments: CaseAttachmentsWithoutOwner = useMemo(() => { + return ecsData?._id + ? [ + { + alertId: alertId ?? '', + index: ecsData?._index ?? '', + type: AttachmentType.alert, + rule: { + id: ruleId, + name: alert[ALERT_RULE_NAME]![0], + }, + owner: PLUGIN_ID, + }, + ] + : []; + }, [alert, alertId, ecsData?._id, ecsData?._index, ruleId]); + + const isActiveAlert = useMemo(() => alert[ALERT_STATUS]![0] === ALERT_STATUS_ACTIVE, [alert]); + + const onSuccess = useCallback(() => { + refresh(); + }, [refresh]); + + const createCaseFlyout = cases!.hooks.useCasesAddToNewCaseFlyout({ onSuccess }); + const selectCaseModal = cases!.hooks.useCasesAddToExistingCaseModal({ onSuccess }); + + const closeActionsPopover = () => { + setIsPopoverOpen(false); + }; + + const toggleActionsPopover = () => { + setIsPopoverOpen(!isPopoverOpen); + }; + + const handleAddToNewCaseClick = () => { + createCaseFlyout.open({ attachments: caseAttachments }); + closeActionsPopover(); + }; + + const handleAddToExistingCaseClick = () => { + selectCaseModal.open({ getAttachments: () => caseAttachments }); + closeActionsPopover(); + }; + + const handleUntrackAlert = useCallback(async () => { + await untrackAlerts({ + indices: [ecsData?._index ?? ''], + alertUuids: [alertId], + }); + onSuccess(); + }, [untrackAlerts, alertId, ecsData, onSuccess]); + + const actionsMenuItems = [ + ...(CASES_ACTIONS_ENABLED && casesPrivileges?.create && casesPrivileges.read + ? [ + + {i18n.translate('xpack.ml.alerts.actions.addToCase', { + defaultMessage: 'Add to existing case', + })} + , + + {i18n.translate('xpack.ml.alerts.actions.addToNewCase', { + defaultMessage: 'Add to new case', + })} + , + ] + : []), + ...(linkToRule + ? [ + + {i18n.translate('xpack.ml.alertsTable.viewRuleDetailsButtonText', { + defaultMessage: 'View rule details', + })} + , + ] + : []), + { + closeActionsPopover(); + setFlyoutAlert({ fields: alertDoc }); + }} + > + {i18n.translate('xpack.ml.alertsTable.viewAlertDetailsButtonText', { + defaultMessage: 'View alert details', + })} + , + ...(isActiveAlert + ? [ + + {i18n.translate('xpack.ml.alerts.actions.untrack', { + defaultMessage: 'Mark as untracked', + })} + , + ] + : []), + ]; + + const actionsToolTip = + actionsMenuItems.length <= 0 + ? i18n.translate('xpack.ml.alertsTable.notEnoughPermissions', { + defaultMessage: 'Additional privileges required', + }) + : i18n.translate('xpack.ml.alertsTable.moreActionsTextLabel', { + defaultMessage: 'More actions', + }); + + return ( + <> + + + + } + closePopover={closeActionsPopover} + isOpen={isPopoverOpen} + panelPaddingSize="none" + > + + + + ); +} diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/index.ts b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/index.ts new file mode 100644 index 0000000000000..c44f579efe6dc --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { registerAlertsTableConfiguration } from './register_alerts_table_configuration'; diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx new file mode 100644 index 0000000000000..709bfdf188627 --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/register_alerts_table_configuration.tsx @@ -0,0 +1,149 @@ +/* + * 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 React from 'react'; +import { i18n } from '@kbn/i18n'; +import { type TriggersAndActionsUIPublicPluginSetup } from '@kbn/triggers-actions-ui-plugin/public'; +import type { + AlertsTableConfigurationRegistry, + RenderCustomActionsRowArgs, +} from '@kbn/triggers-actions-ui-plugin/public/types'; +import { EuiDataGridColumn } from '@elastic/eui'; +import { SortCombinations } from '@elastic/elasticsearch/lib/api/types'; +import type { SortOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { + ALERT_DURATION, + ALERT_END, + ALERT_REASON, + ALERT_RULE_NAME, + ALERT_START, + ALERT_STATUS, +} from '@kbn/rule-data-utils'; +import type { FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; +import { getAlertFlyout } from './use_alerts_flyout'; +import { + ALERT_ANOMALY_DETECTION_JOB_ID, + ALERT_ANOMALY_SCORE, + ALERT_ANOMALY_TIMESTAMP, +} from '../../../common/constants/alerts'; +import { getAlertFormatters, getRenderCellValue } from './render_cell_value'; +import { AlertActions } from './alert_actions'; + +export function registerAlertsTableConfiguration( + triggersActionsUi: TriggersAndActionsUIPublicPluginSetup, + fieldFormats: FieldFormatsRegistry +) { + const columns: EuiDataGridColumn[] = [ + { + id: ALERT_STATUS, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.status', { + defaultMessage: 'Status', + }), + initialWidth: 150, + }, + { + id: ALERT_REASON, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.reason', { + defaultMessage: 'Reason', + }), + initialWidth: 150, + }, + { + id: ALERT_RULE_NAME, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.ruleName', { + defaultMessage: 'Rule name', + }), + initialWidth: 150, + }, + { + id: ALERT_ANOMALY_DETECTION_JOB_ID, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.jobId', { + defaultMessage: 'Job ID', + }), + initialWidth: 150, + }, + { + id: ALERT_ANOMALY_SCORE, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.anomalyScore', { + defaultMessage: 'Latest anomaly score', + }), + initialWidth: 150, + isSortable: true, + schema: 'numeric', + }, + { + id: ALERT_START, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.triggeredAt', { + defaultMessage: 'Triggered at', + }), + initialWidth: 250, + schema: 'datetime', + }, + { + id: ALERT_END, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.recoveredAt', { + defaultMessage: 'Recovered at', + }), + initialWidth: 250, + schema: 'datetime', + }, + { + id: ALERT_ANOMALY_TIMESTAMP, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.anomalyTime', { + defaultMessage: 'Latest anomaly time', + }), + initialWidth: 250, + schema: 'datetime', + }, + { + id: ALERT_DURATION, + displayAsText: i18n.translate('xpack.ml.alertsTable.columns.duration', { + defaultMessage: 'Duration', + }), + initialWidth: 150, + schema: 'numeric', + }, + ]; + + const sort: SortCombinations[] = [ + { + [ALERT_START]: { + order: 'desc' as SortOrder, + }, + }, + ]; + + const config: AlertsTableConfigurationRegistry = { + id: ML_ALERTS_CONFIG_ID, + columns, + useInternalFlyout: getAlertFlyout(columns, getAlertFormatters(fieldFormats)), + getRenderCellValue: getRenderCellValue(fieldFormats), + sort, + useActionsColumn: () => ({ + renderCustomActionsRow: ({ + alert, + id, + setFlyoutAlert, + refresh, + }: RenderCustomActionsRowArgs) => { + return ( + + ); + }, + }), + }; + + triggersActionsUi.alertsTableConfigurationRegistry.register(config); +} + +export const ML_ALERTS_CONFIG_ID = 'mlAlerts'; diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/render_cell_value.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/render_cell_value.tsx new file mode 100644 index 0000000000000..e58f8cd69e1b3 --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/render_cell_value.tsx @@ -0,0 +1,115 @@ +/* + * 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 { isEmpty } from 'lodash'; +import React, { type ReactNode } from 'react'; +import { isDefined } from '@kbn/ml-is-defined'; +import { ALERT_DURATION, ALERT_END, ALERT_START } from '@kbn/rule-data-utils'; +import type { GetRenderCellValue } from '@kbn/triggers-actions-ui-plugin/public'; +import { FIELD_FORMAT_IDS, FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; +import { getSeverityColor } from '@kbn/ml-anomaly-utils'; +import { EuiHealth } from '@elastic/eui'; +import { + alertFieldNameMap, + ALERT_ANOMALY_SCORE, + ALERT_ANOMALY_TIMESTAMP, +} from '../../../common/constants/alerts'; +import { getFieldFormatterProvider } from '../../application/contexts/kibana/use_field_formatter'; + +interface Props { + columnId: string; + data: any; +} + +export const getMappedNonEcsValue = ({ + data, + fieldName, +}: { + data: any[]; + fieldName: string; +}): string[] | undefined => { + const item = data.find((d) => d.field === fieldName); + if (item != null && item.value != null) { + return item.value; + } + return undefined; +}; + +const getRenderValue = (mappedNonEcsValue: any) => { + // can be updated when working on https://github.com/elastic/kibana/issues/140819 + const value = Array.isArray(mappedNonEcsValue) ? mappedNonEcsValue.join() : mappedNonEcsValue; + + if (!isEmpty(value)) { + if (typeof value === 'object') { + return JSON.stringify(value); + } + return value; + } + + return '—'; +}; + +export const getRenderCellValue = (fieldFormats: FieldFormatsRegistry): GetRenderCellValue => { + const alertValueFormatter = getAlertFormatters(fieldFormats); + + return ({ setFlyoutAlert }) => + (props): ReactNode => { + const { columnId, data } = props as Props; + if (!isDefined(data)) return; + + const mappedNonEcsValue = getMappedNonEcsValue({ + data, + fieldName: columnId, + }); + const value = getRenderValue(mappedNonEcsValue); + + return alertValueFormatter(columnId, value); + }; +}; + +export function getAlertFormatters(fieldFormats: FieldFormatsRegistry) { + const getFormatter = getFieldFormatterProvider(fieldFormats); + + return (columnId: string, value: any): React.ReactElement => { + switch (columnId) { + case ALERT_START: + case ALERT_END: + case ALERT_ANOMALY_TIMESTAMP: + return <>{getFormatter(FIELD_FORMAT_IDS.DATE)(value)}; + case ALERT_DURATION: + return ( + <> + {getFormatter(FIELD_FORMAT_IDS.DURATION, { + inputFormat: 'microseconds', + outputFormat: 'humanizePrecise', + })(value)} + + ); + case ALERT_ANOMALY_SCORE: + return ( + + {getFormatter(FIELD_FORMAT_IDS.NUMBER)(value)} + + ); + default: + return <>{value}; + } + }; +} + +export function getAlertEntryFormatter(fieldFormats: FieldFormatsRegistry) { + const alertValueFormatter = getAlertFormatters(fieldFormats); + + return (columnId: string, value: any): { title: string; description: any } => { + return { + title: alertFieldNameMap[columnId], + description: alertValueFormatter(columnId, value), + }; + }; +} + +export type RegisterFormatter = ReturnType; diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/use_alerts_flyout.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/use_alerts_flyout.tsx new file mode 100644 index 0000000000000..71a04bd78719d --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/use_alerts_flyout.tsx @@ -0,0 +1,52 @@ +/* + * 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 { + AlertsTableFlyoutBaseProps, + AlertTableFlyoutComponent, +} from '@kbn/triggers-actions-ui-plugin/public'; +import { get } from 'lodash'; +import React from 'react'; +import { type EuiDataGridColumn, EuiDescriptionList, EuiPanel, EuiTitle } from '@elastic/eui'; +import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; +import { isDefined } from '@kbn/ml-is-defined'; +import { RegisterFormatter } from './render_cell_value'; + +const FlyoutHeader: AlertTableFlyoutComponent = ({ alert }: AlertsTableFlyoutBaseProps) => { + const name = alert[ALERT_RULE_NAME]; + return ( + +

{name}

+ + ); +}; + +export const getAlertFlyout = + (columns: EuiDataGridColumn[], formatter: RegisterFormatter) => () => { + const FlyoutBody: AlertTableFlyoutComponent = ({ alert, id }: AlertsTableFlyoutBaseProps) => ( + + { + const value = get(alert, column.id)?.[0]; + + return { + title: column.displayAsText as string, + description: isDefined(value) ? formatter(column.id, value) : '—', + }; + })} + type="column" + columnWidths={[1, 3]} // Same as [25, 75] + /> + + ); + + return { + body: FlyoutBody, + header: FlyoutHeader, + footer: null, + }; + }; diff --git a/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts b/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts index 3379c145bf364..9acb265bb12af 100644 --- a/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts +++ b/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import { lazy } from 'react'; import type { TriggersAndActionsUIPublicPluginSetup } from '@kbn/triggers-actions-ui-plugin/public'; import type { PluginSetupContract as AlertingSetup } from '@kbn/alerting-plugin/public'; +import type { MlCoreSetup } from '../plugin'; import { ML_ALERT_TYPES } from '../../common/constants/alerts'; import type { MlAnomalyDetectionAlertParams } from '../../common/types/alerts'; import { ML_APP_ROUTE, PLUGIN_ID } from '../../common/constants/app'; @@ -18,6 +19,7 @@ import { registerJobsHealthAlertingRule } from './jobs_health_rule'; export function registerMlAlerts( triggersActionsUi: TriggersAndActionsUIPublicPluginSetup, + getStartServices: MlCoreSetup['getStartServices'], alerting?: AlertingSetup ) { triggersActionsUi.ruleTypeRegistry.register({ @@ -137,6 +139,13 @@ export function registerMlAlerts( if (alerting) { registerNavigation(alerting); } + + // Async import to prevent a bundle size increase + Promise.all([getStartServices(), import('./anomaly_detection_alerts_table')]).then( + ([[_, mlStartDependencies], { registerAlertsTableConfiguration }]) => { + registerAlertsTableConfiguration(triggersActionsUi, mlStartDependencies.fieldFormats); + } + ); } export function registerNavigation(alerting: AlertingSetup) { diff --git a/x-pack/plugins/ml/public/application/components/chart_tooltip/index.ts b/x-pack/plugins/ml/public/application/components/chart_tooltip/index.ts index c4bbf6f8d2d7f..d7e83511f3a15 100644 --- a/x-pack/plugins/ml/public/application/components/chart_tooltip/index.ts +++ b/x-pack/plugins/ml/public/application/components/chart_tooltip/index.ts @@ -5,5 +5,5 @@ * 2.0. */ -export { ChartTooltipService } from './chart_tooltip_service'; +export { ChartTooltipService, type TooltipData } from './chart_tooltip_service'; export { MlTooltipComponent } from './chart_tooltip'; diff --git a/x-pack/plugins/ml/public/application/components/collapsible_panel/collapsible_panel.tsx b/x-pack/plugins/ml/public/application/components/collapsible_panel/collapsible_panel.tsx index d01e676b16daf..dbb04ddbc39f0 100644 --- a/x-pack/plugins/ml/public/application/components/collapsible_panel/collapsible_panel.tsx +++ b/x-pack/plugins/ml/public/application/components/collapsible_panel/collapsible_panel.tsx @@ -15,7 +15,7 @@ import { EuiTitle, } from '@elastic/eui'; import React, { type FC } from 'react'; -import { css } from '@emotion/react'; +import { PanelHeaderItems } from './panel_header_items'; import { useCurrentThemeVars } from '../../contexts/kibana'; export interface CollapsiblePanelProps { @@ -67,27 +67,7 @@ export const CollapsiblePanel: FC = ({ {headerItems ? ( - - {headerItems.map((item, i) => { - return ( - -
- {item} -
-
- ); - })} -
+
) : null} diff --git a/x-pack/plugins/ml/public/application/components/collapsible_panel/index.ts b/x-pack/plugins/ml/public/application/components/collapsible_panel/index.ts index d45a251f69ca9..0b3f9186ff601 100644 --- a/x-pack/plugins/ml/public/application/components/collapsible_panel/index.ts +++ b/x-pack/plugins/ml/public/application/components/collapsible_panel/index.ts @@ -6,3 +6,4 @@ */ export { CollapsiblePanel } from './collapsible_panel'; +export { PanelHeaderItems } from './panel_header_items'; diff --git a/x-pack/plugins/ml/public/application/components/collapsible_panel/panel_header_items.tsx b/x-pack/plugins/ml/public/application/components/collapsible_panel/panel_header_items.tsx new file mode 100644 index 0000000000000..fa766abadfeb4 --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/collapsible_panel/panel_header_items.tsx @@ -0,0 +1,45 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { css } from '@emotion/react/dist/emotion-react.cjs'; +import React, { type FC } from 'react'; +import { useCurrentThemeVars } from '../../contexts/kibana'; + +export interface PanelHeaderItems { + headerItems: React.ReactElement[]; + compressed?: boolean; +} + +export const PanelHeaderItems: FC = ({ headerItems, compressed = false }) => { + const { euiTheme } = useCurrentThemeVars(); + + return ( + + {headerItems.map((item, i) => { + return ( + +
+ {item} +
+
+ ); + })} +
+ ); +}; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts index 29fdc7dc2f5b3..5d143a55d5c27 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts @@ -29,8 +29,8 @@ import type { ContentManagementPublicStart } from '@kbn/content-management-plugi import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; -import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import type { FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; import type { MlServicesContext } from '../../app'; interface StartPlugins { @@ -43,7 +43,7 @@ interface StartPlugins { dataViews: DataViewsPublicPluginStart; dataVisualizer?: DataVisualizerPluginStart; embeddable: EmbeddableStart; - fieldFormats: FieldFormatsStart; + fieldFormats: FieldFormatsRegistry; lens: LensPublicStart; licenseManagement?: LicenseManagementUIPluginSetup; maps?: MapsStartApi; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_field_formatter.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_field_formatter.ts index 7d34615d61758..3f417cf6f6b6e 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_field_formatter.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/use_field_formatter.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { FIELD_FORMAT_IDS, FieldFormatParams } from '@kbn/field-formats-plugin/common'; +import { + FIELD_FORMAT_IDS, + FieldFormatParams, + FieldFormatsRegistry, +} from '@kbn/field-formats-plugin/common'; import { useMlKibana } from './kibana_context'; /** @@ -16,16 +20,24 @@ const defaultParam: Record = { inputFormat: 'milliseconds', outputFormat: 'humanizePrecise', }, + [FIELD_FORMAT_IDS.NUMBER]: { + pattern: '00.00', + }, }; +export const getFieldFormatterProvider = + (fieldFormats: FieldFormatsRegistry) => + (fieldType: FIELD_FORMAT_IDS, params?: FieldFormatParams) => { + const fieldFormatter = fieldFormats.deserialize({ + id: fieldType, + params: params ?? defaultParam[fieldType], + }); + return fieldFormatter.convert.bind(fieldFormatter); + }; + export function useFieldFormatter(fieldType: FIELD_FORMAT_IDS) { const { services: { fieldFormats }, } = useMlKibana(); - - const fieldFormatter = fieldFormats.deserialize({ - id: fieldType, - params: defaultParam[fieldType], - }); - return fieldFormatter.convert.bind(fieldFormatter); + return getFieldFormatterProvider(fieldFormats)(fieldType); } diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/alerts_panel.tsx b/x-pack/plugins/ml/public/application/explorer/alerts/alerts_panel.tsx new file mode 100644 index 0000000000000..d5a5821aae98a --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/alerts_panel.tsx @@ -0,0 +1,118 @@ +/* + * 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 { + EuiButtonGroup, + EuiFlexGroup, + EuiFlexItem, + EuiNotificationBadge, + EuiSpacer, + EuiLoadingSpinner, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { ALERT_STATUS_ACTIVE, AlertConsumers, type AlertStatus } from '@kbn/rule-data-utils'; +import React, { type FC, useState } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { ML_ALERTS_CONFIG_ID } from '../../../alerting/anomaly_detection_alerts_table/register_alerts_table_configuration'; +import { CollapsiblePanel } from '../../components/collapsible_panel'; +import { useMlKibana } from '../../contexts/kibana'; +import { useAnomalyExplorerContext } from '../anomaly_explorer_context'; +import { AlertsSummary } from './alerts_summary'; +import { AnomalyDetectionAlertsOverviewChart } from './chart'; +import { statusNameMap } from './const'; + +export const AlertsPanel: FC = () => { + const { + services: { triggersActionsUi }, + } = useMlKibana(); + + const [isOpen, setIsOpen] = useState(true); + const [toggleSelected, setToggleSelected] = useState(`alertsSummary`); + + const { anomalyDetectionAlertsStateService } = useAnomalyExplorerContext(); + + const countByStatus = useObservable(anomalyDetectionAlertsStateService.countByStatus$); + const alertsQuery = useObservable(anomalyDetectionAlertsStateService.alertsQuery$, {}); + const isLoading = useObservable(anomalyDetectionAlertsStateService.isLoading$, true); + + const alertStateProps = { + alertsTableConfigurationRegistry: triggersActionsUi!.alertsTableConfigurationRegistry, + configurationId: ML_ALERTS_CONFIG_ID, + id: `ml-details-alerts`, + featureIds: [AlertConsumers.ML], + query: alertsQuery, + showExpandToDetails: true, + showAlertStatusWithFlapping: true, + }; + const alertsStateTable = triggersActionsUi!.getAlertsStateTable(alertStateProps); + + const toggleButtons = [ + { + id: `alertsSummary`, + label: i18n.translate('xpack.ml.explorer.alertsPanel.summaryLabel', { + defaultMessage: 'Summary', + }), + }, + { + id: `alertsTable`, + label: i18n.translate('xpack.ml.explorer.alertsPanel.detailsLabel', { + defaultMessage: 'Details', + }), + }, + ]; + + return ( + <> + + + + + {isLoading ? ( + + + + ) : null} + + } + headerItems={Object.entries(countByStatus ?? {}).map(([status, count]) => { + return ( + <> + {statusNameMap[status as AlertStatus]}{' '} + + {count} + + + ); + })} + > + + + + + + + {toggleSelected === 'alertsTable' ? alertsStateTable : } + + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/alerts_summary.tsx b/x-pack/plugins/ml/public/application/explorer/alerts/alerts_summary.tsx new file mode 100644 index 0000000000000..bf0469a0f3145 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/alerts_summary.tsx @@ -0,0 +1,128 @@ +/* + * 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 { + EuiBadge, + EuiDescriptionList, + EuiFlexGroup, + EuiFlexItem, + EuiTitle, + EuiFlexGrid, + EuiPagination, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ALERT_DURATION, ALERT_END } from '@kbn/rule-data-utils'; +import React, { useMemo, useState } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { statusNameMap } from './const'; +import { getAlertFormatters } from '../../../alerting/anomaly_detection_alerts_table/render_cell_value'; +import { useMlKibana } from '../../contexts/kibana'; +import { useAnomalyExplorerContext } from '../anomaly_explorer_context'; +import { getAlertsSummary } from './get_alerts_summary'; + +const PAGE_SIZE = 3; + +export const AlertsSummary: React.FC = () => { + const { + services: { fieldFormats }, + } = useMlKibana(); + const { anomalyDetectionAlertsStateService } = useAnomalyExplorerContext(); + + const alertsData = useObservable(anomalyDetectionAlertsStateService.anomalyDetectionAlerts$, []); + const formatter = getAlertFormatters(fieldFormats); + + const [activePage, setActivePage] = useState(0); + + const sortedAlertsByRule = useMemo(() => { + return getAlertsSummary(alertsData); + }, [alertsData]); + + const pageItems = useMemo(() => { + return sortedAlertsByRule.slice(activePage * PAGE_SIZE, (activePage + 1) * PAGE_SIZE); + }, [activePage, sortedAlertsByRule]); + + return ( + <> + + {pageItems.map(([ruleName, ruleSummary]) => { + return ( + + + + +
{ruleName}
+
+
+ {ruleSummary.activeCount > 0 ? ( + + {statusNameMap.active} + + ) : null} +
+ + 0 + ? [ + { + title: i18n.translate('xpack.ml.explorer.alertsPanel.summary.startedAt', { + defaultMessage: 'Started at: ', + }), + description: formatter(ALERT_END, ruleSummary.startedAt), + }, + ] + : [ + { + title: i18n.translate( + 'xpack.ml.explorer.alertsPanel.summary.recoveredAt', + { + defaultMessage: 'Recovered at: ', + } + ), + description: formatter(ALERT_END, ruleSummary.recoveredAt), + }, + ]), + { + title: i18n.translate('xpack.ml.explorer.alertsPanel.summary.lastDuration', { + defaultMessage: 'Last duration: ', + }), + description: formatter(ALERT_DURATION, ruleSummary.lastDuration), + }, + ]} + /> +
+ ); + })} +
+ {sortedAlertsByRule.length > PAGE_SIZE ? ( + + + + + + ) : null} + + ); +}; diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/anomaly_detection_alerts_state_service.ts b/x-pack/plugins/ml/public/application/explorer/alerts/anomaly_detection_alerts_state_service.ts new file mode 100644 index 0000000000000..4141c582834f7 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/anomaly_detection_alerts_state_service.ts @@ -0,0 +1,226 @@ +/* + * 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 { BehaviorSubject, combineLatest, EMPTY, type Observable, Subscription } from 'rxjs'; +import { catchError, debounceTime, map, startWith, switchMap, tap } from 'rxjs/operators'; +import { + DataPublicPluginStart, + isRunningResponse, + TimefilterContract, +} from '@kbn/data-plugin/public'; +import type { + RuleRegistrySearchRequest, + RuleRegistrySearchResponse, +} from '@kbn/rule-registry-plugin/common'; +import { + ALERT_DURATION, + ALERT_END, + ALERT_RULE_NAME, + ALERT_RULE_TYPE_ID, + ALERT_START, + ALERT_STATUS, + ALERT_UUID, + AlertConsumers, +} from '@kbn/rule-data-utils'; +import { isDefined } from '@kbn/ml-is-defined'; +import { getSeverityColor } from '@kbn/ml-anomaly-utils'; +import { + ALERT_ANOMALY_DETECTION_JOB_ID, + ALERT_ANOMALY_SCORE, + ALERT_ANOMALY_TIMESTAMP, + ML_ALERT_TYPES, +} from '../../../../common/constants/alerts'; +import { StateService } from '../../services/state_service'; +import { AnomalyTimelineStateService } from '../anomaly_timeline_state_service'; + +export interface AnomalyDetectionAlert { + id: string; + [ALERT_ANOMALY_SCORE]: number; + [ALERT_ANOMALY_DETECTION_JOB_ID]: string; + [ALERT_ANOMALY_TIMESTAMP]: number; + [ALERT_START]: number; + [ALERT_END]: number | undefined; + [ALERT_RULE_NAME]: string; + [ALERT_STATUS]: string; + [ALERT_DURATION]: number; + // Additional fields for the UI + color: string; +} + +export type AlertsQuery = Exclude; + +export class AnomalyDetectionAlertsStateService extends StateService { + /** + * Subject that holds the anomaly detection alerts from the alert-as-data index. + * @private + */ + private readonly _aadAlerts$ = new BehaviorSubject([]); + + private readonly _isLoading$ = new BehaviorSubject(true); + + constructor( + private readonly _anomalyTimelineStateServices: AnomalyTimelineStateService, + private readonly data: DataPublicPluginStart, + private readonly timefilter: TimefilterContract + ) { + super(); + + this.selectedAlerts$ = combineLatest([ + this._aadAlerts$, + this._anomalyTimelineStateServices.getSelectedCells$().pipe(map((cells) => cells?.times)), + ]).pipe( + map(([alerts, selectedTimes]) => { + if (!Array.isArray(selectedTimes)) return null; + + return alerts.filter( + (alert) => + alert[ALERT_ANOMALY_TIMESTAMP] >= selectedTimes[0] * 1000 && + alert[ALERT_ANOMALY_TIMESTAMP] <= selectedTimes[1] * 1000 + ); + }) + ); + + const timeUpdates$ = this.timefilter.getTimeUpdate$().pipe( + startWith(null), + map(() => this.timefilter.getTime()) + ); + + this.alertsQuery$ = combineLatest([ + this._anomalyTimelineStateServices.getSwimLaneJobs$(), + timeUpdates$, + ]).pipe( + // Create a result query from the input + map(([selectedJobs, timeRange]) => { + return { + bool: { + filter: [ + { + term: { + [ALERT_RULE_TYPE_ID]: ML_ALERT_TYPES.ANOMALY_DETECTION, + }, + }, + { + range: { + [ALERT_ANOMALY_TIMESTAMP]: { + gte: timeRange.from, + lte: timeRange.to, + }, + }, + }, + { + terms: { + [ALERT_ANOMALY_DETECTION_JOB_ID]: selectedJobs.map((job) => job.id), + }, + }, + ], + }, + } as AlertsQuery; + }) + ); + + this._init(); + } + + /** + * Count the number of alerts by status. + * @param alerts + */ + public countAlertsByStatus(alerts: AnomalyDetectionAlert[]): Record { + return alerts.reduce( + (acc, alert) => { + if (!isDefined(acc[alert[ALERT_STATUS]])) { + acc[alert[ALERT_STATUS]] = 0; + } else { + acc[alert[ALERT_STATUS]]++; + } + return acc; + }, + { active: 0, recovered: 0 } as Record + ); + } + + public readonly anomalyDetectionAlerts$: Observable = + this._aadAlerts$.asObservable(); + + /** + * Query for fetching alerts data based on the job selection and time range. + */ + public readonly alertsQuery$: Observable; + + public readonly isLoading$: Observable = this._isLoading$.asObservable(); + + /** + * Observable for the alerts within the swim lane selection. + */ + public readonly selectedAlerts$: Observable; + + public readonly countByStatus$: Observable> = this._aadAlerts$.pipe( + map((alerts) => { + return this.countAlertsByStatus(alerts); + }) + ); + + protected _initSubscriptions(): Subscription { + const subscription = new Subscription(); + + subscription.add( + this.alertsQuery$ + .pipe( + tap(() => { + this._isLoading$.next(true); + }), + debounceTime(300), + switchMap((query) => { + return this.data.search + .search( + { + featureIds: [AlertConsumers.ML], + query, + }, + { strategy: 'privateRuleRegistryAlertsSearchStrategy' } + ) + .pipe( + catchError((error) => { + // Catch error to prevent the observable from completing + return EMPTY; + }) + ); + }) + ) + .subscribe((response) => { + if (!isRunningResponse(response)) { + this._aadAlerts$.next( + response.rawResponse.hits.hits + .map(({ fields }) => { + if (!isDefined(fields)) return; + const anomalyScore = Number(fields[ALERT_ANOMALY_SCORE][0]); + return { + id: fields[ALERT_UUID][0], + [ALERT_RULE_NAME]: fields[ALERT_RULE_NAME][0], + [ALERT_ANOMALY_SCORE]: anomalyScore, + [ALERT_ANOMALY_DETECTION_JOB_ID]: fields[ALERT_ANOMALY_DETECTION_JOB_ID][0], + [ALERT_ANOMALY_TIMESTAMP]: new Date( + fields[ALERT_ANOMALY_TIMESTAMP][0] + ).getTime(), + [ALERT_START]: fields[ALERT_START][0], + // Can be undefined if the alert is still active + [ALERT_END]: fields[ALERT_END]?.[0], + [ALERT_STATUS]: fields[ALERT_STATUS][0], + [ALERT_DURATION]: fields[ALERT_DURATION][0], + color: getSeverityColor(anomalyScore), + }; + }) + .filter(isDefined) + ); + this._isLoading$.next(false); + } + }) + ); + + return subscription; + } +} diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/chart.tsx b/x-pack/plugins/ml/public/application/explorer/alerts/chart.tsx new file mode 100644 index 0000000000000..fa8b9a3de3c58 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/chart.tsx @@ -0,0 +1,189 @@ +/* + * 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 React, { type FC, useMemo } from 'react'; +import { useTimeRangeUpdates } from '@kbn/ml-date-picker'; +import type { TypedLensByValueInput } from '@kbn/lens-plugin/public'; +import useObservable from 'react-use/lib/useObservable'; +import { css } from '@emotion/react'; +import { i18n } from '@kbn/i18n'; +import { Y_AXIS_LABEL_WIDTH } from '../swimlane_annotation_container'; +import { useAnomalyExplorerContext } from '../anomaly_explorer_context'; +import { useMlKibana } from '../../contexts/kibana'; + +export interface AnomalyDetectionAlertsOverviewChart { + seriesType?: 'bar_stacked' | 'line'; +} + +export const AnomalyDetectionAlertsOverviewChart: FC = ({ + seriesType = 'line', +}) => { + const { + services: { + lens: { EmbeddableComponent }, + }, + } = useMlKibana(); + + const { anomalyTimelineStateService } = useAnomalyExplorerContext(); + + const timeRange = useTimeRangeUpdates(); + + const interval = useObservable( + anomalyTimelineStateService.getSwimLaneBucketInterval$(), + anomalyTimelineStateService.getSwimLaneBucketInterval() + ); + + const attributes = useMemo(() => { + return { + title: '', + visualizationType: 'lnsXY', + references: [], + type: 'lens', + state: { + internalReferences: [ + { + type: 'index-pattern', + id: 'ml-alerts-data-view', + name: 'indexpattern-datasource-layer-layer1', + }, + ], + adHocDataViews: { + 'ml-alerts-data-view': { + id: 'ml-alerts-data-view', + title: '.alerts-ml.anomaly-detection.alerts-default', + timeFieldName: '@timestamp', + }, + }, + visualization: { + hideEndzones: true, + legend: { + isVisible: false, + }, + valueLabels: 'hide', + fittingFunction: 'None', + axisTitlesVisibilitySettings: { + x: false, + yLeft: false, + yRight: false, + }, + tickLabelsVisibilitySettings: { + x: true, + yLeft: true, + yRight: true, + }, + labelsOrientation: { + x: 0, + yLeft: 0, + yRight: 0, + }, + gridlinesVisibilitySettings: { + x: true, + yLeft: true, + yRight: true, + }, + preferredSeriesType: seriesType, + layers: [ + { + layerId: 'layer1', + accessors: ['7327df72-9def-4642-a72d-dc2b0790d5f9'], + position: 'top', + seriesType, + showGridlines: false, + layerType: 'data', + xAccessor: '953f9efc-fbf6-44e0-a450-c645d2b5ec22', + }, + ], + }, + query: { + query: '', + language: 'kuery', + }, + filters: [], + datasourceStates: { + formBased: { + layers: { + layer1: { + columns: { + '953f9efc-fbf6-44e0-a450-c645d2b5ec22': { + label: '@timestamp', + dataType: 'date', + operationType: 'date_histogram', + sourceField: '@timestamp', + isBucketed: true, + scale: 'interval', + params: { + interval: interval?.expression, + includeEmptyRows: true, + dropPartials: false, + }, + }, + '7327df72-9def-4642-a72d-dc2b0790d5f9': { + label: i18n.translate('xpack.ml.explorer.alerts.totalAlerts', { + defaultMessage: 'Total alerts', + }), + dataType: 'number', + operationType: 'count', + isBucketed: false, + scale: 'ratio', + sourceField: '___records___', + params: { + emptyAsNull: false, + format: { + id: 'number', + params: { + decimals: 0, + compact: true, + }, + }, + }, + }, + }, + columnOrder: [ + '953f9efc-fbf6-44e0-a450-c645d2b5ec22', + '7327df72-9def-4642-a72d-dc2b0790d5f9', + ], + incompleteColumns: {}, + sampling: 1, + }, + }, + }, + indexpattern: { + layers: {}, + }, + textBased: { + layers: {}, + }, + }, + }, + } as TypedLensByValueInput['attributes']; + }, [interval?.expression, seriesType]); + + if (!interval) return null; + + return ( +
+ +
+ ); +}; diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/const.ts b/x-pack/plugins/ml/public/application/explorer/alerts/const.ts new file mode 100644 index 0000000000000..5f2fe187a5e64 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/const.ts @@ -0,0 +1,31 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { + ALERT_STATUS_ACTIVE, + ALERT_STATUS_RECOVERED, + ALERT_STATUS_UNTRACKED, +} from '@kbn/rule-data-utils'; + +export const statusNameMap = { + [ALERT_STATUS_ACTIVE]: i18n.translate('xpack.ml.explorer.alertsPanel.statusNameMap.active', { + defaultMessage: 'Active', + }), + [ALERT_STATUS_RECOVERED]: i18n.translate( + 'xpack.ml.explorer.alertsPanel.statusNameMap.recovered', + { + defaultMessage: 'Recovered', + } + ), + [ALERT_STATUS_UNTRACKED]: i18n.translate( + 'xpack.ml.explorer.alertsPanel.statusNameMap.untracked', + { + defaultMessage: 'Untracked', + } + ), +} as const; diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.test.ts b/x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.test.ts new file mode 100644 index 0000000000000..f8340164ddbae --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.test.ts @@ -0,0 +1,128 @@ +/* + * 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 { + ALERT_RULE_NAME, + ALERT_STATUS, + ALERT_START, + ALERT_END, + ALERT_DURATION, +} from '@kbn/rule-data-utils'; +import { AnomalyDetectionAlert } from './anomaly_detection_alerts_state_service'; +import { getAlertsSummary } from './get_alerts_summary'; + +describe('getAlertsSummary', () => { + test('should return an empty array when given an empty array', () => { + const alertsData: AnomalyDetectionAlert[] = []; + const result = getAlertsSummary(alertsData); + expect(result).toEqual([]); + }); + + test('should group alerts by rule name and return a sorted array of rule summaries', () => { + const timestamp01 = new Date('2022-01-01T00:00:00.000Z').getTime(); + const timestamp02 = new Date('2022-01-01T01:00:00.000Z').getTime(); + const timestamp03 = new Date('2022-01-01T02:00:00.000Z').getTime(); + const timestamp04 = new Date('2022-01-01T04:00:00.000Z').getTime(); + + const alertsData: AnomalyDetectionAlert[] = [ + { + [ALERT_RULE_NAME]: 'rule-1', + [ALERT_STATUS]: 'active', + [ALERT_START]: timestamp01, + [ALERT_END]: timestamp02, + [ALERT_DURATION]: 3600000, + }, + { + [ALERT_RULE_NAME]: 'rule-1', + [ALERT_STATUS]: 'recovered', + [ALERT_START]: timestamp02, + [ALERT_END]: timestamp03, + [ALERT_DURATION]: 3600000, + }, + { + [ALERT_RULE_NAME]: 'rule-2', + [ALERT_STATUS]: 'active', + [ALERT_START]: timestamp01, + [ALERT_END]: timestamp02, + [ALERT_DURATION]: 3600000, + }, + { + [ALERT_RULE_NAME]: 'rule-2', + [ALERT_STATUS]: 'active', + [ALERT_START]: timestamp01, + [ALERT_END]: timestamp02, + [ALERT_DURATION]: 3600000, + }, + { + [ALERT_RULE_NAME]: 'rule-2', + [ALERT_STATUS]: 'recovered', + [ALERT_START]: timestamp02, + [ALERT_END]: timestamp04, + [ALERT_DURATION]: 3600000, + }, + { + [ALERT_RULE_NAME]: 'rule-3', + [ALERT_STATUS]: 'recovered', + [ALERT_START]: timestamp02, + [ALERT_END]: timestamp04, + [ALERT_DURATION]: 3600000, + }, + { + [ALERT_RULE_NAME]: 'rule-4', + [ALERT_STATUS]: 'recovered', + [ALERT_START]: timestamp02, + [ALERT_END]: timestamp04, + [ALERT_DURATION]: 6400000, + }, + ] as AnomalyDetectionAlert[]; + + const result = getAlertsSummary(alertsData); + + expect(result).toEqual([ + [ + 'rule-2', + { + totalCount: 3, + activeCount: 2, + recoveredAt: timestamp04, + startedAt: timestamp02, + lastDuration: 3600000, + }, + ], + [ + 'rule-1', + { + totalCount: 2, + activeCount: 1, + recoveredAt: timestamp03, + startedAt: timestamp02, + lastDuration: 3600000, + }, + ], + [ + 'rule-4', + { + totalCount: 1, + activeCount: 0, + recoveredAt: timestamp04, + startedAt: timestamp02, + lastDuration: 6400000, + }, + ], + [ + 'rule-3', + { + totalCount: 1, + activeCount: 0, + recoveredAt: timestamp04, + startedAt: timestamp02, + lastDuration: 3600000, + }, + ], + ]); + }); +}); diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.ts b/x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.ts new file mode 100644 index 0000000000000..b75a5cb3c1543 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/get_alerts_summary.ts @@ -0,0 +1,60 @@ +/* + * 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 { + ALERT_DURATION, + ALERT_RULE_NAME, + ALERT_STATUS, + ALERT_END, + ALERT_START, + ALERT_STATUS_ACTIVE, +} from '@kbn/rule-data-utils'; +import { groupBy } from 'lodash'; +import { AnomalyDetectionAlert } from './anomaly_detection_alerts_state_service'; + +export type RulesSummary = Array<[string, RuleSummary]>; + +export interface RuleSummary { + activeCount: number; + totalCount: number; + lastDuration: number; + startedAt: number; + recoveredAt: number | undefined; +} + +export function getAlertsSummary(alertsData: AnomalyDetectionAlert[]): RulesSummary { + return Object.entries(groupBy(alertsData, ALERT_RULE_NAME) ?? []) + .map<[string, RuleSummary]>(([ruleName, alerts]) => { + // Find the latest alert for each rule + const latestAlert: AnomalyDetectionAlert = alerts.reduce((latest, alert) => { + return alert[ALERT_START] > latest[ALERT_START] ? alert : latest; + }); + + return [ + ruleName, + { + totalCount: alerts.length, + activeCount: alerts.filter((alert) => alert[ALERT_STATUS] === ALERT_STATUS_ACTIVE).length, + recoveredAt: latestAlert[ALERT_END], + startedAt: latestAlert[ALERT_START], + lastDuration: latestAlert[ALERT_DURATION], + }, + ]; + }) + .sort(([, alertsA], [, alertsB]) => { + // 1. Prioritize rules with the highest number of active alerts + if (alertsA.activeCount > alertsB.activeCount) return -1; + if (alertsA.activeCount < alertsB.activeCount) return 1; + // 2. Prioritize rules with the highest number of alerts in general + if (alertsA.totalCount > alertsB.totalCount) return -1; + if (alertsA.totalCount < alertsB.totalCount) return 1; + // 3. At last prioritize rules with the longest duration + if (alertsA.lastDuration > alertsB.lastDuration) return -1; + if (alertsA.lastDuration < alertsB.lastDuration) return 1; + return 0; + }); +} diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/index.ts b/x-pack/plugins/ml/public/application/explorer/alerts/index.ts new file mode 100644 index 0000000000000..874724e068990 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/index.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export { AnomalyDetectionAlertsOverviewChart } from './chart'; +export { AlertsPanel } from './alerts_panel'; +export { SwimLaneWrapper } from './swim_lane_wrapper'; +export { AnomalyDetectionAlertsStateService } from './anomaly_detection_alerts_state_service'; diff --git a/x-pack/plugins/ml/public/application/explorer/alerts/swim_lane_wrapper.tsx b/x-pack/plugins/ml/public/application/explorer/alerts/swim_lane_wrapper.tsx new file mode 100644 index 0000000000000..4fefe43998f94 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/alerts/swim_lane_wrapper.tsx @@ -0,0 +1,281 @@ +/* + * 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 { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiButtonIcon, + EuiDescriptionList, + EuiFlexGroup, + EuiFlexItem, + EuiInMemoryTable, + EuiNotificationBadge, + EuiPopover, + EuiPopoverTitle, + EuiText, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { + ALERT_DURATION, + ALERT_RULE_NAME, + ALERT_START, + ALERT_STATUS_ACTIVE, + type AlertStatus, +} from '@kbn/rule-data-utils'; +import { pick } from 'lodash'; +import React, { type FC, useCallback, useMemo, useRef } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { i18n } from '@kbn/i18n'; +import { EuiBasicTableColumn } from '@elastic/eui/src/components/basic_table/basic_table'; +import { PanelHeaderItems } from '../../components/collapsible_panel'; +import { AnomalyDetectionAlert } from './anomaly_detection_alerts_state_service'; +import { + ALERT_ANOMALY_DETECTION_JOB_ID, + ALERT_ANOMALY_TIMESTAMP, + alertFieldNameMap, +} from '../../../../common/constants/alerts'; +import { + getAlertEntryFormatter, + getAlertFormatters, +} from '../../../alerting/anomaly_detection_alerts_table/render_cell_value'; +import { useMlKibana } from '../../contexts/kibana'; +import { useAnomalyExplorerContext } from '../anomaly_explorer_context'; +import type { AppStateSelectedCells, SwimlaneData } from '../explorer_utils'; +import { Y_AXIS_LABEL_WIDTH } from '../swimlane_annotation_container'; +import { CELL_HEIGHT } from '../swimlane_container'; +import { statusNameMap } from './const'; + +export interface SwimLaneWrapperProps { + selection?: AppStateSelectedCells | null; + swimlaneContainerWidth?: number; + swimLaneData: SwimlaneData; +} + +/** + * Wrapper component for the swim lane + * that handles the popover for the selected cells. + */ +export const SwimLaneWrapper: FC = ({ + children, + selection, + swimlaneContainerWidth, + swimLaneData, +}) => { + const { + services: { fieldFormats }, + } = useMlKibana(); + + const containerRef = useRef(null); + + const { anomalyDetectionAlertsStateService, anomalyTimelineStateService } = + useAnomalyExplorerContext(); + + const selectedAlerts = useObservable(anomalyDetectionAlertsStateService.selectedAlerts$, []); + + const leftOffset = useMemo(() => { + if (!selection || !swimLaneData) return 0; + const selectedCellIndex = swimLaneData.points.findIndex((v) => v.time === selection.times[0]); + const cellWidth = swimlaneContainerWidth! / swimLaneData.points.length; + + const cellOffset = (selectedCellIndex + 1) * cellWidth; + + return Y_AXIS_LABEL_WIDTH + cellOffset; + }, [selection, swimlaneContainerWidth, swimLaneData]); + + const popoverOpen = !!selection && !!selectedAlerts?.length; + + const alertFormatter = useMemo(() => getAlertEntryFormatter(fieldFormats), [fieldFormats]); + + const viewType = 'table'; + + const closePopover = useCallback(() => { + anomalyTimelineStateService.setSelectedCells(); + }, [anomalyTimelineStateService]); + + return ( +
+
+ + } + isOpen={popoverOpen} + anchorPosition="upCenter" + hasArrow + repositionOnScroll + closePopover={closePopover} + panelPaddingSize="s" + > + + + + + + + + + { + return ( + + {statusNameMap[status as AlertStatus]}{' '} + + {count} + + + ); + })} + /> + + + + + + + + + {viewType === 'table' && !!selectedAlerts?.length ? ( + + ) : ( + (selectedAlerts ?? []).map((alert) => { + const fields = Object.entries( + pick(alert, [ + ALERT_RULE_NAME, + ALERT_ANOMALY_DETECTION_JOB_ID, + ALERT_ANOMALY_TIMESTAMP, + ALERT_START, + ALERT_DURATION, + ]) + ).map(([prop, value]) => { + return alertFormatter(prop, value); + }); + + return ( + + {fields.map(({ title, description }) => { + return ( + + + + ); + })} + + ); + }) + )} + +
+ + {children} +
+ ); +}; + +export interface MiniAlertTableProps { + data: AnomalyDetectionAlert[]; +} + +const ALERT_PER_PAGE = 3; + +export const MiniAlertTable: FC = ({ data }) => { + const { + services: { fieldFormats }, + } = useMlKibana(); + + const alertValueFormatter = useMemo(() => getAlertFormatters(fieldFormats), [fieldFormats]); + + const columns = useMemo>>(() => { + return [ + { + field: ALERT_RULE_NAME, + width: `150px`, + name: alertFieldNameMap[ALERT_RULE_NAME], + sortable: true, + }, + { + field: ALERT_START, + width: `200px`, + name: alertFieldNameMap[ALERT_START], + sortable: true, + render: (value: number) => alertValueFormatter(ALERT_START, value), + }, + { + field: ALERT_DURATION, + width: `110px`, + name: alertFieldNameMap[ALERT_DURATION], + sortable: true, + render: (value: number) => alertValueFormatter(ALERT_DURATION, value), + }, + ]; + }, [alertValueFormatter]); + + return ( + ALERT_PER_PAGE + ? { + compressed: true, + initialPageSize: ALERT_PER_PAGE, + pageSizeOptions: [3, 5, 10], + } + : false + } + /> + ); +}; diff --git a/x-pack/plugins/ml/public/application/explorer/annotation_timeline.tsx b/x-pack/plugins/ml/public/application/explorer/annotation_timeline.tsx new file mode 100644 index 0000000000000..0b95c8c3c0665 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/annotation_timeline.tsx @@ -0,0 +1,184 @@ +/* + * 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 React, { type FC, type PropsWithChildren, useEffect } from 'react'; +import d3 from 'd3'; +import { scaleTime } from 'd3-scale'; +import { type ChartTooltipService, type TooltipData } from '../components/chart_tooltip'; +import { useCurrentThemeVars } from '../contexts/kibana'; + +export interface AnnotationTimelineProps { + label: string; + data: T[]; + domain: { + min: number; + max: number; + }; + getTooltipContent: (item: T, hasMergedAnnotations: boolean) => TooltipData; + tooltipService: ChartTooltipService; + chartWidth: number; +} + +export const Y_AXIS_LABEL_WIDTH = 170; +export const Y_AXIS_LABEL_PADDING = 8; +const ANNOTATION_CONTAINER_HEIGHT = 12; +const ANNOTATION_MIN_WIDTH = 8; + +/** + * Reusable component for rendering annotation-like items on a timeline. + */ +export const AnnotationTimeline = ({ + data, + domain, + label, + tooltipService, + chartWidth, + getTooltipContent, +}: PropsWithChildren>): ReturnType => { + const canvasRef = React.useRef(null); + const { euiTheme } = useCurrentThemeVars(); + + useEffect( + function renderChart() { + if (!(canvasRef.current !== null && Array.isArray(data))) return; + + const chartElement = d3.select(canvasRef.current); + chartElement.selectAll('*').remove(); + + const dimensions = canvasRef.current.getBoundingClientRect(); + + const startingXPos = Y_AXIS_LABEL_WIDTH; + const endingXPos = dimensions.width; + + const svg = chartElement + .append('svg') + .attr('width', '100%') + .attr('height', ANNOTATION_CONTAINER_HEIGHT); + + const xScale = scaleTime().domain([domain.min, domain.max]).range([startingXPos, endingXPos]); + + // Add Annotation y axis label + svg + .append('text') + .attr('text-anchor', 'end') + .attr('class', 'swimlaneAnnotationLabel') + .text(label) + .attr('x', Y_AXIS_LABEL_WIDTH - Y_AXIS_LABEL_PADDING) + .attr('y', ANNOTATION_CONTAINER_HEIGHT / 2) + .attr('dominant-baseline', 'middle') + .style('fill', euiTheme.euiTextSubduedColor) + .style('font-size', euiTheme.euiFontSizeXS); + + // Add border + svg + .append('rect') + .attr('x', startingXPos) + .attr('y', 0) + .attr('height', ANNOTATION_CONTAINER_HEIGHT) + .attr('width', endingXPos - startingXPos) + .style('stroke', euiTheme.euiBorderColor) + .style('fill', 'none') + .style('stroke-width', 1); + + // Merging overlapping annotations into bigger blocks + let mergedAnnotations: Array<{ start: number; end: number; annotations: T[] }> = []; + const sortedAnnotationsData = [...data].sort((a, b) => a.timestamp - b.timestamp); + + if (sortedAnnotationsData.length > 0) { + let lastEndTime = + sortedAnnotationsData[0].end_timestamp ?? sortedAnnotationsData[0].timestamp; + + mergedAnnotations = [ + { + start: sortedAnnotationsData[0].timestamp, + end: lastEndTime, + annotations: [sortedAnnotationsData[0]], + }, + ]; + + for (let i = 1; i < sortedAnnotationsData.length; i++) { + if (sortedAnnotationsData[i].timestamp < lastEndTime) { + const itemToMerge = mergedAnnotations.pop(); + if (itemToMerge) { + const newMergedItem = { + ...itemToMerge, + end: lastEndTime, + annotations: [...itemToMerge.annotations, sortedAnnotationsData[i]], + }; + mergedAnnotations.push(newMergedItem); + } + } else { + lastEndTime = + sortedAnnotationsData[i].end_timestamp ?? sortedAnnotationsData[i].timestamp; + + mergedAnnotations.push({ + start: sortedAnnotationsData[i].timestamp, + end: lastEndTime, + annotations: [sortedAnnotationsData[i]], + }); + } + } + } + + // Add annotation marker + mergedAnnotations.forEach((mergedAnnotation) => { + const annotationWidth = Math.max( + mergedAnnotation.end + ? (xScale(Math.min(mergedAnnotation.end, domain.max)) as number) - + Math.max(xScale(mergedAnnotation.start) as number, startingXPos) + : 0, + ANNOTATION_MIN_WIDTH + ); + + const xPos = + mergedAnnotation.start >= domain.min + ? (xScale(mergedAnnotation.start) as number) + : startingXPos; + svg + .append('rect') + .classed('mlAnnotationRect', true) + // If annotation is at the end, prevent overflow by shifting it back + .attr('x', xPos + annotationWidth >= endingXPos ? endingXPos - annotationWidth : xPos) + .attr('y', 0) + .attr('height', ANNOTATION_CONTAINER_HEIGHT) + .attr('width', annotationWidth) + .on('mouseover', function (this: HTMLElement) { + let tooltipData: TooltipData = []; + if (Array.isArray(mergedAnnotation.annotations)) { + const hasMergedAnnotations = mergedAnnotation.annotations.length > 1; + if (hasMergedAnnotations) { + // @ts-ignore skipping header so it doesn't have other params + tooltipData.push({ skipHeader: true }); + } + tooltipData = [ + ...tooltipData, + ...mergedAnnotation.annotations + .map((item) => getTooltipContent(item, hasMergedAnnotations)) + .flat(), + ]; + } + + tooltipService.show(tooltipData, this); + }) + .on('mouseout', () => tooltipService.hide()); + }); + }, + [ + chartWidth, + domain, + data, + tooltipService, + label, + euiTheme.euiTextSubduedColor, + euiTheme.euiFontSizeXS, + euiTheme.euiBorderColor, + getTooltipContent, + ] + ); + + return
; +}; diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx index 2217c540ccf3b..53b9edc97cb6b 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx @@ -16,6 +16,7 @@ import { useExplorerUrlState } from './hooks/use_explorer_url_state'; import { AnomalyChartsStateService } from './anomaly_charts_state_service'; import { AnomalyExplorerChartsService } from '../services/anomaly_explorer_charts_service'; import { useTableSeverity } from '../components/controls/select_severity'; +import { AnomalyDetectionAlertsStateService } from './alerts'; export type AnomalyExplorerContextValue = | { @@ -24,6 +25,7 @@ export type AnomalyExplorerContextValue = anomalyTimelineService: AnomalyTimelineService; anomalyTimelineStateService: AnomalyTimelineStateService; chartsStateService: AnomalyChartsStateService; + anomalyDetectionAlertsStateService: AnomalyDetectionAlertsStateService; } | undefined; @@ -59,6 +61,7 @@ export const AnomalyExplorerContextProvider: FC = ({ children }) => { services: { mlServices: { mlApiServices }, uiSettings, + data, }, } = useMlKibana(); @@ -102,12 +105,19 @@ export const AnomalyExplorerContextProvider: FC = ({ children }) => { tableSeverityState ); + const anomalyDetectionAlertsStateService = new AnomalyDetectionAlertsStateService( + anomalyTimelineStateService, + data, + timefilter + ); + setAnomalyExplorerContextValue({ anomalyExplorerChartsService, anomalyExplorerCommonStateService, anomalyTimelineService, anomalyTimelineStateService, chartsStateService, + anomalyDetectionAlertsStateService, }); return () => { @@ -116,6 +126,7 @@ export const AnomalyExplorerContextProvider: FC = ({ children }) => { anomalyExplorerCommonStateService.destroy(); anomalyTimelineStateService.destroy(); chartsStateService.destroy(); + anomalyDetectionAlertsStateService.destroy(); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx index 4e0416a63b34a..9864e7b3d3305 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx @@ -61,6 +61,7 @@ import { AnomalyTimelineService } from '../services/anomaly_timeline_service'; import { useAnomalyExplorerContext } from './anomaly_explorer_context'; import { useTimeBuckets } from '../components/custom_hooks/use_time_buckets'; import { getTimeBoundsFromSelection } from './hooks/use_selected_cells'; +import { SwimLaneWrapper } from './alerts'; function mapSwimlaneOptionsToEuiOptions(options: string[]) { return options.map((option) => ({ @@ -506,6 +507,7 @@ export const AnomalyTimeline: FC = React.memo( + {annotationXDomain && Array.isArray(annotations) && annotations.length > 0 ? ( <> @@ -522,29 +524,35 @@ export const AnomalyTimeline: FC = React.memo( ) : null} - -
- -
- - } - showTimeline={false} - showLegend={false} - yAxisWidth={Y_AXIS_LABEL_WIDTH} - chartsService={chartsService} - /> + swimlaneContainerWidth={swimlaneContainerWidth} + swimLaneData={overallSwimlaneData as OverallSwimlaneData} + > + +
+ +
+ + } + showTimeline={false} + showLegend={false} + yAxisWidth={Y_AXIS_LABEL_WIDTH} + chartsService={chartsService} + /> + {viewBySwimlaneOptions.length > 0 && ( diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts index 27a3836fda471..573a0e151ae43 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts @@ -49,6 +49,12 @@ interface SwimLanePagination { viewByPerPage: number; } +export interface TimeDomain { + min: number; + max: number; + minInterval: number; +} + /** * Service for managing anomaly timeline state. */ @@ -87,6 +93,18 @@ export class AnomalyTimelineStateService extends StateService { private _timeBounds$: Observable; private _refreshSubject$: Observable; + /** Time domain of the currently active swim lane */ + public readonly timeDomain$: Observable = this._overallSwimLaneData$.pipe( + map((data) => { + if (!data) return null; + return { + min: data.earliest * 1000, + max: data.latest * 1000, + minInterval: data.interval * 1000, + }; + }) + ); + constructor( private anomalyExplorerUrlStateService: AnomalyExplorerUrlStateService, private anomalyExplorerCommonStateService: AnomalyExplorerCommonStateService, @@ -646,6 +664,42 @@ export class AnomalyTimelineStateService extends StateService { return this._viewBySwimLaneOptions$.asObservable(); } + /** + * Currently selected jobs on the swim lane + */ + public getSwimLaneJobs$(): Observable { + return combineLatest([ + this.anomalyExplorerCommonStateService.getSelectedJobs$(), + this.getViewBySwimlaneFieldName$(), + this._viewBySwimLaneData$, + this._selectedCells$, + ]).pipe( + map(([selectedJobs, swimLaneFieldName, viewBySwimLaneData, selectedCells]) => { + // If there are selected lanes on the view by swim lane, use those to filter the jobs. + if ( + selectedCells?.type === SWIMLANE_TYPE.VIEW_BY && + selectedCells?.viewByFieldName === VIEW_BY_JOB_LABEL + ) { + return selectedJobs.filter((job) => { + return selectedCells.lanes.includes(job.id); + }); + } + + if ( + selectedCells?.type === SWIMLANE_TYPE.OVERALL && + selectedCells?.viewByFieldName === VIEW_BY_JOB_LABEL && + viewBySwimLaneData + ) { + return selectedJobs.filter((job) => { + return viewBySwimLaneData.laneLabels.includes(job.id); + }); + } + + return selectedJobs; + }) + ); + } + public getViewBySwimLaneOptions(): string[] { return this._viewBySwimLaneOptions$.getValue(); } diff --git a/x-pack/plugins/ml/public/application/explorer/explorer.tsx b/x-pack/plugins/ml/public/application/explorer/explorer.tsx index 28a5164719563..7d04cfee36c66 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer.tsx @@ -78,6 +78,7 @@ import { useToastNotificationService } from '../services/toast_notification_serv import { useMlKibana, useMlLocator } from '../contexts/kibana'; import { useAnomalyExplorerContext } from './anomaly_explorer_context'; import { ML_ANOMALY_EXPLORER_PANELS } from '../../../common/types/storage'; +import { AlertsPanel } from './alerts'; interface ExplorerPageProps { jobSelectorProps: JobSelectorProps; @@ -263,8 +264,12 @@ export const Explorer: FC = ({ }, [anomalyExplorerPanelState]); const { displayWarningToast, displayDangerToast } = useToastNotificationService(); - const { anomalyTimelineStateService, anomalyExplorerCommonStateService, chartsStateService } = - useAnomalyExplorerContext(); + const { + anomalyTimelineStateService, + anomalyExplorerCommonStateService, + chartsStateService, + anomalyDetectionAlertsStateService, + } = useAnomalyExplorerContext(); const htmlIdGen = useMemo(() => htmlIdGenerator(), []); @@ -283,6 +288,8 @@ export const Explorer: FC = ({ anomalyExplorerCommonStateService.getSelectedJobs() ); + const alertsData = useObservable(anomalyDetectionAlertsStateService.anomalyDetectionAlerts$, []); + const applyFilter = useCallback( (fieldName: string, fieldValue: string, action: FilterAction) => { const { filterActive, queryString } = filterSettings; @@ -487,6 +494,8 @@ export const Explorer: FC = ({ + {alertsData.length > 0 ? : null} + {annotationsError !== undefined && ( <> diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 4b69ce479c58e..721f0958ba5fe 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -68,7 +68,7 @@ declare global { */ const RESIZE_THROTTLE_TIME_MS = 500; const BORDER_WIDTH = 1; -const CELL_HEIGHT = 30; +export const CELL_HEIGHT = 30; const LEGEND_HEIGHT = 34; const X_AXIS_HEIGHT = 24; diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index c0356b0f40192..90d107882f7bb 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -42,13 +42,14 @@ import { import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/public'; import type { PluginSetupContract as AlertingSetup } from '@kbn/alerting-plugin/public'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; -import type { FieldFormatsSetup, FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import type { FieldFormatsSetup } from '@kbn/field-formats-plugin/public'; import type { DashboardSetup, DashboardStart } from '@kbn/dashboard-plugin/public'; import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { CasesUiSetup, CasesUiStart } from '@kbn/cases-plugin/public'; import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; +import type { FieldFormatsRegistry } from '@kbn/field-formats-plugin/common'; import { getMlSharedServices, MlSharedServices, @@ -78,7 +79,7 @@ export interface MlStartDependencies { dataViewEditor: DataViewEditorStart; dataVisualizer: DataVisualizerPluginStart; embeddable: EmbeddableStart; - fieldFormats: FieldFormatsStart; + fieldFormats: FieldFormatsRegistry; lens: LensPublicStart; licensing: LicensingPluginStart; maps?: MapsStartApi; @@ -246,7 +247,11 @@ export class MlPlugin implements Plugin { mlCapabilities.canUseMlAlerts && mlCapabilities.canGetJobs ) { - registerMlAlerts(pluginsSetup.triggersActionsUi, pluginsSetup.alerting); + registerMlAlerts( + pluginsSetup.triggersActionsUi, + core.getStartServices, + pluginsSetup.alerting + ); } if (pluginsSetup.maps) { diff --git a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts index dc85428a63386..2a52e1d1337e2 100644 --- a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts +++ b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts @@ -928,7 +928,7 @@ export function alertingServiceProvider( spaceId ); - const message = i18n.translate( + const contextMessage = i18n.translate( 'xpack.ml.alertTypes.anomalyDetectionAlertingRule.recoveredMessage', { defaultMessage: @@ -940,18 +940,26 @@ export function alertingServiceProvider( } ); + const payloadMessage = i18n.translate( + 'xpack.ml.alertTypes.anomalyDetectionAlertingRule.recoveredReason', + { + defaultMessage: + 'No anomalies have been found in the concecutive bucket after the alert was triggered.', + } + ); + return { name: '', isHealthy: true, payload: { [ALERT_URL]: url, - [ALERT_REASON]: message, + [ALERT_REASON]: payloadMessage, job_id: queryParams.jobIds[0], }, context: { anomalyExplorerUrl: url, jobIds: queryParams.jobIds, - message, + message: contextMessage, } as AnomalyDetectionAlertContext, }; } diff --git a/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts b/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts index 8e0abc16821fe..ad536027a6619 100644 --- a/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts +++ b/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts @@ -6,20 +6,28 @@ */ import { i18n } from '@kbn/i18n'; -import { KibanaRequest, DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; +import { DEFAULT_APP_CATEGORIES, KibanaRequest } from '@kbn/core/server'; import type { ActionGroup, AlertInstanceContext, AlertInstanceState, + RecoveredActionGroupId, RuleTypeParams, RuleTypeState, - RecoveredActionGroupId, } from '@kbn/alerting-plugin/common'; import { IRuleTypeAlerts, RuleExecutorOptions } from '@kbn/alerting-plugin/server'; -import { ALERT_NAMESPACE, ALERT_REASON, ALERT_URL } from '@kbn/rule-data-utils'; +import { ALERT_REASON, ALERT_URL } from '@kbn/rule-data-utils'; import { MlAnomalyDetectionAlert } from '@kbn/alerts-as-data-utils'; import { ES_FIELD_TYPES } from '@kbn/field-types'; -import { ML_ALERT_TYPES } from '../../../common/constants/alerts'; +import { + ALERT_ANOMALY_DETECTION_JOB_ID, + ALERT_ANOMALY_IS_INTERIM, + ALERT_ANOMALY_SCORE, + ALERT_ANOMALY_TIMESTAMP, + ALERT_TOP_INFLUENCERS, + ALERT_TOP_RECORDS, + ML_ALERT_TYPES, +} from '../../../common/constants/alerts'; import { PLUGIN_ID } from '../../../common/constants/app'; import { MINIMUM_FULL_LICENSE } from '../../../common/license'; import { @@ -79,17 +87,6 @@ export type AnomalyScoreMatchGroupId = typeof ANOMALY_SCORE_MATCH_GROUP_ID; export const ANOMALY_DETECTION_AAD_INDEX_NAME = 'ml.anomaly-detection'; -const ML_ALERT_NAMESPACE = ALERT_NAMESPACE; - -export const ALERT_ANOMALY_DETECTION_JOB_ID = `${ML_ALERT_NAMESPACE}.job_id` as const; - -export const ALERT_ANOMALY_SCORE = `${ML_ALERT_NAMESPACE}.anomaly_score` as const; -export const ALERT_ANOMALY_IS_INTERIM = `${ML_ALERT_NAMESPACE}.is_interim` as const; -export const ALERT_ANOMALY_TIMESTAMP = `${ML_ALERT_NAMESPACE}.anomaly_timestamp` as const; - -export const ALERT_TOP_RECORDS = `${ML_ALERT_NAMESPACE}.top_records` as const; -export const ALERT_TOP_INFLUENCERS = `${ML_ALERT_NAMESPACE}.top_influencers` as const; - export const ANOMALY_DETECTION_AAD_CONFIG: IRuleTypeAlerts = { context: ANOMALY_DETECTION_AAD_INDEX_NAME, mappings: { diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index 4a0077770808a..cca832eee0423 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -108,5 +108,7 @@ "@kbn/data-view-editor-plugin", "@kbn/rule-data-utils", "@kbn/alerts-as-data-utils", + "@kbn/rule-registry-plugin", + "@kbn/securitysolution-ecs", ], } From ce0114b3d6a5f0df43b4680620a39db33d234640 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Fri, 10 Nov 2023 13:57:59 +0100 Subject: [PATCH 32/51] [ML] AIOps: Log Rate Analysis V2 REST API, replaces references to `term` with `item`. (#170274) This PR uses [conditional types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html) to allow the handling of both multiple API versions within one route handler. The more tricky bit turned out to be not the updated request body, but the response since it is an NDJSON stream where some messages were updated. In this case also the functions that create these messages were updated with conditional types to be able to create a message that fits the definition of the API version. The API integration tests originally had these message identifiers in the `expected` section of their `testData`. I changed that to use helper functions that retrieve the expected messages from the stream according to the expected version. All API integration tests are run on both versions. The functional tests are run only on the newer version since the UI is expected to work with version `2` only. --- x-pack/packages/ml/agg_utils/src/types.ts | 29 +- x-pack/plugins/aiops/common/api/index.ts | 17 - .../common/api/log_rate_analysis/actions.ts | 128 ++++-- .../common/api/log_rate_analysis/index.ts | 24 -- .../common/api/log_rate_analysis/schema.ts | 44 +-- .../common/api/log_rate_analysis/schema_v1.ts | 41 ++ .../common/api/log_rate_analysis/schema_v2.ts | 66 ++++ .../aiops/common/api/stream_reducer.test.ts | 63 +-- .../aiops/common/api/stream_reducer.ts | 34 +- .../category_table/category_table.tsx | 2 +- .../log_rate_analysis_results.tsx | 43 +- .../mini_histogram/mini_histogram.tsx | 2 +- .../routes/log_rate_analysis/define_route.ts | 19 +- .../queries/fetch_categories.ts | 2 +- .../queries/fetch_category_counts.ts | 2 +- .../queries/fetch_index_info.test.ts | 2 +- .../queries/fetch_index_info.ts | 2 +- .../queries/fetch_significant_categories.ts | 2 +- .../fetch_significant_term_p_values.ts | 2 +- .../fetch_terms_2_categories_counts.ts | 2 +- .../log_rate_analysis/queries/get_filters.ts | 2 +- .../queries/get_histogram_query.ts | 2 +- .../queries/get_query_with_params.ts | 4 +- .../queries/get_request_base.ts | 2 +- .../route_handler_factory.ts | 165 +++++--- .../aiops/log_rate_analysis_full_analysis.ts | 338 ++++++++-------- .../aiops/log_rate_analysis_groups_only.ts | 367 ++++++++++-------- .../apis/aiops/log_rate_analysis_no_index.ts | 71 ++-- .../api_integration/apis/aiops/test_data.ts | 44 +-- .../apis/aiops/test_helpers.ts | 38 ++ .../test/api_integration/apis/aiops/types.ts | 14 +- .../apis/aiops/permissions.ts | 75 ++-- 32 files changed, 963 insertions(+), 685 deletions(-) delete mode 100644 x-pack/plugins/aiops/common/api/log_rate_analysis/index.ts create mode 100644 x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v1.ts create mode 100644 x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v2.ts create mode 100644 x-pack/test/api_integration/apis/aiops/test_helpers.ts diff --git a/x-pack/packages/ml/agg_utils/src/types.ts b/x-pack/packages/ml/agg_utils/src/types.ts index 026daf861058f..d8e76239d0e09 100644 --- a/x-pack/packages/ml/agg_utils/src/types.ts +++ b/x-pack/packages/ml/agg_utils/src/types.ts @@ -149,17 +149,10 @@ export interface SignificantTerm extends FieldValuePair { unique?: boolean; } -/** - * Represents a data item in a significant term histogram. - * @interface - */ -export interface SignificantTermHistogramItem { +interface SignificantTermHistogramItemBase { /** The document count for this item in the overall context. */ doc_count_overall: number; - /** The document count for this item in the significant term context. */ - doc_count_significant_term: number; - /** The numeric key associated with this item. */ key: number; @@ -167,6 +160,26 @@ export interface SignificantTermHistogramItem { key_as_string: string; } +/** + * @deprecated since version 2 of internal log rate analysis REST API endpoint + */ +interface SignificantTermHistogramItemV1 extends SignificantTermHistogramItemBase { + /** The document count for this item in the significant term context. */ + doc_count_significant_term: number; +} + +interface SignificantTermHistogramItemV2 extends SignificantTermHistogramItemBase { + /** The document count for this histogram item in the significant item context. */ + doc_count_significant_item: number; +} + +/** + * Represents a data item in a significant term histogram. + */ +export type SignificantTermHistogramItem = + | SignificantTermHistogramItemV1 + | SignificantTermHistogramItemV2; + /** * Represents histogram data for a field/value pair. * @interface diff --git a/x-pack/plugins/aiops/common/api/index.ts b/x-pack/plugins/aiops/common/api/index.ts index 42f1cfa512900..cd1852299f265 100644 --- a/x-pack/plugins/aiops/common/api/index.ts +++ b/x-pack/plugins/aiops/common/api/index.ts @@ -5,14 +5,6 @@ * 2.0. */ -import type { HttpSetup } from '@kbn/core/public'; - -import type { - AiopsLogRateAnalysisSchema, - AiopsLogRateAnalysisApiAction, -} from './log_rate_analysis'; -import { streamReducer } from './stream_reducer'; - export const AIOPS_API_ENDPOINT = { LOG_RATE_ANALYSIS: '/internal/aiops/log_rate_analysis', CATEGORIZATION_FIELD_VALIDATION: '/internal/aiops/categorization_field_validation', @@ -20,12 +12,3 @@ export const AIOPS_API_ENDPOINT = { type AiopsApiEndpointKeys = keyof typeof AIOPS_API_ENDPOINT; export type AiopsApiEndpoint = typeof AIOPS_API_ENDPOINT[AiopsApiEndpointKeys]; - -export interface AiopsApiLogRateAnalysis { - http: HttpSetup; - endpoint: AiopsApiEndpoint; - apiVersion: string; - reducer: typeof streamReducer; - body: AiopsLogRateAnalysisSchema; - actions: AiopsLogRateAnalysisApiAction; -} diff --git a/x-pack/plugins/aiops/common/api/log_rate_analysis/actions.ts b/x-pack/plugins/aiops/common/api/log_rate_analysis/actions.ts index b0ab5ae260955..4075ddffd27f1 100644 --- a/x-pack/plugins/aiops/common/api/log_rate_analysis/actions.ts +++ b/x-pack/plugins/aiops/common/api/log_rate_analysis/actions.ts @@ -12,10 +12,24 @@ import type { SignificantTermGroupHistogram, } from '@kbn/ml-agg-utils'; +import type { AiopsLogRateAnalysisApiVersion as ApiVersion } from './schema'; + export const API_ACTION_NAME = { + /** @since API v2 */ + ADD_SIGNIFICANT_ITEMS: 'add_significant_items', + /** @since API v2 */ + ADD_SIGNIFICANT_ITEMS_HISTOGRAM: 'add_significant_items_histogram', + /** @since API v2 */ + ADD_SIGNIFICANT_ITEMS_GROUP: 'add_significant_items_group', + /** @since API v2 */ + ADD_SIGNIFICANT_ITEMS_GROUP_HISTOGRAM: 'add_significant_items_group_histogram', + /** @deprecated since API v2 */ ADD_SIGNIFICANT_TERMS: 'add_significant_terms', + /** @deprecated since API v2 */ ADD_SIGNIFICANT_TERMS_HISTOGRAM: 'add_significant_terms_histogram', + /** @deprecated since API v2 */ ADD_SIGNIFICANT_TERMS_GROUP: 'add_significant_terms_group', + /** @deprecated since API v2 */ ADD_SIGNIFICANT_TERMS_GROUP_HISTOGRAM: 'add_significant_terms_group_histogram', ADD_ERROR: 'add_error', PING: 'ping', @@ -26,60 +40,108 @@ export const API_ACTION_NAME = { } as const; export type ApiActionName = typeof API_ACTION_NAME[keyof typeof API_ACTION_NAME]; -interface ApiActionAddSignificantTerms { - type: typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS; +interface ApiActionAddSignificantTerms { + type: T extends '1' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS + : T extends '2' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS + : never; payload: SignificantTerm[]; } -export function addSignificantTermsAction( - payload: ApiActionAddSignificantTerms['payload'] -): ApiActionAddSignificantTerms { +export function addSignificantTermsAction( + payload: ApiActionAddSignificantTerms['payload'], + version: T +): ApiActionAddSignificantTerms { + if (version === '1') { + return { + type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS, + payload, + } as ApiActionAddSignificantTerms; + } + return { - type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS, + type: API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS, payload, - }; + } as ApiActionAddSignificantTerms; } -interface ApiActionAddSignificantTermsHistogram { - type: typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_HISTOGRAM; +interface ApiActionAddSignificantTermsHistogram { + type: T extends '1' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_HISTOGRAM + : T extends '2' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_HISTOGRAM + : never; payload: SignificantTermHistogram[]; } -export function addSignificantTermsHistogramAction( - payload: ApiActionAddSignificantTermsHistogram['payload'] -): ApiActionAddSignificantTermsHistogram { +export function addSignificantTermsHistogramAction( + payload: ApiActionAddSignificantTermsHistogram['payload'], + version: T +): ApiActionAddSignificantTermsHistogram { + if (version === '1') { + return { + type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_HISTOGRAM, + payload, + } as ApiActionAddSignificantTermsHistogram; + } + return { - type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_HISTOGRAM, + type: API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_HISTOGRAM, payload, - }; + } as ApiActionAddSignificantTermsHistogram; } -interface ApiActionAddSignificantTermsGroup { - type: typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP; +interface ApiActionAddSignificantTermsGroup { + type: T extends '1' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP + : T extends '2' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_GROUP + : never; payload: SignificantTermGroup[]; } -export function addSignificantTermsGroupAction( - payload: ApiActionAddSignificantTermsGroup['payload'] -) { +export function addSignificantTermsGroupAction( + payload: ApiActionAddSignificantTermsGroup['payload'], + version: T +): ApiActionAddSignificantTermsGroup { + if (version === '1') { + return { + type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP, + payload, + } as ApiActionAddSignificantTermsGroup; + } + return { - type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP, + type: API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_GROUP, payload, - }; + } as ApiActionAddSignificantTermsGroup; } -interface ApiActionAddSignificantTermsGroupHistogram { - type: typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP_HISTOGRAM; +interface ApiActionAddSignificantTermsGroupHistogram { + type: T extends '1' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP_HISTOGRAM + : T extends '2' + ? typeof API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_GROUP_HISTOGRAM + : never; payload: SignificantTermGroupHistogram[]; } -export function addSignificantTermsGroupHistogramAction( - payload: ApiActionAddSignificantTermsGroupHistogram['payload'] -): ApiActionAddSignificantTermsGroupHistogram { +export function addSignificantTermsGroupHistogramAction( + payload: ApiActionAddSignificantTermsGroupHistogram['payload'], + version: T +): ApiActionAddSignificantTermsGroupHistogram { + if (version === '1') { + return { + type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP_HISTOGRAM, + payload, + } as ApiActionAddSignificantTermsGroupHistogram; + } + return { - type: API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP_HISTOGRAM, + type: API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_GROUP_HISTOGRAM, payload, - }; + } as ApiActionAddSignificantTermsGroupHistogram; } interface ApiActionAddError { @@ -148,11 +210,11 @@ export function updateLoadingStateAction( }; } -export type AiopsLogRateAnalysisApiAction = - | ApiActionAddSignificantTerms - | ApiActionAddSignificantTermsGroup - | ApiActionAddSignificantTermsHistogram - | ApiActionAddSignificantTermsGroupHistogram +export type AiopsLogRateAnalysisApiAction = + | ApiActionAddSignificantTerms + | ApiActionAddSignificantTermsGroup + | ApiActionAddSignificantTermsHistogram + | ApiActionAddSignificantTermsGroupHistogram | ApiActionAddError | ApiActionPing | ApiActionResetAll diff --git a/x-pack/plugins/aiops/common/api/log_rate_analysis/index.ts b/x-pack/plugins/aiops/common/api/log_rate_analysis/index.ts deleted file mode 100644 index 4687bb8872840..0000000000000 --- a/x-pack/plugins/aiops/common/api/log_rate_analysis/index.ts +++ /dev/null @@ -1,24 +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. - */ - -export { - addSignificantTermsAction, - addSignificantTermsGroupAction, - addSignificantTermsGroupHistogramAction, - addSignificantTermsHistogramAction, - addErrorAction, - pingAction, - resetAllAction, - resetErrorsAction, - resetGroupsAction, - updateLoadingStateAction, - API_ACTION_NAME, -} from './actions'; -export type { AiopsLogRateAnalysisApiAction } from './actions'; - -export { aiopsLogRateAnalysisSchema } from './schema'; -export type { AiopsLogRateAnalysisSchema } from './schema'; diff --git a/x-pack/plugins/aiops/common/api/log_rate_analysis/schema.ts b/x-pack/plugins/aiops/common/api/log_rate_analysis/schema.ts index 499b61c5ba5ca..a7fbcfd303b55 100644 --- a/x-pack/plugins/aiops/common/api/log_rate_analysis/schema.ts +++ b/x-pack/plugins/aiops/common/api/log_rate_analysis/schema.ts @@ -5,37 +5,17 @@ * 2.0. */ -import { schema, TypeOf } from '@kbn/config-schema'; +import type { AiopsLogRateAnalysisSchemaV1 } from './schema_v1'; +import type { AiopsLogRateAnalysisSchemaV2 } from './schema_v2'; -export const aiopsLogRateAnalysisSchema = schema.object({ - start: schema.number(), - end: schema.number(), - searchQuery: schema.string(), - timeFieldName: schema.string(), - includeFrozen: schema.maybe(schema.boolean()), - grouping: schema.maybe(schema.boolean()), - /** Analysis selection time ranges */ - baselineMin: schema.number(), - baselineMax: schema.number(), - deviationMin: schema.number(), - deviationMax: schema.number(), - /** The index to query for log rate analysis */ - index: schema.string(), - /** Settings to override headers derived compression and flush fix */ - compressResponse: schema.maybe(schema.boolean()), - flushFix: schema.maybe(schema.boolean()), - /** Overrides to skip steps of the analysis with existing data */ - overrides: schema.maybe( - schema.object({ - loaded: schema.maybe(schema.number()), - remainingFieldCandidates: schema.maybe(schema.arrayOf(schema.string())), - // TODO Improve schema - significantTerms: schema.maybe(schema.arrayOf(schema.any())), - regroupOnly: schema.maybe(schema.boolean()), - }) - ), - /** Probability used for the random sampler aggregations */ - sampleProbability: schema.maybe(schema.number()), -}); +export type AiopsLogRateAnalysisApiVersion = '1' | '2'; -export type AiopsLogRateAnalysisSchema = TypeOf; +const LATEST_API_VERSION: AiopsLogRateAnalysisApiVersion = '2'; + +export type AiopsLogRateAnalysisSchema< + T extends AiopsLogRateAnalysisApiVersion = typeof LATEST_API_VERSION +> = T extends '1' + ? AiopsLogRateAnalysisSchemaV1 + : T extends '2' + ? AiopsLogRateAnalysisSchemaV2 + : never; diff --git a/x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v1.ts b/x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v1.ts new file mode 100644 index 0000000000000..e994ecc33dafe --- /dev/null +++ b/x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v1.ts @@ -0,0 +1,41 @@ +/* + * 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 { schema, TypeOf } from '@kbn/config-schema'; + +export const aiopsLogRateAnalysisSchemaV1 = schema.object({ + start: schema.number(), + end: schema.number(), + searchQuery: schema.string(), + timeFieldName: schema.string(), + includeFrozen: schema.maybe(schema.boolean()), + grouping: schema.maybe(schema.boolean()), + /** Analysis selection time ranges */ + baselineMin: schema.number(), + baselineMax: schema.number(), + deviationMin: schema.number(), + deviationMax: schema.number(), + /** The index to query for log rate analysis */ + index: schema.string(), + /** Settings to override headers derived compression and flush fix */ + compressResponse: schema.maybe(schema.boolean()), + flushFix: schema.maybe(schema.boolean()), + /** Overrides to skip steps of the analysis with existing data */ + overrides: schema.maybe( + schema.object({ + loaded: schema.maybe(schema.number()), + remainingFieldCandidates: schema.maybe(schema.arrayOf(schema.string())), + // TODO Improve schema + significantTerms: schema.maybe(schema.arrayOf(schema.any())), + regroupOnly: schema.maybe(schema.boolean()), + }) + ), + /** Probability used for the random sampler aggregations */ + sampleProbability: schema.maybe(schema.number()), +}); + +export type AiopsLogRateAnalysisSchemaV1 = TypeOf; diff --git a/x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v2.ts b/x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v2.ts new file mode 100644 index 0000000000000..2438c04971e91 --- /dev/null +++ b/x-pack/plugins/aiops/common/api/log_rate_analysis/schema_v2.ts @@ -0,0 +1,66 @@ +/* + * 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 { schema, TypeOf } from '@kbn/config-schema'; + +const significantItem = schema.object({ + key: schema.string(), + type: schema.oneOf([schema.literal('keyword'), schema.literal('log_pattern')]), + fieldName: schema.string(), + fieldValue: schema.oneOf([schema.string(), schema.number()]), + doc_count: schema.number(), + bg_count: schema.number(), + total_doc_count: schema.number(), + total_bg_count: schema.number(), + score: schema.number(), + pValue: schema.nullable(schema.number()), + normalizedScore: schema.number(), + histogram: schema.maybe( + schema.arrayOf( + schema.object({ + doc_count_overall: schema.number(), + doc_count_significant_item: schema.number(), + key: schema.number(), + key_as_string: schema.string(), + }) + ) + ), + unique: schema.maybe(schema.boolean()), +}); + +export const aiopsLogRateAnalysisSchemaV2 = schema.object({ + start: schema.number(), + end: schema.number(), + searchQuery: schema.string(), + timeFieldName: schema.string(), + includeFrozen: schema.maybe(schema.boolean()), + grouping: schema.maybe(schema.boolean()), + /** Analysis selection time ranges */ + baselineMin: schema.number(), + baselineMax: schema.number(), + deviationMin: schema.number(), + deviationMax: schema.number(), + /** The index to query for log rate analysis */ + index: schema.string(), + /** Settings to override headers derived compression and flush fix */ + compressResponse: schema.maybe(schema.boolean()), + flushFix: schema.maybe(schema.boolean()), + /** Overrides to skip steps of the analysis with existing data */ + overrides: schema.maybe( + schema.object({ + loaded: schema.maybe(schema.number()), + remainingFieldCandidates: schema.maybe(schema.arrayOf(schema.string())), + significantItems: schema.maybe(schema.arrayOf(significantItem)), + regroupOnly: schema.maybe(schema.boolean()), + }) + ), + /** Probability used for the random sampler aggregations */ + sampleProbability: schema.maybe(schema.number()), +}); + +export type AiopsLogRateAnalysisSchemaV2 = TypeOf; +export type AiopsLogRateAnalysisSchemaSignificantItem = TypeOf; diff --git a/x-pack/plugins/aiops/common/api/stream_reducer.test.ts b/x-pack/plugins/aiops/common/api/stream_reducer.test.ts index d779ccab356b3..7802d61e1781e 100644 --- a/x-pack/plugins/aiops/common/api/stream_reducer.test.ts +++ b/x-pack/plugins/aiops/common/api/stream_reducer.test.ts @@ -14,7 +14,7 @@ import { resetAllAction, resetGroupsAction, updateLoadingStateAction, -} from './log_rate_analysis'; +} from './log_rate_analysis/actions'; import { initialState, streamReducer } from './stream_reducer'; describe('streamReducer', () => { @@ -28,56 +28,59 @@ describe('streamReducer', () => { ccsWarning: true, loaded: 50, loadingState: 'Loaded 50%', - significantTerms: [], - significantTermsGroups: [], + significantItems: [], + significantItemsGroups: [], errors: [], }); }); - it('adds significant term, then resets all state again', () => { + it('adds significant item, then resets all state again', () => { const state1 = streamReducer( initialState, - addSignificantTermsAction([ - { - key: 'the-field-name:the-field-value', - type: 'keyword', - fieldName: 'the-field-name', - fieldValue: 'the-field-value', - doc_count: 10, - bg_count: 100, - total_doc_count: 1000, - total_bg_count: 10000, - score: 0.1, - pValue: 0.01, - normalizedScore: 0.123, - }, - ]) + addSignificantTermsAction( + [ + { + key: 'the-field-name:the-field-value', + type: 'keyword', + fieldName: 'the-field-name', + fieldValue: 'the-field-value', + doc_count: 10, + bg_count: 100, + total_doc_count: 1000, + total_bg_count: 10000, + score: 0.1, + pValue: 0.01, + normalizedScore: 0.123, + }, + ], + '2' + ) ); - expect(state1.significantTerms).toHaveLength(1); + expect(state1.significantItems).toHaveLength(1); const state2 = streamReducer(state1, resetAllAction()); - expect(state2.significantTerms).toHaveLength(0); + expect(state2.significantItems).toHaveLength(0); }); - it('adds significant terms and groups, then resets groups only', () => { - const state1 = streamReducer(initialState, addSignificantTermsAction(significantTerms)); + it('adds significant items and groups, then resets groups only', () => { + const state1 = streamReducer(initialState, addSignificantTermsAction(significantTerms, '2')); - expect(state1.significantTerms).toHaveLength(4); - expect(state1.significantTermsGroups).toHaveLength(0); + expect(state1.significantItems).toHaveLength(4); + expect(state1.significantItemsGroups).toHaveLength(0); const state2 = streamReducer( state1, - addSignificantTermsGroupAction(finalSignificantTermGroups) + addSignificantTermsGroupAction(finalSignificantTermGroups, '2') ); - expect(state2.significantTerms).toHaveLength(4); - expect(state2.significantTermsGroups).toHaveLength(4); + expect(state2.significantItems).toHaveLength(4); + expect(state2.significantItemsGroups).toHaveLength(4); const state3 = streamReducer(state2, resetGroupsAction()); - expect(state3.significantTerms).toHaveLength(4); - expect(state3.significantTermsGroups).toHaveLength(0); + expect(state3.significantItems).toHaveLength(4); + expect(state3.significantItemsGroups).toHaveLength(0); }); }); diff --git a/x-pack/plugins/aiops/common/api/stream_reducer.ts b/x-pack/plugins/aiops/common/api/stream_reducer.ts index 278c3843a2811..ba9e8014665c8 100644 --- a/x-pack/plugins/aiops/common/api/stream_reducer.ts +++ b/x-pack/plugins/aiops/common/api/stream_reducer.ts @@ -7,12 +7,12 @@ import type { SignificantTerm, SignificantTermGroup } from '@kbn/ml-agg-utils'; -import { API_ACTION_NAME, AiopsLogRateAnalysisApiAction } from './log_rate_analysis'; +import { API_ACTION_NAME, AiopsLogRateAnalysisApiAction } from './log_rate_analysis/actions'; interface StreamState { ccsWarning: boolean; - significantTerms: SignificantTerm[]; - significantTermsGroups: SignificantTermGroup[]; + significantItems: SignificantTerm[]; + significantItemsGroups: SignificantTermGroup[]; errors: string[]; loaded: number; loadingState: string; @@ -22,8 +22,8 @@ interface StreamState { export const initialState: StreamState = { ccsWarning: false, - significantTerms: [], - significantTermsGroups: [], + significantItems: [], + significantItemsGroups: [], errors: [], loaded: 0, loadingState: '', @@ -31,17 +31,17 @@ export const initialState: StreamState = { export function streamReducer( state: StreamState, - action: AiopsLogRateAnalysisApiAction | AiopsLogRateAnalysisApiAction[] + action: AiopsLogRateAnalysisApiAction<'2'> | Array> ): StreamState { if (Array.isArray(action)) { return action.reduce(streamReducer, state); } switch (action.type) { - case API_ACTION_NAME.ADD_SIGNIFICANT_TERMS: - return { ...state, significantTerms: [...state.significantTerms, ...action.payload] }; - case API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_HISTOGRAM: - const significantTerms = state.significantTerms.map((cp) => { + case API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS: + return { ...state, significantItems: [...state.significantItems, ...action.payload] }; + case API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_HISTOGRAM: + const significantItems = state.significantItems.map((cp) => { const cpHistogram = action.payload.find( (h) => h.fieldName === cp.fieldName && h.fieldValue === cp.fieldValue ); @@ -50,24 +50,24 @@ export function streamReducer( } return cp; }); - return { ...state, significantTerms }; - case API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP: - return { ...state, significantTermsGroups: action.payload }; - case API_ACTION_NAME.ADD_SIGNIFICANT_TERMS_GROUP_HISTOGRAM: - const significantTermsGroups = state.significantTermsGroups.map((cpg) => { + return { ...state, significantItems }; + case API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_GROUP: + return { ...state, significantItemsGroups: action.payload }; + case API_ACTION_NAME.ADD_SIGNIFICANT_ITEMS_GROUP_HISTOGRAM: + const significantItemsGroups = state.significantItemsGroups.map((cpg) => { const cpHistogram = action.payload.find((h) => h.id === cpg.id); if (cpHistogram) { cpg.histogram = cpHistogram.histogram; } return cpg; }); - return { ...state, significantTermsGroups }; + return { ...state, significantItemsGroups }; case API_ACTION_NAME.ADD_ERROR: return { ...state, errors: [...state.errors, action.payload] }; case API_ACTION_NAME.RESET_ERRORS: return { ...state, errors: [] }; case API_ACTION_NAME.RESET_GROUPS: - return { ...state, significantTermsGroups: [] }; + return { ...state, significantItemsGroups: [] }; case API_ACTION_NAME.RESET_ALL: return initialState; case API_ACTION_NAME.UPDATE_LOADING_STATE: diff --git a/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx b/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx index 283bb71e35a76..3796af67f8cd2 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx @@ -142,7 +142,7 @@ export const CategoryTable: FC = ({ return { doc_count_overall: adjustedDocCount, - doc_count_significant_term: newTerm, + doc_count_significant_item: newTerm, key: catKey, key_as_string: `${catKey}`, }; diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_results.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_results.tsx index 97d7201f0140d..3a236085cd6cf 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_results.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_results.tsx @@ -35,7 +35,8 @@ import type { SignificantTerm, SignificantTermGroup } from '@kbn/ml-agg-utils'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; import { initialState, streamReducer } from '../../../common/api/stream_reducer'; -import type { AiopsApiLogRateAnalysis } from '../../../common/api'; +import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis/schema'; +import type { AiopsLogRateAnalysisSchemaSignificantItem } from '../../../common/api/log_rate_analysis/schema_v2'; import { AIOPS_TELEMETRY_ID } from '../../../common/constants'; import { getGroupTableItems, @@ -145,9 +146,9 @@ export const LogRateAnalysisResults: FC = ({ const [groupResults, setGroupResults] = useState(false); const [groupSkipFields, setGroupSkipFields] = useState([]); const [uniqueFieldNames, setUniqueFieldNames] = useState([]); - const [overrides, setOverrides] = useState< - AiopsApiLogRateAnalysis['body']['overrides'] | undefined - >(undefined); + const [overrides, setOverrides] = useState( + undefined + ); const [shouldStart, setShouldStart] = useState(false); const [toggleIdSelected, setToggleIdSelected] = useState(resultsGroupedOffId); @@ -164,7 +165,9 @@ export const LogRateAnalysisResults: FC = ({ setOverrides({ loaded: 0, remainingFieldCandidates: [], - significantTerms: data.significantTerms.filter((d) => !skippedFields.includes(d.fieldName)), + significantItems: data.significantItems.filter( + (d) => !skippedFields.includes(d.fieldName) + ) as AiopsLogRateAnalysisSchemaSignificantItem[], regroupOnly: true, }); startHandler(true, false); @@ -176,10 +179,10 @@ export const LogRateAnalysisResults: FC = ({ data, isRunning, errors: streamErrors, - } = useFetchStream( + } = useFetchStream, typeof streamReducer>( http, '/internal/aiops/log_rate_analysis', - '1', + '2', { start: earliest, end: latest, @@ -206,10 +209,10 @@ export const LogRateAnalysisResults: FC = ({ { [AIOPS_TELEMETRY_ID.AIOPS_ANALYSIS_RUN_ORIGIN]: embeddingOrigin } ); - const { significantTerms } = data; + const { significantItems } = data; useEffect( - () => setUniqueFieldNames(uniq(significantTerms.map((d) => d.fieldName)).sort()), - [significantTerms] + () => setUniqueFieldNames(uniq(significantItems.map((d) => d.fieldName)).sort()), + [significantItems] ); useEffect(() => { @@ -221,14 +224,18 @@ export const LogRateAnalysisResults: FC = ({ ((Array.isArray(remainingFieldCandidates) && remainingFieldCandidates.length > 0) || groupsMissing) ) { - setOverrides({ loaded, remainingFieldCandidates, significantTerms: data.significantTerms }); + setOverrides({ + loaded, + remainingFieldCandidates, + significantItems: data.significantItems as AiopsLogRateAnalysisSchemaSignificantItem[], + }); } else { setOverrides(undefined); if (onAnalysisCompleted) { onAnalysisCompleted({ analysisType, - significantTerms: data.significantTerms, - significantTermsGroups: data.significantTermsGroups, + significantTerms: data.significantItems, + significantTermsGroups: data.significantItemsGroups, }); } } @@ -277,8 +284,8 @@ export const LogRateAnalysisResults: FC = ({ }, []); const groupTableItems = useMemo( - () => getGroupTableItems(data.significantTermsGroups), - [data.significantTermsGroups] + () => getGroupTableItems(data.significantItemsGroups), + [data.significantItemsGroups] ); const shouldRerunAnalysis = useMemo( @@ -288,7 +295,7 @@ export const LogRateAnalysisResults: FC = ({ [currentAnalysisWindowParameters, windowParameters] ); - const showLogRateAnalysisResultsTable = data?.significantTerms.length > 0; + const showLogRateAnalysisResultsTable = data?.significantItems.length > 0; const groupItemCount = groupTableItems.reduce((p, c) => { return p + c.groupItemsSortedByUniqueness.length; }, 0); @@ -475,7 +482,7 @@ export const LogRateAnalysisResults: FC = ({ > {showLogRateAnalysisResultsTable && groupResults ? ( = ({ ) : null} {showLogRateAnalysisResultsTable && !groupResults ? ( = ({ xScaleType={ScaleType.Time} yScaleType={ScaleType.Linear} xAccessor={'key'} - yAccessors={['doc_count_significant_term']} + yAccessors={['doc_count_significant_item']} data={chartData} stackAccessors={[0]} color={barHighlightColor} diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts index 3be8ef8dcdd2b..6f9343a50ae62 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/define_route.ts @@ -10,7 +10,8 @@ import type { Logger } from '@kbn/logging'; import type { DataRequestHandlerContext } from '@kbn/data-plugin/server'; import type { UsageCounter } from '@kbn/usage-collection-plugin/server'; -import { aiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis'; +import { aiopsLogRateAnalysisSchemaV1 } from '../../../common/api/log_rate_analysis/schema_v1'; +import { aiopsLogRateAnalysisSchemaV2 } from '../../../common/api/log_rate_analysis/schema_v2'; import { AIOPS_API_ENDPOINT } from '../../../common/api'; import type { AiopsLicense } from '../../types'; @@ -27,7 +28,6 @@ export const defineRoute = ( router.versioned .post({ path: AIOPS_API_ENDPOINT.LOG_RATE_ANALYSIS, - access: 'internal', }) .addVersion( @@ -35,10 +35,21 @@ export const defineRoute = ( version: '1', validate: { request: { - body: aiopsLogRateAnalysisSchema, + body: aiopsLogRateAnalysisSchemaV1, + }, + }, + }, + routeHandlerFactory('1', license, logger, coreStart, usageCounter) + ) + .addVersion( + { + version: '2', + validate: { + request: { + body: aiopsLogRateAnalysisSchemaV2, }, }, }, - routeHandlerFactory(license, logger, coreStart, usageCounter) + routeHandlerFactory('2', license, logger, coreStart, usageCounter) ); }; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts index bb49622ad999c..e70255ababffd 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_categories.ts @@ -16,7 +16,7 @@ import { } from '@kbn/ml-random-sampler-utils'; import { RANDOM_SAMPLER_SEED } from '../../../../common/constants'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { createCategoryRequest } from '../../../../common/api/log_categorization/create_category_request'; import type { Category, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts index fc7c14fb8f2ee..608734ae0e19a 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_category_counts.ts @@ -12,7 +12,7 @@ import { ElasticsearchClient } from '@kbn/core/server'; import type { Logger } from '@kbn/logging'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { getCategoryQuery } from '../../../../common/api/log_categorization/get_category_query'; import type { Category } from '../../../../common/api/log_categorization/types'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts index 790989df9833c..db14c30caebdc 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.test.ts @@ -9,7 +9,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { ElasticsearchClient } from '@kbn/core/server'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { fetchIndexInfo, getRandomDocsRequest } from './fetch_index_info'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.ts index cfb9426a739ad..595e212159437 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_index_info.ts @@ -10,7 +10,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ES_FIELD_TYPES } from '@kbn/field-types'; import type { ElasticsearchClient } from '@kbn/core/server'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { getQueryWithParams } from './get_query_with_params'; import { getRequestBase } from './get_request_base'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts index c9e54be509426..4cf106a369464 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_categories.ts @@ -13,7 +13,7 @@ import { criticalTableLookup, type Histogram } from '@kbn/ml-chi2test'; import { type SignificantTerm, SIGNIFICANT_TERM_TYPE } from '@kbn/ml-agg-utils'; import type { Category } from '../../../../common/api/log_categorization/types'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { LOG_RATE_ANALYSIS_SETTINGS } from '../../../../common/constants'; import { fetchCategories } from './fetch_categories'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_term_p_values.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_term_p_values.ts index 00bcd918f48d9..10b488940ce2c 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_term_p_values.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_significant_term_p_values.ts @@ -16,7 +16,7 @@ import { } from '@kbn/ml-random-sampler-utils'; import { LOG_RATE_ANALYSIS_SETTINGS, RANDOM_SAMPLER_SEED } from '../../../../common/constants'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { isRequestAbortedError } from '../../../lib/is_request_aborted_error'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_terms_2_categories_counts.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_terms_2_categories_counts.ts index f1629f212ae99..14be571331fd0 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_terms_2_categories_counts.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/fetch_terms_2_categories_counts.ts @@ -14,7 +14,7 @@ import type { Logger } from '@kbn/logging'; import type { FieldValuePair, SignificantTerm } from '@kbn/ml-agg-utils'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import type { FetchFrequentItemSetsResponse, ItemSet } from '../../../../common/types'; import { getCategoryQuery } from '../../../../common/api/log_categorization/get_category_query'; import type { Category } from '../../../../common/api/log_categorization/types'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts index 5e58e138dac6b..e910d2e997441 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_filters.ts @@ -9,7 +9,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { ESFilter } from '@kbn/es-types'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; export function rangeQuery( start?: number, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.ts index b45d7d026638e..0f3510df73dcf 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_histogram_query.ts @@ -7,7 +7,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { getQueryWithParams } from './get_query_with_params'; diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts index 2d68c666b78ea..b7e2e2619316a 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_query_with_params.ts @@ -9,7 +9,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { FieldValuePair } from '@kbn/ml-agg-utils'; -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; import { getFilters } from './get_filters'; @@ -18,7 +18,7 @@ export const getTermsQuery = ({ fieldName, fieldValue }: FieldValuePair) => { }; interface QueryParams { - params: AiopsLogRateAnalysisSchema; + params: AiopsLogRateAnalysisSchema<'2'>; termFilters?: FieldValuePair[]; filter?: estypes.QueryDslQueryContainer; } diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.ts index 2410be74ea6b0..ddc1a2b3a0a34 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/queries/get_request_base.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis'; +import type { AiopsLogRateAnalysisSchema } from '../../../../common/api/log_rate_analysis/schema'; export const getRequestBase = ({ index, includeFrozen }: AiopsLogRateAnalysisSchema) => ({ index, diff --git a/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts b/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts index b522d6d6ee818..b92458cc1e3de 100644 --- a/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts +++ b/x-pack/plugins/aiops/server/routes/log_rate_analysis/route_handler_factory.ts @@ -23,6 +23,7 @@ import { streamFactory } from '@kbn/ml-response-stream/server'; import type { SignificantTerm, SignificantTermGroup, + SignificantTermHistogramItem, NumericChartData, NumericHistogramField, } from '@kbn/ml-agg-utils'; @@ -44,8 +45,11 @@ import { resetGroupsAction, updateLoadingStateAction, AiopsLogRateAnalysisApiAction, - type AiopsLogRateAnalysisSchema, -} from '../../../common/api/log_rate_analysis'; +} from '../../../common/api/log_rate_analysis/actions'; +import type { + AiopsLogRateAnalysisSchema, + AiopsLogRateAnalysisApiVersion as ApiVersion, +} from '../../../common/api/log_rate_analysis/schema'; import { getCategoryQuery } from '../../../common/api/log_categorization/get_category_query'; import { AIOPS_API_ENDPOINT } from '../../../common/api'; @@ -74,16 +78,16 @@ const PROGRESS_STEP_GROUPING = 0.1; const PROGRESS_STEP_HISTOGRAMS = 0.1; const PROGRESS_STEP_HISTOGRAMS_GROUPS = 0.1; -export const routeHandlerFactory: ( +export function routeHandlerFactory( + version: T, license: AiopsLicense, logger: Logger, coreStart: CoreStart, usageCounter?: UsageCounter -) => RequestHandler = - (license, logger, coreStart, usageCounter) => - async ( +): RequestHandler> { + return async ( context: RequestHandlerContext, - request: KibanaRequest, + request: KibanaRequest>, response: KibanaResponseFactory ) => { const { headers } = request; @@ -135,7 +139,7 @@ export const routeHandlerFactory: ( end: streamEnd, push, responseWithHeaders, - } = streamFactory( + } = streamFactory>( request.headers, logger, request.body.compressResponse, @@ -288,11 +292,27 @@ export const routeHandlerFactory: ( // This will store the combined count of detected significant log patterns and keywords let fieldValuePairsCount = 0; - const significantCategories: SignificantTerm[] = request.body.overrides?.significantTerms - ? request.body.overrides?.significantTerms.filter( + const significantCategories: SignificantTerm[] = []; + + if (version === '1') { + significantCategories.push( + ...(( + request.body as AiopsLogRateAnalysisSchema<'1'> + ).overrides?.significantTerms?.filter( (d) => d.type === SIGNIFICANT_TERM_TYPE.LOG_PATTERN - ) - : []; + ) ?? []) + ); + } + + if (version === '2') { + significantCategories.push( + ...(( + request.body as AiopsLogRateAnalysisSchema<'2'> + ).overrides?.significantItems?.filter( + (d) => d.type === SIGNIFICANT_TERM_TYPE.LOG_PATTERN + ) ?? []) + ); + } // Get significant categories of text fields if (textFieldCandidates.length > 0) { @@ -309,15 +329,31 @@ export const routeHandlerFactory: ( ); if (significantCategories.length > 0) { - push(addSignificantTermsAction(significantCategories)); + push(addSignificantTermsAction(significantCategories, version)); } } - const significantTerms: SignificantTerm[] = request.body.overrides?.significantTerms - ? request.body.overrides?.significantTerms.filter( + const significantTerms: SignificantTerm[] = []; + + if (version === '1') { + significantTerms.push( + ...(( + request.body as AiopsLogRateAnalysisSchema<'1'> + ).overrides?.significantTerms?.filter( (d) => d.type === SIGNIFICANT_TERM_TYPE.KEYWORD - ) - : []; + ) ?? []) + ); + } + + if (version === '2') { + significantTerms.push( + ...(( + request.body as AiopsLogRateAnalysisSchema<'2'> + ).overrides?.significantItems?.filter( + (d) => d.type === SIGNIFICANT_TERM_TYPE.KEYWORD + ) ?? []) + ); + } const fieldsToSample = new Set(); @@ -375,7 +411,7 @@ export const routeHandlerFactory: ( }); significantTerms.push(...pValues); - push(addSignificantTermsAction(pValues)); + push(addSignificantTermsAction(pValues, version)); } push( @@ -546,7 +582,7 @@ export const routeHandlerFactory: ( const maxItems = Math.max(...significantTermGroups.map((g) => g.group.length)); if (maxItems > 1) { - push(addSignificantTermsGroupAction(significantTermGroups)); + push(addSignificantTermsGroupAction(significantTermGroups, version)); } loaded += PROGRESS_STEP_GROUPING; @@ -608,28 +644,41 @@ export const routeHandlerFactory: ( } return; } - const histogram = + const histogram: SignificantTermHistogramItem[] = overallTimeSeries.data.map((o) => { const current = cpgTimeSeries.data.find( (d1) => d1.key_as_string === o.key_as_string ) ?? { doc_count: 0, }; + + if (version === '1') { + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_term: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + } + return { key: o.key, key_as_string: o.key_as_string ?? '', - doc_count_significant_term: current.doc_count, + doc_count_significant_item: current.doc_count, doc_count_overall: Math.max(0, o.doc_count - current.doc_count), }; }) ?? []; push( - addSignificantTermsGroupHistogramAction([ - { - id: cpg.id, - histogram, - }, - ]) + addSignificantTermsGroupHistogramAction( + [ + { + id: cpg.id, + histogram, + }, + ], + version + ) ); } }, MAX_CONCURRENT_QUERIES); @@ -710,17 +759,26 @@ export const routeHandlerFactory: ( return; } - const histogram = + const histogram: SignificantTermHistogramItem[] = overallTimeSeries.data.map((o) => { const current = cpTimeSeries.data.find( (d1) => d1.key_as_string === o.key_as_string ) ?? { doc_count: 0, }; + if (version === '1') { + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_term: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + } + return { key: o.key, key_as_string: o.key_as_string ?? '', - doc_count_significant_term: current.doc_count, + doc_count_significant_item: current.doc_count, doc_count_overall: Math.max(0, o.doc_count - current.doc_count), }; }) ?? []; @@ -730,13 +788,16 @@ export const routeHandlerFactory: ( loaded += (1 / fieldValuePairsCount) * PROGRESS_STEP_HISTOGRAMS; pushHistogramDataLoadingState(); push( - addSignificantTermsHistogramAction([ - { - fieldName, - fieldValue, - histogram, - }, - ]) + addSignificantTermsHistogramAction( + [ + { + fieldName, + fieldValue, + histogram, + }, + ], + version + ) ); } }, MAX_CONCURRENT_QUERIES); @@ -802,17 +863,27 @@ export const routeHandlerFactory: ( return; } - const histogram = + const histogram: SignificantTermHistogramItem[] = overallTimeSeries.data.map((o) => { const current = catTimeSeries.data.find( (d1) => d1.key_as_string === o.key_as_string ) ?? { doc_count: 0, }; + + if (version === '1') { + return { + key: o.key, + key_as_string: o.key_as_string ?? '', + doc_count_significant_term: current.doc_count, + doc_count_overall: Math.max(0, o.doc_count - current.doc_count), + }; + } + return { key: o.key, key_as_string: o.key_as_string ?? '', - doc_count_significant_term: current.doc_count, + doc_count_significant_item: current.doc_count, doc_count_overall: Math.max(0, o.doc_count - current.doc_count), }; }) ?? []; @@ -822,13 +893,16 @@ export const routeHandlerFactory: ( loaded += (1 / fieldValuePairsCount) * PROGRESS_STEP_HISTOGRAMS; pushHistogramDataLoadingState(); push( - addSignificantTermsHistogramAction([ - { - fieldName, - fieldValue, - histogram, - }, - ]) + addSignificantTermsHistogramAction( + [ + { + fieldName, + fieldValue, + histogram, + }, + ], + version + ) ); } } @@ -849,3 +923,4 @@ export const routeHandlerFactory: ( return response.ok(responseWithHeaders); }); }; +} diff --git a/x-pack/test/api_integration/apis/aiops/log_rate_analysis_full_analysis.ts b/x-pack/test/api_integration/apis/aiops/log_rate_analysis_full_analysis.ts index c9fe22a472f4f..4c3d787402864 100644 --- a/x-pack/test/api_integration/apis/aiops/log_rate_analysis_full_analysis.ts +++ b/x-pack/test/api_integration/apis/aiops/log_rate_analysis_full_analysis.ts @@ -10,13 +10,19 @@ import fetch from 'node-fetch'; import { format as formatUrl } from 'url'; import expect from '@kbn/expect'; -import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api'; +import type { AiopsLogRateAnalysisSchema } from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; import { parseStream } from './parse_stream'; -import { logRateAnalysisTestData } from './test_data'; +import { getLogRateAnalysisTestData, API_VERSIONS } from './test_data'; +import { + getAddSignificationItemsActions, + getHistogramActions, + getGroupActions, + getGroupHistogramActions, +} from './test_helpers'; export default ({ getService }: FtrProviderContext) => { const aiops = getService('aiops'); @@ -26,202 +32,202 @@ export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); describe('POST /internal/aiops/log_rate_analysis - full analysis', () => { - logRateAnalysisTestData.forEach((testData) => { - describe(`with ${testData.testName}`, () => { - before(async () => { - if (testData.esArchive) { - await esArchiver.loadIfNeeded(testData.esArchive); - } else if (testData.dataGenerator) { - await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator); - } - }); - - after(async () => { - if (testData.esArchive) { - await esArchiver.unload(testData.esArchive); - } else if (testData.dataGenerator) { - await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator); - } - }); - - async function assertAnalysisResult(data: any[]) { - expect(data.length).to.eql( - testData.expected.actionsLength, - `Expected 'actionsLength' to be ${testData.expected.actionsLength}, got ${data.length}.` - ); - data.forEach((d) => { - expect(typeof d.type).to.be('string'); + API_VERSIONS.forEach((apiVersion) => { + getLogRateAnalysisTestData().forEach((testData) => { + describe(`with v${apiVersion} - ${testData.testName}`, () => { + before(async () => { + if (testData.esArchive) { + await esArchiver.loadIfNeeded(testData.esArchive); + } else if (testData.dataGenerator) { + await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator); + } }); - const addSignificantTermsActions = data.filter( - (d) => d.type === testData.expected.significantTermFilter - ); - expect(addSignificantTermsActions.length).to.greaterThan(0); - - const significantTerms = orderBy( - addSignificantTermsActions.flatMap((d) => d.payload), - ['doc_count'], - ['desc'] - ); - - expect(significantTerms).to.eql( - testData.expected.significantTerms, - 'Significant terms do not match expected values.' - ); - - const histogramActions = data.filter((d) => d.type === testData.expected.histogramFilter); - const histograms = histogramActions.flatMap((d) => d.payload); - // for each significant term we should get a histogram - expect(histogramActions.length).to.be(significantTerms.length); - // each histogram should have a length of 20 items. - histograms.forEach((h, index) => { - expect(h.histogram.length).to.be(20); + after(async () => { + if (testData.esArchive) { + await esArchiver.unload(testData.esArchive); + } else if (testData.dataGenerator) { + await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator); + } }); - const groupActions = data.filter((d) => d.type === testData.expected.groupFilter); - const groups = groupActions.flatMap((d) => d.payload); - - expect(orderBy(groups, ['docCount'], ['desc'])).to.eql( - orderBy(testData.expected.groups, ['docCount'], ['desc']), - 'Grouping result does not match expected values.' - ); - - const groupHistogramActions = data.filter( - (d) => d.type === testData.expected.groupHistogramFilter - ); - const groupHistograms = groupHistogramActions.flatMap((d) => d.payload); - // for each significant terms group we should get a histogram - expect(groupHistograms.length).to.be(groups.length); - // each histogram should have a length of 20 items. - groupHistograms.forEach((h, index) => { - expect(h.histogram.length).to.be(20); - }); - } - - async function requestWithoutStreaming(body: AiopsApiLogRateAnalysis['body']) { - const resp = await supertest - .post(`/internal/aiops/log_rate_analysis`) - .set('kbn-xsrf', 'kibana') - .set(ELASTIC_HTTP_VERSION_HEADER, '1') - .send(body) - .expect(200); - - // compression is on by default so if the request body is undefined - // the response header should include "gzip" and otherwise be "undefined" - if (body.compressResponse === undefined) { - expect(resp.header['content-encoding']).to.be('gzip'); - } else if (body.compressResponse === false) { - expect(resp.header['content-encoding']).to.be(undefined); + async function assertAnalysisResult(data: any[]) { + expect(data.length).to.eql( + testData.expected.actionsLength, + `Expected 'actionsLength' to be ${testData.expected.actionsLength}, got ${data.length}.` + ); + data.forEach((d) => { + expect(typeof d.type).to.be('string'); + }); + + const addSignificantItemsActions = getAddSignificationItemsActions(data, apiVersion); + expect(addSignificantItemsActions.length).to.greaterThan(0); + + const significantItems = orderBy( + addSignificantItemsActions.flatMap((d) => d.payload), + ['doc_count'], + ['desc'] + ); + + expect(significantItems).to.eql( + testData.expected.significantTerms, + 'Significant terms do not match expected values.' + ); + + const histogramActions = getHistogramActions(data, apiVersion); + const histograms = histogramActions.flatMap((d) => d.payload); + // for each significant term we should get a histogram + expect(histogramActions.length).to.be(significantItems.length); + // each histogram should have a length of 20 items. + histograms.forEach((h, index) => { + expect(h.histogram.length).to.be(20); + }); + + const groupActions = getGroupActions(data, apiVersion); + const groups = groupActions.flatMap((d) => d.payload); + + expect(orderBy(groups, ['docCount'], ['desc'])).to.eql( + orderBy(testData.expected.groups, ['docCount'], ['desc']), + 'Grouping result does not match expected values.' + ); + + const groupHistogramActions = getGroupHistogramActions(data, apiVersion); + const groupHistograms = groupHistogramActions.flatMap((d) => d.payload); + // for each significant terms group we should get a histogram + expect(groupHistograms.length).to.be(groups.length); + // each histogram should have a length of 20 items. + groupHistograms.forEach((h, index) => { + expect(h.histogram.length).to.be(20); + }); } - expect(Buffer.isBuffer(resp.body)).to.be(true); + async function requestWithoutStreaming( + body: AiopsLogRateAnalysisSchema + ) { + const resp = await supertest + .post(`/internal/aiops/log_rate_analysis`) + .set('kbn-xsrf', 'kibana') + .set(ELASTIC_HTTP_VERSION_HEADER, apiVersion) + .send(body) + .expect(200); + + // compression is on by default so if the request body is undefined + // the response header should include "gzip" and otherwise be "undefined" + if (body.compressResponse === undefined) { + expect(resp.header['content-encoding']).to.be('gzip'); + } else if (body.compressResponse === false) { + expect(resp.header['content-encoding']).to.be(undefined); + } - const chunks: string[] = resp.body.toString().split('\n'); + expect(Buffer.isBuffer(resp.body)).to.be(true); - expect(chunks.length).to.eql( - testData.expected.chunksLength, - `Expected 'chunksLength' to be ${testData.expected.chunksLength}, got ${chunks.length}.` - ); + const chunks: string[] = resp.body.toString().split('\n'); - const lastChunk = chunks.pop(); - expect(lastChunk).to.be(''); + expect(chunks.length).to.eql( + testData.expected.chunksLength, + `Expected 'chunksLength' to be ${testData.expected.chunksLength}, got ${chunks.length}.` + ); - let data: any[] = []; + const lastChunk = chunks.pop(); + expect(lastChunk).to.be(''); - expect(() => { - data = chunks.map((c) => JSON.parse(c)); - }).not.to.throwError(); + let data: any[] = []; - await assertAnalysisResult(data); - } + expect(() => { + data = chunks.map((c) => JSON.parse(c)); + }).not.to.throwError(); - it('should return full data without streaming with compression with flushFix', async () => { - await requestWithoutStreaming(testData.requestBody); - }); + await assertAnalysisResult(data); + } - it('should return full data without streaming with compression without flushFix', async () => { - await requestWithoutStreaming({ ...testData.requestBody, flushFix: false }); - }); + it('should return full data without streaming with compression with flushFix', async () => { + await requestWithoutStreaming(testData.requestBody); + }); - it('should return full data without streaming without compression with flushFix', async () => { - await requestWithoutStreaming({ ...testData.requestBody, compressResponse: false }); - }); + it('should return full data without streaming with compression without flushFix', async () => { + await requestWithoutStreaming({ ...testData.requestBody, flushFix: false }); + }); - it('should return full data without streaming without compression without flushFix', async () => { - await requestWithoutStreaming({ - ...testData.requestBody, - compressResponse: false, - flushFix: false, + it('should return full data without streaming without compression with flushFix', async () => { + await requestWithoutStreaming({ ...testData.requestBody, compressResponse: false }); }); - }); - async function requestWithStreaming(body: AiopsApiLogRateAnalysis['body']) { - const resp = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - [ELASTIC_HTTP_VERSION_HEADER]: '1', - 'kbn-xsrf': 'stream', - }, - body: JSON.stringify(body), + it('should return full data without streaming without compression without flushFix', async () => { + await requestWithoutStreaming({ + ...testData.requestBody, + compressResponse: false, + flushFix: false, + }); }); - // compression is on by default so if the request body is undefined - // the response header should include "gzip" and otherwise be "null" - if (body.compressResponse === undefined) { - expect(resp.headers.get('content-encoding')).to.be('gzip'); - } else if (body.compressResponse === false) { - expect(resp.headers.get('content-encoding')).to.be(null); - } + async function requestWithStreaming(body: AiopsLogRateAnalysisSchema) { + const resp = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + [ELASTIC_HTTP_VERSION_HEADER]: apiVersion, + 'kbn-xsrf': 'stream', + }, + body: JSON.stringify(body), + }); + + // compression is on by default so if the request body is undefined + // the response header should include "gzip" and otherwise be "null" + if (body.compressResponse === undefined) { + expect(resp.headers.get('content-encoding')).to.be('gzip'); + } else if (body.compressResponse === false) { + expect(resp.headers.get('content-encoding')).to.be(null); + } - expect(resp.ok).to.be(true); - expect(resp.status).to.be(200); + expect(resp.ok).to.be(true); + expect(resp.status).to.be(200); - const stream = resp.body; + const stream = resp.body; - expect(stream).not.to.be(null); + expect(stream).not.to.be(null); - if (stream !== null) { - const data: any[] = []; - let chunkCounter = 0; - const parseStreamCallback = (c: number) => (chunkCounter = c); + if (stream !== null) { + const data: any[] = []; + let chunkCounter = 0; + const parseStreamCallback = (c: number) => (chunkCounter = c); - for await (const action of parseStream(stream, parseStreamCallback)) { - expect(action.type).not.to.be('error'); - data.push(action); - } + for await (const action of parseStream(stream, parseStreamCallback)) { + expect(action.type).not.to.be('error'); + data.push(action); + } - // Originally we assumed that we can assert streaming in contrast - // to non-streaming if there is more than one chunk. However, - // this turned out to be flaky since a stream could finish fast - // enough to contain only one chunk. So now we are checking if - // there's just one chunk or more. - expect(chunkCounter).to.be.greaterThan( - 0, - `Expected 'chunkCounter' to be greater than 0, got ${chunkCounter}.` - ); + // Originally we assumed that we can assert streaming in contrast + // to non-streaming if there is more than one chunk. However, + // this turned out to be flaky since a stream could finish fast + // enough to contain only one chunk. So now we are checking if + // there's just one chunk or more. + expect(chunkCounter).to.be.greaterThan( + 0, + `Expected 'chunkCounter' to be greater than 0, got ${chunkCounter}.` + ); - await assertAnalysisResult(data); + await assertAnalysisResult(data); + } } - } - it('should return data in chunks with streaming with compression with flushFix', async () => { - await requestWithStreaming(testData.requestBody); - }); + it('should return data in chunks with streaming with compression with flushFix', async () => { + await requestWithStreaming(testData.requestBody); + }); - it('should return data in chunks with streaming with compression without flushFix', async () => { - await requestWithStreaming({ ...testData.requestBody, flushFix: false }); - }); + it('should return data in chunks with streaming with compression without flushFix', async () => { + await requestWithStreaming({ ...testData.requestBody, flushFix: false }); + }); - it('should return data in chunks with streaming without compression with flushFix', async () => { - await requestWithStreaming({ ...testData.requestBody, compressResponse: false }); - }); + it('should return data in chunks with streaming without compression with flushFix', async () => { + await requestWithStreaming({ ...testData.requestBody, compressResponse: false }); + }); - it('should return data in chunks with streaming without compression without flushFix', async () => { - await requestWithStreaming({ - ...testData.requestBody, - compressResponse: false, - flushFix: false, + it('should return data in chunks with streaming without compression without flushFix', async () => { + await requestWithStreaming({ + ...testData.requestBody, + compressResponse: false, + flushFix: false, + }); }); }); }); diff --git a/x-pack/test/api_integration/apis/aiops/log_rate_analysis_groups_only.ts b/x-pack/test/api_integration/apis/aiops/log_rate_analysis_groups_only.ts index 8aeccc6af9a97..3ffcf7b04fdd2 100644 --- a/x-pack/test/api_integration/apis/aiops/log_rate_analysis_groups_only.ts +++ b/x-pack/test/api_integration/apis/aiops/log_rate_analysis_groups_only.ts @@ -10,13 +10,20 @@ import fetch from 'node-fetch'; import { format as formatUrl } from 'url'; import expect from '@kbn/expect'; -import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api'; +import type { AiopsLogRateAnalysisSchema } from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema'; +import type { AiopsLogRateAnalysisSchemaSignificantItem } from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema_v2'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; import { parseStream } from './parse_stream'; -import { logRateAnalysisTestData } from './test_data'; +import { getLogRateAnalysisTestData, API_VERSIONS } from './test_data'; +import { + getAddSignificationItemsActions, + getHistogramActions, + getGroupActions, + getGroupHistogramActions, +} from './test_helpers'; export default ({ getService }: FtrProviderContext) => { const aiops = getService('aiops'); @@ -25,211 +32,229 @@ export default ({ getService }: FtrProviderContext) => { const kibanaServerUrl = formatUrl(config.get('servers.kibana')); const esArchiver = getService('esArchiver'); - // FLAKY: https://github.com/elastic/kibana/issues/169325 - describe.skip('POST /internal/aiops/log_rate_analysis - groups only', () => { - logRateAnalysisTestData.forEach((testData) => { - const overrides = { - loaded: 0, - remainingFieldCandidates: [], - significantTerms: testData.expected.significantTerms, - regroupOnly: true, - }; - - describe(`with ${testData.testName}`, () => { - before(async () => { - if (testData.esArchive) { - await esArchiver.loadIfNeeded(testData.esArchive); - } else if (testData.dataGenerator) { - await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator); - } - }); + describe('POST /internal/aiops/log_rate_analysis - groups only', () => { + API_VERSIONS.forEach((apiVersion) => { + getLogRateAnalysisTestData().forEach((testData) => { + let overrides: AiopsLogRateAnalysisSchema['overrides'] = {}; + + if (apiVersion === '1') { + overrides = { + loaded: 0, + remainingFieldCandidates: [], + significantTerms: testData.expected.significantTerms, + regroupOnly: true, + } as AiopsLogRateAnalysisSchema['overrides']; + } - after(async () => { - if (testData.esArchive) { - await esArchiver.unload(testData.esArchive); - } else if (testData.dataGenerator) { - await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator); - } - }); + if (apiVersion === '2') { + overrides = { + loaded: 0, + remainingFieldCandidates: [], + significantItems: testData.expected + .significantTerms as AiopsLogRateAnalysisSchemaSignificantItem[], + regroupOnly: true, + } as AiopsLogRateAnalysisSchema['overrides']; + } - async function assertAnalysisResult(data: any[]) { - expect(data.length).to.eql( - testData.expected.actionsLengthGroupOnly, - `Expected 'actionsLengthGroupOnly' to be ${testData.expected.actionsLengthGroupOnly}, got ${data.length}.` - ); - data.forEach((d) => { - expect(typeof d.type).to.be('string'); + describe(`with v${apiVersion} - ${testData.testName}`, () => { + before(async () => { + if (testData.esArchive) { + await esArchiver.loadIfNeeded(testData.esArchive); + } else if (testData.dataGenerator) { + await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator); + } }); - const addSignificantTermsActions = data.filter( - (d) => d.type === testData.expected.significantTermFilter - ); - expect(addSignificantTermsActions.length).to.eql( - 0, - `Expected significant terms actions to be 0, got ${addSignificantTermsActions.length}` - ); - - const histogramActions = data.filter((d) => d.type === testData.expected.histogramFilter); - // for each significant term we should get a histogram - expect(histogramActions.length).to.eql( - 0, - `Expected histogram actions to be 0, got ${histogramActions.length}` - ); - - const groupActions = data.filter((d) => d.type === testData.expected.groupFilter); - const groups = groupActions.flatMap((d) => d.payload); - - expect(orderBy(groups, ['docCount'], ['desc'])).to.eql( - orderBy(testData.expected.groups, ['docCount'], ['desc']), - 'Grouping result does not match expected values.' - ); - - const groupHistogramActions = data.filter( - (d) => d.type === testData.expected.groupHistogramFilter - ); - const groupHistograms = groupHistogramActions.flatMap((d) => d.payload); - // for each significant terms group we should get a histogram - expect(groupHistograms.length).to.be(groups.length); - // each histogram should have a length of 20 items. - groupHistograms.forEach((h, index) => { - expect(h.histogram.length).to.be(20); + after(async () => { + if (testData.esArchive) { + await esArchiver.unload(testData.esArchive); + } else if (testData.dataGenerator) { + await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator); + } }); - } - async function requestWithoutStreaming(body: AiopsApiLogRateAnalysis['body']) { - const resp = await supertest - .post(`/internal/aiops/log_rate_analysis`) - .set('kbn-xsrf', 'kibana') - .set(ELASTIC_HTTP_VERSION_HEADER, '1') - .send(body) - .expect(200); - - // compression is on by default so if the request body is undefined - // the response header should include "gzip" and otherwise be "undefined" - if (body.compressResponse === undefined) { - expect(resp.header['content-encoding']).to.be('gzip'); - } else if (body.compressResponse === false) { - expect(resp.header['content-encoding']).to.be(undefined); + async function assertAnalysisResult(data: any[]) { + expect(data.length).to.eql( + testData.expected.actionsLengthGroupOnly, + `Expected 'actionsLengthGroupOnly' to be ${testData.expected.actionsLengthGroupOnly}, got ${data.length}.` + ); + data.forEach((d) => { + expect(typeof d.type).to.be('string'); + }); + + const addSignificantItemsActions = getAddSignificationItemsActions(data, apiVersion); + expect(addSignificantItemsActions.length).to.eql( + 0, + `Expected significant items actions to be 0, got ${addSignificantItemsActions.length}` + ); + + const histogramActions = getHistogramActions(data, apiVersion); + + // for each significant item we should get a histogram + expect(histogramActions.length).to.eql( + 0, + `Expected histogram actions to be 0, got ${histogramActions.length}` + ); + + const groupActions = getGroupActions(data, apiVersion); + const groups = groupActions.flatMap((d) => d.payload); + + expect(orderBy(groups, ['docCount'], ['desc'])).to.eql( + orderBy(testData.expected.groups, ['docCount'], ['desc']), + 'Grouping result does not match expected values.' + ); + + const groupHistogramActions = getGroupHistogramActions(data, apiVersion); + const groupHistograms = groupHistogramActions.flatMap((d) => d.payload); + // for each significant items group we should get a histogram + expect(groupHistograms.length).to.be(groups.length); + // each histogram should have a length of 20 items. + groupHistograms.forEach((h, index) => { + expect(h.histogram.length).to.be(20); + }); } - expect(Buffer.isBuffer(resp.body)).to.be(true); + async function requestWithoutStreaming( + body: AiopsLogRateAnalysisSchema + ) { + const resp = await supertest + .post(`/internal/aiops/log_rate_analysis`) + .set('kbn-xsrf', 'kibana') + .set(ELASTIC_HTTP_VERSION_HEADER, apiVersion) + .send(body) + .expect(200); + + // compression is on by default so if the request body is undefined + // the response header should include "gzip" and otherwise be "undefined" + if (body.compressResponse === undefined) { + expect(resp.header['content-encoding']).to.be('gzip'); + } else if (body.compressResponse === false) { + expect(resp.header['content-encoding']).to.be(undefined); + } - const chunks: string[] = resp.body.toString().split('\n'); + expect(Buffer.isBuffer(resp.body)).to.be(true); - expect(chunks.length).to.eql( - testData.expected.chunksLengthGroupOnly, - `Expected 'chunksLength' to be ${testData.expected.chunksLengthGroupOnly}, got ${chunks.length}.` - ); + const chunks: string[] = resp.body.toString().split('\n'); - const lastChunk = chunks.pop(); - expect(lastChunk).to.be(''); + expect(chunks.length).to.eql( + testData.expected.chunksLengthGroupOnly, + `Expected 'chunksLength' to be ${testData.expected.chunksLengthGroupOnly}, got ${chunks.length}.` + ); - let data: any[] = []; + const lastChunk = chunks.pop(); + expect(lastChunk).to.be(''); - expect(() => { - data = chunks.map((c) => JSON.parse(c)); - }).not.to.throwError(); + let data: any[] = []; - await assertAnalysisResult(data); - } + expect(() => { + data = chunks.map((c) => JSON.parse(c)); + }).not.to.throwError(); - it('should return group only data without streaming with compression with flushFix', async () => { - await requestWithoutStreaming({ ...testData.requestBody, overrides }); - }); + await assertAnalysisResult(data); + } - it('should return group only data without streaming with compression without flushFix', async () => { - await requestWithoutStreaming({ ...testData.requestBody, overrides, flushFix: false }); - }); + it('should return group only data without streaming with compression with flushFix', async () => { + await requestWithoutStreaming({ ...testData.requestBody, overrides }); + }); - it('should return group only data without streaming without compression with flushFix', async () => { - await requestWithoutStreaming({ - ...testData.requestBody, - overrides, - compressResponse: false, + it('should return group only data without streaming with compression without flushFix', async () => { + await requestWithoutStreaming({ + ...testData.requestBody, + overrides, + flushFix: false, + }); }); - }); - it('should return group only data without streaming without compression without flushFix', async () => { - await requestWithoutStreaming({ - ...testData.requestBody, - overrides, - compressResponse: false, - flushFix: false, + it('should return group only data without streaming without compression with flushFix', async () => { + await requestWithoutStreaming({ + ...testData.requestBody, + overrides, + compressResponse: false, + }); }); - }); - async function requestWithStreaming(body: AiopsApiLogRateAnalysis['body']) { - const resp = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - [ELASTIC_HTTP_VERSION_HEADER]: '1', - 'kbn-xsrf': 'stream', - }, - body: JSON.stringify(body), + it('should return group only data without streaming without compression without flushFix', async () => { + await requestWithoutStreaming({ + ...testData.requestBody, + overrides, + compressResponse: false, + flushFix: false, + }); }); - // compression is on by default so if the request body is undefined - // the response header should include "gzip" and otherwise be "null" - if (body.compressResponse === undefined) { - expect(resp.headers.get('content-encoding')).to.be('gzip'); - } else if (body.compressResponse === false) { - expect(resp.headers.get('content-encoding')).to.be(null); - } + async function requestWithStreaming(body: AiopsLogRateAnalysisSchema) { + const resp = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + [ELASTIC_HTTP_VERSION_HEADER]: apiVersion, + 'kbn-xsrf': 'stream', + }, + body: JSON.stringify(body), + }); + + // compression is on by default so if the request body is undefined + // the response header should include "gzip" and otherwise be "null" + if (body.compressResponse === undefined) { + expect(resp.headers.get('content-encoding')).to.be('gzip'); + } else if (body.compressResponse === false) { + expect(resp.headers.get('content-encoding')).to.be(null); + } - expect(resp.ok).to.be(true); - expect(resp.status).to.be(200); + expect(resp.ok).to.be(true); + expect(resp.status).to.be(200); - const stream = resp.body; + const stream = resp.body; - expect(stream).not.to.be(null); + expect(stream).not.to.be(null); - if (stream !== null) { - const data: any[] = []; - let chunkCounter = 0; - const parseStreamCallback = (c: number) => (chunkCounter = c); + if (stream !== null) { + const data: any[] = []; + let chunkCounter = 0; + const parseStreamCallback = (c: number) => (chunkCounter = c); - for await (const action of parseStream(stream, parseStreamCallback)) { - expect(action.type).not.to.be('error'); - data.push(action); - } + for await (const action of parseStream(stream, parseStreamCallback)) { + expect(action.type).not.to.be('error'); + data.push(action); + } - // Originally we assumed that we can assert streaming in contrast - // to non-streaming if there is more than one chunk. However, - // this turned out to be flaky since a stream could finish fast - // enough to contain only one chunk. So now we are checking if - // there's just one chunk or more. - expect(chunkCounter).to.be.greaterThan( - 0, - `Expected 'chunkCounter' to be greater than 0, got ${chunkCounter}.` - ); + // Originally we assumed that we can assert streaming in contrast + // to non-streaming if there is more than one chunk. However, + // this turned out to be flaky since a stream could finish fast + // enough to contain only one chunk. So now we are checking if + // there's just one chunk or more. + expect(chunkCounter).to.be.greaterThan( + 0, + `Expected 'chunkCounter' to be greater than 0, got ${chunkCounter}.` + ); - await assertAnalysisResult(data); + await assertAnalysisResult(data); + } } - } - it('should return group only in chunks with streaming with compression with flushFix', async () => { - await requestWithStreaming({ ...testData.requestBody, overrides }); - }); + it('should return group only in chunks with streaming with compression with flushFix', async () => { + await requestWithStreaming({ ...testData.requestBody, overrides }); + }); - it('should return group only in chunks with streaming with compression without flushFix', async () => { - await requestWithStreaming({ ...testData.requestBody, overrides, flushFix: false }); - }); + it('should return group only in chunks with streaming with compression without flushFix', async () => { + await requestWithStreaming({ ...testData.requestBody, overrides, flushFix: false }); + }); - it('should return group only in chunks with streaming without compression with flushFix', async () => { - await requestWithStreaming({ - ...testData.requestBody, - overrides, - compressResponse: false, + it('should return group only in chunks with streaming without compression with flushFix', async () => { + await requestWithStreaming({ + ...testData.requestBody, + overrides, + compressResponse: false, + }); }); - }); - it('should return group only in chunks with streaming without compression without flushFix', async () => { - await requestWithStreaming({ - ...testData.requestBody, - overrides, - compressResponse: false, - flushFix: false, + it('should return group only in chunks with streaming without compression without flushFix', async () => { + await requestWithStreaming({ + ...testData.requestBody, + overrides, + compressResponse: false, + flushFix: false, + }); }); }); }); diff --git a/x-pack/test/api_integration/apis/aiops/log_rate_analysis_no_index.ts b/x-pack/test/api_integration/apis/aiops/log_rate_analysis_no_index.ts index 088db66e082bd..118cae10c0c9d 100644 --- a/x-pack/test/api_integration/apis/aiops/log_rate_analysis_no_index.ts +++ b/x-pack/test/api_integration/apis/aiops/log_rate_analysis_no_index.ts @@ -10,53 +10,56 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; -import { logRateAnalysisTestData } from './test_data'; +import { getLogRateAnalysisTestData, API_VERSIONS } from './test_data'; +import { getErrorActions } from './test_helpers'; export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); describe('POST /internal/aiops/log_rate_analysis - no index', () => { - logRateAnalysisTestData.forEach((testData) => { - describe(`with ${testData.testName}`, () => { - it('should return an error for non existing index without streaming', async () => { - const resp = await supertest - .post(`/internal/aiops/log_rate_analysis`) - .set('kbn-xsrf', 'kibana') - .set(ELASTIC_HTTP_VERSION_HEADER, '1') - .send({ - ...testData.requestBody, - index: 'does_not_exist', - }) - .expect(200); + API_VERSIONS.forEach((apiVersion) => { + getLogRateAnalysisTestData().forEach((testData) => { + describe(`with v${apiVersion} - ${testData.testName}`, () => { + it('should return an error for non existing index without streaming', async () => { + const resp = await supertest + .post(`/internal/aiops/log_rate_analysis`) + .set('kbn-xsrf', 'kibana') + .set(ELASTIC_HTTP_VERSION_HEADER, apiVersion) + .send({ + ...testData.requestBody, + index: 'does_not_exist', + }) + .expect(200); - const chunks: string[] = resp.body.toString().split('\n'); + const chunks: string[] = resp.body.toString().split('\n'); - expect(chunks.length).to.eql( - testData.expected.noIndexChunksLength, - `Expected 'noIndexChunksLength' to be ${testData.expected.noIndexChunksLength}, got ${chunks.length}.` - ); + expect(chunks.length).to.eql( + testData.expected.noIndexChunksLength, + `Expected 'noIndexChunksLength' to be ${testData.expected.noIndexChunksLength}, got ${chunks.length}.` + ); - const lastChunk = chunks.pop(); - expect(lastChunk).to.be(''); + const lastChunk = chunks.pop(); + expect(lastChunk).to.be(''); - let data: any[] = []; + let data: any[] = []; - expect(() => { - data = chunks.map((c) => JSON.parse(c)); - }).not.to.throwError(); + expect(() => { + data = chunks.map((c) => JSON.parse(c)); + }).not.to.throwError(); - expect(data.length).to.eql( - testData.expected.noIndexActionsLength, - `Expected 'noIndexActionsLength' to be ${testData.expected.noIndexActionsLength}, got ${data.length}.` - ); - data.forEach((d) => { - expect(typeof d.type).to.be('string'); - }); + expect(data.length).to.eql( + testData.expected.noIndexActionsLength, + `Expected 'noIndexActionsLength' to be ${testData.expected.noIndexActionsLength}, got ${data.length}.` + ); + data.forEach((d) => { + expect(typeof d.type).to.be('string'); + }); - const errorActions = data.filter((d) => d.type === testData.expected.errorFilter); - expect(errorActions.length).to.be(1); + const errorActions = getErrorActions(data); + expect(errorActions.length).to.be(1); - expect(errorActions[0].payload).to.be('Failed to fetch index information.'); + expect(errorActions[0].payload).to.be('Failed to fetch index information.'); + }); }); }); }); diff --git a/x-pack/test/api_integration/apis/aiops/test_data.ts b/x-pack/test/api_integration/apis/aiops/test_data.ts index 184925310940e..f323900e3437c 100644 --- a/x-pack/test/api_integration/apis/aiops/test_data.ts +++ b/x-pack/test/api_integration/apis/aiops/test_data.ts @@ -13,9 +13,16 @@ import { significantLogPatterns as artificialLogSignificantLogPatterns } from '@ import { finalSignificantTermGroups as artificialLogsSignificantTermGroups } from '@kbn/aiops-plugin/common/__mocks__/artificial_logs/final_significant_term_groups'; import { finalSignificantTermGroupsTextfield as artificialLogsSignificantTermGroupsTextfield } from '@kbn/aiops-plugin/common/__mocks__/artificial_logs/final_significant_term_groups_textfield'; +import type { + AiopsLogRateAnalysisSchema, + AiopsLogRateAnalysisApiVersion as ApiVersion, +} from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema'; + import type { TestData } from './types'; -export const logRateAnalysisTestData: TestData[] = [ +export const API_VERSIONS: ApiVersion[] = ['1', '2']; + +export const getLogRateAnalysisTestData = (): Array> => [ { testName: 'ecommerce', esArchive: 'x-pack/test/functional/es_archives/ml/ecommerce', @@ -30,7 +37,7 @@ export const logRateAnalysisTestData: TestData[] = [ start: 0, timeFieldName: 'order_date', grouping: true, - }, + } as AiopsLogRateAnalysisSchema, expected: { chunksLength: 35, chunksLengthGroupOnly: 5, @@ -38,11 +45,6 @@ export const logRateAnalysisTestData: TestData[] = [ actionsLengthGroupOnly: 4, noIndexChunksLength: 4, noIndexActionsLength: 3, - significantTermFilter: 'add_significant_terms', - groupFilter: 'add_significant_terms_group', - groupHistogramFilter: 'add_significant_terms_group_histogram', - histogramFilter: 'add_significant_terms_histogram', - errorFilter: 'add_error', significantTerms: [ { key: 'day_of_week:Thursday', @@ -89,7 +91,7 @@ export const logRateAnalysisTestData: TestData[] = [ deviationMin: 1668855600000, deviationMax: 1668924000000, grouping: true, - }, + } as AiopsLogRateAnalysisSchema, expected: { chunksLength: 27, chunksLengthGroupOnly: 11, @@ -97,11 +99,6 @@ export const logRateAnalysisTestData: TestData[] = [ actionsLengthGroupOnly: 10, noIndexChunksLength: 4, noIndexActionsLength: 3, - significantTermFilter: 'add_significant_terms', - groupFilter: 'add_significant_terms_group', - groupHistogramFilter: 'add_significant_terms_group_histogram', - histogramFilter: 'add_significant_terms_histogram', - errorFilter: 'add_error', significantTerms: artificialLogSignificantTerms, groups: artificialLogsSignificantTermGroups, histogramLength: 20, @@ -121,7 +118,7 @@ export const logRateAnalysisTestData: TestData[] = [ deviationMin: 1668855600000, deviationMax: 1668924000000, grouping: true, - }, + } as AiopsLogRateAnalysisSchema, expected: { chunksLength: 30, chunksLengthGroupOnly: 11, @@ -129,11 +126,6 @@ export const logRateAnalysisTestData: TestData[] = [ actionsLengthGroupOnly: 10, noIndexChunksLength: 4, noIndexActionsLength: 3, - significantTermFilter: 'add_significant_terms', - groupFilter: 'add_significant_terms_group', - groupHistogramFilter: 'add_significant_terms_group_histogram', - histogramFilter: 'add_significant_terms_histogram', - errorFilter: 'add_error', significantTerms: [...artificialLogSignificantTerms, ...artificialLogSignificantLogPatterns], groups: artificialLogsSignificantTermGroupsTextfield, histogramLength: 20, @@ -153,7 +145,7 @@ export const logRateAnalysisTestData: TestData[] = [ deviationMin: 1668769200000, deviationMax: 1668837600000, grouping: true, - }, + } as AiopsLogRateAnalysisSchema, expected: { chunksLength: 27, chunksLengthGroupOnly: 11, @@ -161,11 +153,6 @@ export const logRateAnalysisTestData: TestData[] = [ actionsLengthGroupOnly: 10, noIndexChunksLength: 4, noIndexActionsLength: 3, - significantTermFilter: 'add_significant_terms', - groupFilter: 'add_significant_terms_group', - groupHistogramFilter: 'add_significant_terms_group_histogram', - histogramFilter: 'add_significant_terms_histogram', - errorFilter: 'add_error', significantTerms: artificialLogSignificantTerms, groups: artificialLogsSignificantTermGroups, histogramLength: 20, @@ -185,7 +172,7 @@ export const logRateAnalysisTestData: TestData[] = [ deviationMin: 1668769200000, deviationMax: 1668837600000, grouping: true, - }, + } as AiopsLogRateAnalysisSchema, expected: { chunksLength: 30, chunksLengthGroupOnly: 11, @@ -193,11 +180,6 @@ export const logRateAnalysisTestData: TestData[] = [ actionsLengthGroupOnly: 10, noIndexChunksLength: 4, noIndexActionsLength: 3, - significantTermFilter: 'add_significant_terms', - groupFilter: 'add_significant_terms_group', - groupHistogramFilter: 'add_significant_terms_group_histogram', - histogramFilter: 'add_significant_terms_histogram', - errorFilter: 'add_error', significantTerms: [...artificialLogSignificantTerms, ...artificialLogSignificantLogPatterns], groups: artificialLogsSignificantTermGroupsTextfield, histogramLength: 20, diff --git a/x-pack/test/api_integration/apis/aiops/test_helpers.ts b/x-pack/test/api_integration/apis/aiops/test_helpers.ts new file mode 100644 index 0000000000000..3818b96b9bbe1 --- /dev/null +++ b/x-pack/test/api_integration/apis/aiops/test_helpers.ts @@ -0,0 +1,38 @@ +/* + * 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 type { AiopsLogRateAnalysisApiVersion as ApiVersion } from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema'; + +export const getAddSignificationItemsActions = (data: any[], apiVersion: ApiVersion) => + data.filter( + (d) => d.type === (apiVersion === '1' ? 'add_significant_terms' : 'add_significant_items') + ); + +export const getHistogramActions = (data: any[], apiVersion: ApiVersion) => + data.filter( + (d) => + d.type === + (apiVersion === '1' ? 'add_significant_terms_histogram' : 'add_significant_items_histogram') + ); + +export const getGroupActions = (data: any[], apiVersion: ApiVersion) => + data.filter( + (d) => + d.type === + (apiVersion === '1' ? 'add_significant_terms_group' : 'add_significant_items_group') + ); + +export const getGroupHistogramActions = (data: any[], apiVersion: ApiVersion) => + data.filter( + (d) => + d.type === + (apiVersion === '1' + ? 'add_significant_terms_group_histogram' + : 'add_significant_items_group_histogram') + ); + +export const getErrorActions = (data: any[]) => data.filter((d) => d.type === 'add_error'); diff --git a/x-pack/test/api_integration/apis/aiops/types.ts b/x-pack/test/api_integration/apis/aiops/types.ts index c4e9eb8191108..a990b1a346c07 100644 --- a/x-pack/test/api_integration/apis/aiops/types.ts +++ b/x-pack/test/api_integration/apis/aiops/types.ts @@ -5,16 +5,19 @@ * 2.0. */ -import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api'; +import type { + AiopsLogRateAnalysisSchema, + AiopsLogRateAnalysisApiVersion as ApiVersion, +} from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema'; import type { SignificantTerm, SignificantTermGroup } from '@kbn/ml-agg-utils'; import type { LogRateAnalysisDataGenerator } from '../../../functional/services/aiops/log_rate_analysis_data_generator'; -export interface TestData { +export interface TestData { testName: string; esArchive?: string; dataGenerator?: LogRateAnalysisDataGenerator; - requestBody: AiopsApiLogRateAnalysis['body']; + requestBody: AiopsLogRateAnalysisSchema; expected: { chunksLength: number; chunksLengthGroupOnly: number; @@ -22,11 +25,6 @@ export interface TestData { actionsLengthGroupOnly: number; noIndexChunksLength: number; noIndexActionsLength: number; - significantTermFilter: 'add_significant_terms'; - groupFilter: 'add_significant_terms_group'; - groupHistogramFilter: 'add_significant_terms_group_histogram'; - histogramFilter: 'add_significant_terms_histogram'; - errorFilter: 'add_error'; significantTerms: SignificantTerm[]; groups: SignificantTermGroup[]; histogramLength: number; diff --git a/x-pack/test/api_integration_basic/apis/aiops/permissions.ts b/x-pack/test/api_integration_basic/apis/aiops/permissions.ts index 3a42d1e99d1a6..a77d9a634418e 100644 --- a/x-pack/test/api_integration_basic/apis/aiops/permissions.ts +++ b/x-pack/test/api_integration_basic/apis/aiops/permissions.ts @@ -11,50 +11,59 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import expect from '@kbn/expect'; -import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api'; +import type { + AiopsLogRateAnalysisSchema, + AiopsLogRateAnalysisApiVersion as ApiVersion, +} from '@kbn/aiops-plugin/common/api/log_rate_analysis/schema'; import type { FtrProviderContext } from '../../ftr_provider_context'; +const API_VERSIONS: ApiVersion[] = ['1', '2']; + export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const config = getService('config'); const kibanaServerUrl = formatUrl(config.get('servers.kibana')); - const requestBody: AiopsApiLogRateAnalysis['body'] = { - baselineMax: 1561719083292, - baselineMin: 1560954147006, - deviationMax: 1562254538692, - deviationMin: 1561986810992, - end: 2147483647000, - index: 'ft_ecommerce', - searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', - start: 0, - timeFieldName: 'order_date', - }; - describe('POST /internal/aiops/log_rate_analysis', () => { - it('should return permission denied without streaming', async () => { - await supertest - .post(`/internal/aiops/log_rate_analysis`) - .set('kbn-xsrf', 'kibana') - .set(ELASTIC_HTTP_VERSION_HEADER, '1') - .send(requestBody) - .expect(403); - }); + API_VERSIONS.forEach((apiVersion) => { + describe(`with API v${apiVersion}`, () => { + const requestBody: AiopsLogRateAnalysisSchema = { + baselineMax: 1561719083292, + baselineMin: 1560954147006, + deviationMax: 1562254538692, + deviationMin: 1561986810992, + end: 2147483647000, + index: 'ft_ecommerce', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', + start: 0, + timeFieldName: 'order_date', + }; - it('should return permission denied with streaming', async () => { - const response = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'kbn-xsrf': 'stream', - [ELASTIC_HTTP_VERSION_HEADER]: '1', - }, - body: JSON.stringify(requestBody), - }); + it('should return permission denied without streaming', async () => { + await supertest + .post(`/internal/aiops/log_rate_analysis`) + .set('kbn-xsrf', 'kibana') + .set(ELASTIC_HTTP_VERSION_HEADER, apiVersion) + .send(requestBody) + .expect(403); + }); + + it('should return permission denied with streaming', async () => { + const response = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'kbn-xsrf': 'stream', + [ELASTIC_HTTP_VERSION_HEADER]: apiVersion, + }, + body: JSON.stringify(requestBody), + }); - expect(response.ok).to.be(false); - expect(response.status).to.be(403); + expect(response.ok).to.be(false); + expect(response.status).to.be(403); + }); + }); }); }); }; From e3f339c60014d567365ce42231fb5a0be1710e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?= Date: Fri, 10 Nov 2023 14:08:14 +0100 Subject: [PATCH 33/51] [Defend Workflows] Enable Artifacts cy tests against serverless (#170977) ## Summary Enables _Artifact tabs in Policy details_ and _Artifacts_ cypress tests against serverless. Or at least the test cases that has `ALL` privilege (or `NONE` for the _Artifacts_ tests), because there are no such roles in serverless environment that have: - read privilege for policy, but no privilege for artifacts, - read privilege for artifacts Additionally, - `@skipInServerless` tag is added, - the two tests use the usual `indexEndpointHosts()` to have mocked data, - and the old `loadEndpointDataForEventFiltersIfNeeded()` is deleted --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/management/cypress/README.md | 1 + .../cypress/cypress_serverless.config.ts | 2 +- .../artifact_tabs_in_policy_details.cy.ts | 106 +++++++++++------- .../e2e/artifacts/artifacts_mocked_data.cy.ts | 87 ++++++++------ .../cypress/tasks/load_endpoint_data.ts | 28 ----- 5 files changed, 122 insertions(+), 102 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/management/cypress/tasks/load_endpoint_data.ts diff --git a/x-pack/plugins/security_solution/public/management/cypress/README.md b/x-pack/plugins/security_solution/public/management/cypress/README.md index 65af201662c48..79689e650faea 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/README.md +++ b/x-pack/plugins/security_solution/public/management/cypress/README.md @@ -36,6 +36,7 @@ Similarly to Security Solution cypress tests, we use tags in order to select whi - `@serverless` includes a test in the Serverless test suite. You need to explicitly add this tag to any test you want to run against a Serverless environment. - `@ess` includes a test in the normal, non-Serverless test suite. You need to explicitly add this tag to any test you want to run against a non-Serverless environment. - `@brokenInServerless` excludes a test from the Serverless test suite (even if it's tagged as `@serverless`). Indicates that a test should run in Serverless, but currently is broken. +- `@skipInServerless` excludes a test from the Serverless test suite (even if it's tagged as `@serverless`). Indicates that we don't want to run the given test in Serverless. Important: if you don't provide any tag, your test won't be executed. diff --git a/x-pack/plugins/security_solution/public/management/cypress/cypress_serverless.config.ts b/x-pack/plugins/security_solution/public/management/cypress/cypress_serverless.config.ts index 35dda2bd68501..77507e12fae87 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/cypress_serverless.config.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/cypress_serverless.config.ts @@ -14,7 +14,7 @@ export default defineCypressConfig( env: { IS_SERVERLESS: true, - grepTags: '@serverless --@brokenInServerless', + grepTags: '@serverless --@brokenInServerless --@skipInServerless', }, }) ); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts index 5988b73852af5..b6040691c485f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifact_tabs_in_policy_details.cy.ts @@ -16,9 +16,10 @@ import { removeExceptionsList, yieldFirstPolicyID, } from '../../tasks/artifacts'; -import { loadEndpointDataForEventFiltersIfNeeded } from '../../tasks/load_endpoint_data'; import { login, ROLE } from '../../tasks/login'; import { performUserActions } from '../../tasks/perform_user_actions'; +import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; +import type { ReturnTypeFromChainable } from '../../types'; const loginWithPrivilegeAll = () => { login(ROLE.endpoint_policy_manager); @@ -58,15 +59,20 @@ const visitArtifactTab = (tabId: string) => { cy.get(`#${tabId}`).click(); }; -describe('Artifact tabs in Policy Details page', { tags: ['@ess'] }, () => { +describe('Artifact tabs in Policy Details page', { tags: ['@ess', '@serverless'] }, () => { + let endpointData: ReturnTypeFromChainable | undefined; + before(() => { - login(); - loadEndpointDataForEventFiltersIfNeeded(); + indexEndpointHosts().then((indexEndpoints) => { + endpointData = indexEndpoints; + }); }); after(() => { - login(); removeAllArtifacts(); + + endpointData?.cleanup(); + endpointData = undefined; }); for (const testData of getArtifactsListTestsData()) { @@ -76,22 +82,32 @@ describe('Artifact tabs in Policy Details page', { tags: ['@ess'] }, () => { removeExceptionsList(testData.createRequestBody.list_id); }); - it(`[NONE] User cannot see the tab for ${testData.title}`, () => { - loginWithPrivilegeNone(testData.privilegePrefix); - visitPolicyDetailsPage(); + it( + `[NONE] User cannot see the tab for ${testData.title}`, + // there is no such role in Serverless environment that can read policy but cannot read artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithPrivilegeNone(testData.privilegePrefix); + visitPolicyDetailsPage(); - cy.get(`#${testData.tabId}`).should('not.exist'); - }); + cy.get(`#${testData.tabId}`).should('not.exist'); + } + ); context(`Given there are no ${testData.title} entries`, () => { - it(`[READ] User CANNOT add ${testData.title} artifact`, () => { - loginWithPrivilegeRead(testData.privilegePrefix); - visitArtifactTab(testData.tabId); + it( + `[READ] User CANNOT add ${testData.title} artifact`, + // there is no such role in Serverless environment that only reads artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithPrivilegeRead(testData.privilegePrefix); + visitArtifactTab(testData.tabId); - cy.getByTestSubj('policy-artifacts-empty-unexisting').should('exist'); + cy.getByTestSubj('policy-artifacts-empty-unexisting').should('exist'); - cy.getByTestSubj('unexisting-manage-artifacts-button').should('not.exist'); - }); + cy.getByTestSubj('unexisting-manage-artifacts-button').should('not.exist'); + } + ); it(`[ALL] User can add ${testData.title} artifact`, () => { loginWithPrivilegeAll(); @@ -129,15 +145,20 @@ describe('Artifact tabs in Policy Details page', { tags: ['@ess'] }, () => { createPerPolicyArtifact(testData.artifactName, testData.createRequestBody); }); - it(`[READ] User CANNOT Manage or Assign ${testData.title} artifacts`, () => { - loginWithPrivilegeRead(testData.privilegePrefix); - visitArtifactTab(testData.tabId); + it( + `[READ] User CANNOT Manage or Assign ${testData.title} artifacts`, + // there is no such role in Serverless environment that only reads artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithPrivilegeRead(testData.privilegePrefix); + visitArtifactTab(testData.tabId); - cy.getByTestSubj('policy-artifacts-empty-unassigned').should('exist'); + cy.getByTestSubj('policy-artifacts-empty-unassigned').should('exist'); - cy.getByTestSubj('unassigned-manage-artifacts-button').should('not.exist'); - cy.getByTestSubj('unassigned-assign-artifacts-button').should('not.exist'); - }); + cy.getByTestSubj('unassigned-manage-artifacts-button').should('not.exist'); + cy.getByTestSubj('unassigned-assign-artifacts-button').should('not.exist'); + } + ); it(`[ALL] User can Manage and Assign ${testData.title} artifacts`, () => { loginWithPrivilegeAll(); @@ -173,23 +194,28 @@ describe('Artifact tabs in Policy Details page', { tags: ['@ess'] }, () => { }); }); - it(`[READ] User can see ${testData.title} artifacts but CANNOT assign or remove from policy`, () => { - loginWithPrivilegeRead(testData.privilegePrefix); - visitArtifactTab(testData.tabId); - - // List of artifacts - cy.getByTestSubj('artifacts-collapsed-list-card').should('have.length', 1); - cy.getByTestSubj('artifacts-collapsed-list-card-header-titleHolder').contains( - testData.artifactName - ); - - // Cannot assign artifacts - cy.getByTestSubj('artifacts-assign-button').should('not.exist'); - - // Cannot remove from policy - cy.getByTestSubj('artifacts-collapsed-list-card-header-actions-button').click(); - cy.getByTestSubj('remove-from-policy-action').should('not.exist'); - }); + it( + `[READ] User can see ${testData.title} artifacts but CANNOT assign or remove from policy`, + // there is no such role in Serverless environment that only reads artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithPrivilegeRead(testData.privilegePrefix); + visitArtifactTab(testData.tabId); + + // List of artifacts + cy.getByTestSubj('artifacts-collapsed-list-card').should('have.length', 1); + cy.getByTestSubj('artifacts-collapsed-list-card-header-titleHolder').contains( + testData.artifactName + ); + + // Cannot assign artifacts + cy.getByTestSubj('artifacts-assign-button').should('not.exist'); + + // Cannot remove from policy + cy.getByTestSubj('artifacts-collapsed-list-card-header-actions-button').click(); + cy.getByTestSubj('remove-from-policy-action').should('not.exist'); + } + ); it(`[ALL] User can see ${testData.title} artifacts and can assign or remove artifacts from policy`, () => { loginWithPrivilegeAll(); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts index 807502f93880c..e7f32820c00d7 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts @@ -12,7 +12,8 @@ import { loadPage } from '../../tasks/common'; import { getArtifactsListTestsData } from '../../fixtures/artifacts_page'; import { removeAllArtifacts } from '../../tasks/artifacts'; import { performUserActions } from '../../tasks/perform_user_actions'; -import { loadEndpointDataForEventFiltersIfNeeded } from '../../tasks/load_endpoint_data'; +import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; +import type { ReturnTypeFromChainable } from '../../types'; const loginWithWriteAccess = (url: string) => { login(ROLE.endpoint_policy_manager); @@ -30,17 +31,22 @@ const loginWithoutAccess = (url: string) => { loadPage(url); }; -describe('Artifacts pages', { tags: ['@ess'] }, () => { +describe('Artifacts pages', { tags: ['@ess', '@serverless'] }, () => { + let endpointData: ReturnTypeFromChainable | undefined; + before(() => { - login(); - loadEndpointDataForEventFiltersIfNeeded(); - // Clean artifacts data + indexEndpointHosts().then((indexEndpoints) => { + endpointData = indexEndpoints; + }); + removeAllArtifacts(); }); after(() => { - // Clean artifacts data removeAllArtifacts(); + + endpointData?.cleanup(); + endpointData = undefined; }); for (const testData of getArtifactsListTestsData()) { @@ -53,14 +59,19 @@ describe('Artifacts pages', { tags: ['@ess'] }, () => { cy.getByTestSubj(`${testData.pagePrefix}-emptyState-addButton`).should('not.exist'); }); - it(`read - should show empty state page if there is no ${testData.title} entry and the add button does not exist`, () => { - loginWithReadAccess( - testData.privilegePrefix, - `/app/security/administration/${testData.urlPath}` - ); - cy.getByTestSubj(testData.emptyState).should('exist'); - cy.getByTestSubj(`${testData.pagePrefix}-emptyState-addButton`).should('not.exist'); - }); + it( + `read - should show empty state page if there is no ${testData.title} entry and the add button does not exist`, + // there is no such role in Serverless environment that only reads artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithReadAccess( + testData.privilegePrefix, + `/app/security/administration/${testData.urlPath}` + ); + cy.getByTestSubj(testData.emptyState).should('exist'); + cy.getByTestSubj(`${testData.pagePrefix}-emptyState-addButton`).should('not.exist'); + } + ); it(`write - should show empty state page if there is no ${testData.title} entry and the add button exists`, () => { loginWithWriteAccess(`/app/security/administration/${testData.urlPath}`); @@ -87,25 +98,35 @@ describe('Artifacts pages', { tags: ['@ess'] }, () => { cy.getByTestSubj('header-page-title').contains(testData.title); }); - it(`read - should not be able to update/delete an existing ${testData.title} entry`, () => { - loginWithReadAccess( - testData.privilegePrefix, - `/app/security/administration/${testData.urlPath}` - ); - cy.getByTestSubj('header-page-title').contains(testData.title); - cy.getByTestSubj(`${testData.pagePrefix}-card-header-actions-button`).should('not.exist'); - cy.getByTestSubj(`${testData.pagePrefix}-card-cardEditAction`).should('not.exist'); - cy.getByTestSubj(`${testData.pagePrefix}-card-cardDeleteAction`).should('not.exist'); - }); - - it(`read - should not be able to create a new ${testData.title} entry`, () => { - loginWithReadAccess( - testData.privilegePrefix, - `/app/security/administration/${testData.urlPath}` - ); - cy.getByTestSubj('header-page-title').contains(testData.title); - cy.getByTestSubj(`${testData.pagePrefix}-pageAddButton`).should('not.exist'); - }); + it( + `read - should not be able to update/delete an existing ${testData.title} entry`, + // there is no such role in Serverless environment that only reads artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithReadAccess( + testData.privilegePrefix, + `/app/security/administration/${testData.urlPath}` + ); + cy.getByTestSubj('header-page-title').contains(testData.title); + cy.getByTestSubj(`${testData.pagePrefix}-card-header-actions-button`).should('not.exist'); + cy.getByTestSubj(`${testData.pagePrefix}-card-cardEditAction`).should('not.exist'); + cy.getByTestSubj(`${testData.pagePrefix}-card-cardDeleteAction`).should('not.exist'); + } + ); + + it( + `read - should not be able to create a new ${testData.title} entry`, + // there is no such role in Serverless environment that only reads artifacts + { tags: ['@skipInServerless'] }, + () => { + loginWithReadAccess( + testData.privilegePrefix, + `/app/security/administration/${testData.urlPath}` + ); + cy.getByTestSubj('header-page-title').contains(testData.title); + cy.getByTestSubj(`${testData.pagePrefix}-pageAddButton`).should('not.exist'); + } + ); it(`write - should be able to update an existing ${testData.title} entry`, () => { loginWithWriteAccess(`/app/security/administration/${testData.urlPath}`); diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/load_endpoint_data.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/load_endpoint_data.ts deleted file mode 100644 index b8029a8528e94..0000000000000 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/load_endpoint_data.ts +++ /dev/null @@ -1,28 +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 { isEmpty } from 'lodash'; -import { BASE_ENDPOINT_ROUTE } from '../../../../common/endpoint/constants'; -import { runEndpointLoaderScript } from './run_endpoint_loader'; -import { request } from './common'; - -// Checks for Endpoint data and creates it if needed -export const loadEndpointDataForEventFiltersIfNeeded = () => { - request({ - method: 'POST', - url: `${BASE_ENDPOINT_ROUTE}/suggestions/eventFilters`, - body: { - field: 'agent.type', - query: '', - }, - failOnStatusCode: false, - }).then(({ body }) => { - if (isEmpty(body)) { - runEndpointLoaderScript(); - } - }); -}; From bc2202df1ae226f97068b4709050741949f35923 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Fri, 10 Nov 2023 07:00:05 -0700 Subject: [PATCH 34/51] [maps] fix expand layer control is not clickable when layers are loading (#170912) Closes https://github.com/elastic/kibana/issues/170911 root problem is that `EuiButton*` components are disabled when passed `isLoading` property. Re-worked component to not pass `isLoading` to `EuiButton*` ### Test instructions 1. create new map 2. click "Collapse layers panel" to collapse layer control 3. open browser dev tools. Open network tab and select "Slow 3G" 4. Pan and zoom map to cause basemap tiles to load. "Expand layers panel" button should be clickable during loading --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../__snapshots__/layer_control.test.tsx.snap | 24 +++-------- .../layer_control/expand_button.tsx | 41 +++++++++++++++++++ .../layer_control/layer_control.tsx | 33 ++------------- 3 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap index 73da1b32f60ec..20395d0674511 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/__snapshots__/layer_control.test.tsx.snap @@ -119,12 +119,8 @@ exports[`LayerControl isLayerTOCOpen Should render expand button 1`] = ` display="inlineBlock" position="left" > - @@ -138,12 +134,8 @@ exports[`LayerControl isLayerTOCOpen Should render expand button with error icon display="inlineBlock" position="left" > - @@ -157,12 +149,8 @@ exports[`LayerControl isLayerTOCOpen Should render expand button with loading ic display="inlineBlock" position="left" > - diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx new file mode 100644 index 0000000000000..f80a84dc6782d --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/expand_button.tsx @@ -0,0 +1,41 @@ +/* + * 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 React from 'react'; +import { EuiButtonEmpty, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +interface Props { + hasErrors: boolean; + isLoading: boolean; + onClick: () => void; +} + +export function ExpandButton({ hasErrors, isLoading, onClick }: Props) { + // isLoading indicates at least one layer is loading. + // Expand button should never be disabled. + // Not using EuiButton* with iconType props because EuiButton* disables button when isLoading prop is true. + return ( + + {isLoading ? ( +
+ +
+ ) : ( + + )} +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx index 7a4e04066b37c..e1c34223483c8 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_control.tsx @@ -7,13 +7,13 @@ import React, { Fragment } from 'react'; import { + EuiButton, + EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiPanel, - EuiButton, EuiTitle, EuiSpacer, - EuiButtonIcon, EuiToolTip, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -21,6 +21,7 @@ import { i18n } from '@kbn/i18n'; import { LayerTOC } from './layer_toc'; import { isScreenshotMode } from '../../../kibana_services'; import { ILayer } from '../../../classes/layers/layer'; +import { ExpandButton } from './expand_button'; export interface Props { isReadOnly: boolean; @@ -35,32 +36,6 @@ export interface Props { zoom: number; } -function renderExpandButton({ - hasErrors, - isLoading, - onClick, -}: { - hasErrors: boolean; - isLoading: boolean; - onClick: () => void; -}) { - const expandLabel = i18n.translate('xpack.maps.layerControl.openLayerTOCButtonAriaLabel', { - defaultMessage: 'Expand layers panel', - }); - - return ( - - ); -} - export function LayerControl({ isReadOnly, isLayerTOCOpen, @@ -92,7 +67,7 @@ export function LayerControl({ })} position="left" > - {renderExpandButton({ hasErrors, isLoading, onClick: openLayerTOC })} + ); } From c078b9157c2eedeb28c7d136fdc584c9189f674f Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Fri, 10 Nov 2023 07:01:16 -0700 Subject: [PATCH 35/51] [discover] do not show old results on error (#170769) Prerequisite for https://github.com/elastic/kibana/issues/167904 ### Test 1. install sample web logs 2. Open discover 3. Select time range that displays results 4. Add filter ``` { "error_query": { "indices": [ { "error_type": "exception", "message": "local shard failure message 123", "name": "kibana_sample_data_logs" } ] } } ``` 5. Verify discover should display `EmptyPrompt` showing error message instead of callout with stale data. Screenshot 2023-11-07 at 9 23 43 AM --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../components/layout/discover_documents.tsx | 14 -- .../components/layout/discover_layout.tsx | 5 +- .../main/utils/get_result_state.test.ts | 23 +-- .../main/utils/get_result_state.ts | 8 +- .../components/common/error_callout.test.tsx | 77 +-------- .../components/common/error_callout.tsx | 151 ++++-------------- .../discover/group1/_discover_histogram.ts | 4 +- .../apps/discover/group1/_errors.ts | 2 +- .../apps/discover/group1/_field_data.ts | 2 +- .../group1/_field_data_with_fields_api.ts | 2 +- .../discover/group2/_data_grid_field_data.ts | 2 +- .../apps/discover/group3/_sidebar.ts | 8 +- .../apps/discover/group3/_view_mode_toggle.ts | 4 +- .../apps/discover/group4/_date_nested.ts | 3 +- .../apps/discover/group4/_esql_view.ts | 4 +- test/functional/page_objects/discover_page.ts | 8 +- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../apps/discover/error_handling.ts | 2 +- .../tests/apps/discover/async_search.ts | 9 +- .../tests/apps/discover/sessions_in_space.ts | 1 - 22 files changed, 78 insertions(+), 257 deletions(-) diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index bf01e2a7b6669..f655af89c0c4c 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -37,7 +37,6 @@ import { SHOW_MULTIFIELDS, SORT_DEFAULT_ORDER_SETTING, } from '@kbn/discover-utils'; -import { i18n } from '@kbn/i18n'; import useObservable from 'react-use/lib/useObservable'; import type { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import { DiscoverGrid } from '../../../../components/discover_grid'; @@ -65,7 +64,6 @@ import { DiscoverGridFlyout } from '../../../../components/discover_grid_flyout' import { getRenderCustomToolbarWithElements } from '../../../../components/discover_grid/render_custom_toolbar'; import { useSavedSearchInitial } from '../../services/discover_state_provider'; import { useFetchMoreRecords } from './use_fetch_more_records'; -import { ErrorCallout } from '../../../../components/common/error_callout'; import { SelectedVSAvailableCallout } from './selected_vs_available_callout'; const containerStyles = css` @@ -256,22 +254,11 @@ function DiscoverDocumentsComponent({ [dataView, onAddColumn, onAddFilter, onRemoveColumn, query, savedSearch.id, setExpandedDoc] ); - const dataState = useDataState(stateContainer.dataState.data$.main$); const documents = useObservable(stateContainer.dataState.data$.documents$); const callouts = useMemo( () => ( <> - {dataState.error && ( - - )} ), [ - dataState.error, isTextBasedQuery, currentColumns, documents?.textBasedQueryColumns, diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index 6461603609903..b2d3a4b5058ee 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -114,8 +114,8 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { const isPlainRecord = useMemo(() => getRawRecordType(query) === RecordRawType.PLAIN, [query]); const resultState = useMemo( - () => getResultState(dataState.fetchStatus, dataState.foundDocuments!, isPlainRecord), - [dataState.fetchStatus, dataState.foundDocuments, isPlainRecord] + () => getResultState(dataState.fetchStatus, dataState.foundDocuments ?? false), + [dataState.fetchStatus, dataState.foundDocuments] ); const onOpenInspector = useInspector({ @@ -338,7 +338,6 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { } )} error={dataState.error} - data-test-subj="discoverNoResultsError" /> ) : ( { - test('fetching uninitialized', () => { + test(`should return 'uninitialized' when fetching uninitialized`, () => { const actual = getResultState(FetchStatus.UNINITIALIZED, false); expect(actual).toBe(resultStatuses.UNINITIALIZED); }); - test('fetching complete with no records', () => { + test(`should return 'loading' when fetching is loading`, () => { + const actual = getResultState(FetchStatus.LOADING, false); + expect(actual).toBe(resultStatuses.LOADING); + }); + + test(`should return 'none' when fetching is complete with no records`, () => { const actual = getResultState(FetchStatus.COMPLETE, false); expect(actual).toBe(resultStatuses.NO_RESULTS); }); - test('fetching ongoing aka loading', () => { - const actual = getResultState(FetchStatus.LOADING, false); - expect(actual).toBe(resultStatuses.LOADING); + test(`should return 'none' after a fetch error`, () => { + const actual = getResultState(FetchStatus.ERROR, false); + expect(actual).toBe(resultStatuses.NO_RESULTS); }); - test('fetching ready', () => { + test(`should return 'ready' when fetching completes with records`, () => { const actual = getResultState(FetchStatus.COMPLETE, true); expect(actual).toBe(resultStatuses.READY); }); - test('re-fetching after already data is available', () => { + test(`should reurn 'ready' when re-fetching after already data is available`, () => { const actual = getResultState(FetchStatus.LOADING, true); expect(actual).toBe(resultStatuses.READY); }); - test('after a fetch error when data was successfully fetched before ', () => { + test(`should return 'none' after a fetch error when data was successfully fetched before`, () => { const actual = getResultState(FetchStatus.ERROR, true); - expect(actual).toBe(resultStatuses.READY); + expect(actual).toBe(resultStatuses.NO_RESULTS); }); }); diff --git a/src/plugins/discover/public/application/main/utils/get_result_state.ts b/src/plugins/discover/public/application/main/utils/get_result_state.ts index ff31e114754ad..8d39707c65f9c 100644 --- a/src/plugins/discover/public/application/main/utils/get_result_state.ts +++ b/src/plugins/discover/public/application/main/utils/get_result_state.ts @@ -18,15 +18,11 @@ export const resultStatuses = { * Returns the current state of the result, depends on fetchStatus and the given fetched rows * Determines what is displayed in Discover main view (loading view, data view, empty data view, ...) */ -export function getResultState( - fetchStatus: FetchStatus, - foundDocuments: boolean = false, - isPlainRecord?: boolean -) { +export function getResultState(fetchStatus: FetchStatus, foundDocuments: boolean = false) { if (fetchStatus === FetchStatus.UNINITIALIZED) { return resultStatuses.UNINITIALIZED; } - if (isPlainRecord && fetchStatus === FetchStatus.ERROR) return resultStatuses.NO_RESULTS; + if (fetchStatus === FetchStatus.ERROR) return resultStatuses.NO_RESULTS; if (!foundDocuments && fetchStatus === FetchStatus.LOADING) return resultStatuses.LOADING; else if (foundDocuments) return resultStatuses.READY; diff --git a/src/plugins/discover/public/components/common/error_callout.test.tsx b/src/plugins/discover/public/components/common/error_callout.test.tsx index ec01af15cd7e2..fd07af1bd548d 100644 --- a/src/plugins/discover/public/components/common/error_callout.test.tsx +++ b/src/plugins/discover/public/components/common/error_callout.test.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { EuiButton, EuiCallOut, EuiEmptyPrompt, EuiLink, EuiModal } from '@elastic/eui'; +import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { findTestSubject } from '@kbn/test-jest-helpers'; import { mount } from 'enzyme'; @@ -37,14 +37,11 @@ describe('ErrorCallout', () => { it('should render', () => { const title = 'Error title'; const error = new Error('My error'); - const wrapper = mountWithServices( - - ); + const wrapper = mountWithServices(); const prompt = wrapper.find(EuiEmptyPrompt); expect(prompt).toHaveLength(1); expect(prompt.prop('title')).toBeDefined(); expect(prompt.prop('title')).not.toBeInstanceOf(String); - expect(prompt.prop('data-test-subj')).toBe('errorCallout'); expect(prompt.prop('body')).toBeDefined(); expect(findTestSubject(prompt, 'discoverErrorCalloutTitle').contains(title)).toBe(true); expect(findTestSubject(prompt, 'discoverErrorCalloutMessage').contains(error.message)).toBe( @@ -53,97 +50,31 @@ describe('ErrorCallout', () => { expect(prompt.find(EuiButton)).toHaveLength(1); }); - it('should render inline', () => { - const title = 'Error title'; - const error = new Error('My error'); - const wrapper = mountWithServices( - - ); - const callout = wrapper.find(EuiCallOut); - expect(callout).toHaveLength(1); - expect(callout.prop('title')).toBeDefined(); - expect(callout.prop('title')).not.toBeInstanceOf(String); - expect(callout.prop('size')).toBe('s'); - expect(callout.prop('data-test-subj')).toBe('errorCallout'); - expect( - findTestSubject(callout, 'discoverErrorCalloutMessage').contains(`${title}: ${error.message}`) - ).toBe(true); - expect(callout.find(EuiLink)).toHaveLength(1); - }); - it('should render with override display', () => { const title = 'Override title'; const error = new Error('My error'); const overrideDisplay =
Override display
; mockGetSearchErrorOverrideDisplay.mockReturnValue({ title, body: overrideDisplay }); - const wrapper = mountWithServices( - - ); + const wrapper = mountWithServices(); const prompt = wrapper.find(EuiEmptyPrompt); expect(prompt).toHaveLength(1); expect(prompt.prop('title')).toBeDefined(); expect(prompt.prop('title')).not.toBeInstanceOf(String); - expect(prompt.prop('data-test-subj')).toBe('errorCallout'); expect(prompt.prop('body')).toBeDefined(); expect(findTestSubject(prompt, 'discoverErrorCalloutTitle').contains(title)).toBe(true); expect(prompt.contains(overrideDisplay)).toBe(true); expect(prompt.find(EuiButton)).toHaveLength(0); }); - it('should render with override display and inline', () => { - const title = 'Override title'; - const error = new Error('My error'); - const overrideDisplay =
Override display
; - mockGetSearchErrorOverrideDisplay.mockReturnValue({ title, body: overrideDisplay }); - const wrapper = mountWithServices( - - ); - const callout = wrapper.find(EuiCallOut); - expect(callout).toHaveLength(1); - expect(callout.prop('title')).toBeDefined(); - expect(callout.prop('title')).not.toBeInstanceOf(String); - expect(callout.prop('size')).toBe('s'); - expect(callout.prop('data-test-subj')).toBe('errorCallout'); - expect(callout.find(EuiLink)).toHaveLength(1); - expect(wrapper.find(EuiModal)).toHaveLength(0); - expect(wrapper.contains(title)).toBe(true); - expect(wrapper.contains(overrideDisplay)).toBe(false); - callout.find(EuiLink).simulate('click'); - expect(wrapper.find(EuiModal)).toHaveLength(1); - expect(findTestSubject(wrapper, 'discoverErrorCalloutOverrideModalTitle').contains(title)).toBe( - true - ); - expect( - findTestSubject(wrapper, 'discoverErrorCalloutOverrideModalBody').contains(overrideDisplay) - ).toBe(true); - expect(wrapper.contains(overrideDisplay)).toBe(true); - }); - it('should call showErrorDialog when the button is clicked', () => { (discoverServiceMock.core.notifications.showErrorDialog as jest.Mock).mockClear(); const title = 'Error title'; const error = new Error('My error'); - const wrapper = mountWithServices( - - ); + const wrapper = mountWithServices(); wrapper.find(EuiButton).find('button').simulate('click'); expect(discoverServiceMock.core.notifications.showErrorDialog).toHaveBeenCalledWith({ title, error, }); }); - - it('should call showErrorDialog when the button is clicked inline', () => { - (discoverServiceMock.core.notifications.showErrorDialog as jest.Mock).mockClear(); - const title = 'Error title'; - const error = new Error('My error'); - const wrapper = mountWithServices( - - ); - wrapper.find(EuiLink).find('button').simulate('click'); - expect(discoverServiceMock.core.notifications.showErrorDialog).toHaveBeenCalledWith({ - title, - error, - }); - }); }); diff --git a/src/plugins/discover/public/components/common/error_callout.tsx b/src/plugins/discover/public/components/common/error_callout.tsx index 84b5b979c0249..1b3e8f02f39a3 100644 --- a/src/plugins/discover/public/components/common/error_callout.tsx +++ b/src/plugins/discover/public/components/common/error_callout.tsx @@ -6,143 +6,58 @@ * Side Public License, v 1. */ -import { - EuiButton, - EuiCallOut, - EuiEmptyPrompt, - EuiLink, - EuiModal, - EuiModalBody, - EuiModalHeader, - EuiModalHeaderTitle, - EuiText, - useEuiTheme, -} from '@elastic/eui'; +import { EuiButton, EuiEmptyPrompt, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; import { getSearchErrorOverrideDisplay } from '@kbn/data-plugin/public'; import { i18n } from '@kbn/i18n'; -import React, { ReactNode, useState } from 'react'; +import React from 'react'; import { useDiscoverServices } from '../../hooks/use_discover_services'; -export interface ErrorCalloutProps { +interface Props { title: string; error: Error; - inline?: boolean; - 'data-test-subj'?: string; } -export const ErrorCallout = ({ - title, - error, - inline, - 'data-test-subj': dataTestSubj, -}: ErrorCalloutProps) => { +export const ErrorCallout = ({ title, error }: Props) => { const { core } = useDiscoverServices(); const { euiTheme } = useEuiTheme(); - const showErrorMessage = i18n.translate('discover.errorCalloutShowErrorMessage', { - defaultMessage: 'View details', - }); - const overrideDisplay = getSearchErrorOverrideDisplay({ error, application: core.application, }); - const [overrideModalOpen, setOverrideModalOpen] = useState(false); - - const showError = overrideDisplay?.body - ? () => setOverrideModalOpen(true) - : () => core.notifications.showErrorDialog({ title, error }); - - let formattedTitle: ReactNode = overrideDisplay?.title || title; - - if (inline) { - const formattedTitleMessage = overrideDisplay - ? formattedTitle - : i18n.translate('discover.errorCalloutFormattedTitle', { - defaultMessage: '{title}: {errorMessage}', - values: { title, errorMessage: error.message }, - }); - - formattedTitle = ( - <> - - {formattedTitleMessage} - - - {showErrorMessage} - - - ); - } - return ( - <> - {inline ? ( - {overrideDisplay?.title ?? title}} + body={ +
- ) : ( - {formattedTitle}} - body={ -
- {overrideDisplay?.body ?? ( - <> -

- {error.message} -

- {showErrorMessage} - - )} -
- } - data-test-subj={dataTestSubj} - /> - )} - {overrideDisplay && overrideModalOpen && ( - setOverrideModalOpen(false)}> - - - {overrideDisplay.title} - - - - - {overrideDisplay.body} - - - - )} - + > + {overrideDisplay?.body ?? ( + <> +

+ {error.message} +

+ core.notifications.showErrorDialog({ title, error })}> + {i18n.translate('discover.errorCalloutShowErrorMessage', { + defaultMessage: 'View details', + })} + + + )} +
+ } + /> ); }; diff --git a/test/functional/apps/discover/group1/_discover_histogram.ts b/test/functional/apps/discover/group1/_discover_histogram.ts index 6e30f75f90a10..d69bd153b3d56 100644 --- a/test/functional/apps/discover/group1/_discover_histogram.ts +++ b/test/functional/apps/discover/group1/_discover_histogram.ts @@ -289,8 +289,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // type an invalid search query, hit refresh await queryBar.setQuery('this is > not valid'); await queryBar.submitQuery(); - // check the error state - expect(await testSubjects.exists('embeddable-lens-failure')).to.be(true); + + await PageObjects.discover.showsErrorCallout(); // now remove the query await queryBar.clearQuery(); diff --git a/test/functional/apps/discover/group1/_errors.ts b/test/functional/apps/discover/group1/_errors.ts index ef68df5b47204..6f0a7ba96b7ad 100644 --- a/test/functional/apps/discover/group1/_errors.ts +++ b/test/functional/apps/discover/group1/_errors.ts @@ -32,7 +32,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('invalid scripted field error', () => { it('is rendered', async () => { - expect(await PageObjects.discover.noResultsErrorVisible()).to.be(true); + await PageObjects.discover.showsErrorCallout(); const painlessStackTrace = await testSubjects.find('painlessStackTrace'); expect(painlessStackTrace).not.to.be(undefined); }); diff --git a/test/functional/apps/discover/group1/_field_data.ts b/test/functional/apps/discover/group1/_field_data.ts index 0125549ead92f..4047cfcdfc45d 100644 --- a/test/functional/apps/discover/group1/_field_data.ts +++ b/test/functional/apps/discover/group1/_field_data.ts @@ -76,7 +76,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'whitespace but "(" found.'; await queryBar.setQuery('xxx(yyy))'); await queryBar.submitQuery(); - expect(await PageObjects.discover.mainErrorVisible()).to.be(true); + await PageObjects.discover.showsErrorCallout(); const message = await PageObjects.discover.getDiscoverErrorMessage(); expect(message).to.contain(expectedError); }); diff --git a/test/functional/apps/discover/group1/_field_data_with_fields_api.ts b/test/functional/apps/discover/group1/_field_data_with_fields_api.ts index e262f3ce30c49..7a21210a78e0c 100644 --- a/test/functional/apps/discover/group1/_field_data_with_fields_api.ts +++ b/test/functional/apps/discover/group1/_field_data_with_fields_api.ts @@ -80,7 +80,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'whitespace but "(" found.'; await queryBar.setQuery('xxx(yyy))'); await queryBar.submitQuery(); - expect(await PageObjects.discover.mainErrorVisible()).to.be(true); + await PageObjects.discover.showsErrorCallout(); const message = await PageObjects.discover.getDiscoverErrorMessage(); expect(message).to.contain(expectedError); }); diff --git a/test/functional/apps/discover/group2/_data_grid_field_data.ts b/test/functional/apps/discover/group2/_data_grid_field_data.ts index 3347f398288a4..f12f378bbf94b 100644 --- a/test/functional/apps/discover/group2/_data_grid_field_data.ts +++ b/test/functional/apps/discover/group2/_data_grid_field_data.ts @@ -91,7 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'whitespace but "(" found.'; await queryBar.setQuery('xxx(yyy))'); await queryBar.submitQuery(); - expect(await PageObjects.discover.mainErrorVisible()).to.be(true); + await PageObjects.discover.showsErrorCallout(); const message = await PageObjects.discover.getDiscoverErrorMessage(); expect(message).to.contain(expectedError); }); diff --git a/test/functional/apps/discover/group3/_sidebar.ts b/test/functional/apps/discover/group3/_sidebar.ts index b47e71f452818..01e357b7f01e6 100644 --- a/test/functional/apps/discover/group3/_sidebar.ts +++ b/test/functional/apps/discover/group3/_sidebar.ts @@ -697,8 +697,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render even when retrieving documents failed with an error', async () => { await PageObjects.header.waitUntilLoadingHasFinished(); - await testSubjects.missingOrFail('discoverNoResultsError'); - expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( INITIAL_FIELD_LIST_SUMMARY ); @@ -708,7 +706,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); // error in fetching documents because of the invalid runtime field - await testSubjects.existOrFail('discoverNoResultsError'); + await PageObjects.discover.showsErrorCallout(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); @@ -721,7 +719,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.refresh(); await PageObjects.header.waitUntilLoadingHasFinished(); - await testSubjects.existOrFail('discoverNoResultsError'); // still has error + await PageObjects.discover.showsErrorCallout(); // still has error // check that the sidebar is rendered event after a refresh await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); @@ -731,8 +729,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.removeField('_invalid-runtimefield'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); - - await testSubjects.missingOrFail('discoverNoResultsError'); }); it('should work correctly when time range is updated', async function () { diff --git a/test/functional/apps/discover/group3/_view_mode_toggle.ts b/test/functional/apps/discover/group3/_view_mode_toggle.ts index c47aad66c9a01..62c78efbc2432 100644 --- a/test/functional/apps/discover/group3/_view_mode_toggle.ts +++ b/test/functional/apps/discover/group3/_view_mode_toggle.ts @@ -79,13 +79,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await queryBar.submitQuery(); await PageObjects.header.waitUntilLoadingHasFinished(); - await testSubjects.existOrFail('discoverMainError'); + await PageObjects.discover.showsErrorCallout(); await queryBar.clearQuery(); await queryBar.submitQuery(); await PageObjects.header.waitUntilLoadingHasFinished(); - await testSubjects.missingOrFail('discoverMainError'); + await testSubjects.missingOrFail('discoverErrorCalloutTitle'); }); it('should show Field Statistics tab', async () => { diff --git a/test/functional/apps/discover/group4/_date_nested.ts b/test/functional/apps/discover/group4/_date_nested.ts index 9760645fe11c7..f761cdacc7fe9 100644 --- a/test/functional/apps/discover/group4/_date_nested.ts +++ b/test/functional/apps/discover/group4/_date_nested.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects(['common', 'timePicker', 'discover']); const security = getService('security'); const kibanaServer = getService('kibanaServer'); @@ -34,7 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show an error message', async function () { await PageObjects.discover.selectIndexPattern('date-nested'); await PageObjects.discover.waitUntilSearchingHasFinished(); - await testSubjects.existOrFail('discoverNoResultsError'); + await PageObjects.discover.showsErrorCallout(); }); }); } diff --git a/test/functional/apps/discover/group4/_esql_view.ts b/test/functional/apps/discover/group4/_esql_view.ts index 773af0d512309..2b6547152970d 100644 --- a/test/functional/apps/discover/group4/_esql_view.ts +++ b/test/functional/apps/discover/group4/_esql_view.ts @@ -135,7 +135,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); describe('errors', () => { - it('should error messages for syntax errors in query', async function () { + it('should show error messages for syntax errors in query', async function () { await PageObjects.discover.selectTextBaseLang(); const brokenQueries = [ 'from logstash-* | limit 10*', @@ -149,7 +149,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); // error in fetching documents because of the invalid query - await testSubjects.existOrFail('discoverNoResultsError'); + await PageObjects.discover.showsErrorCallout(); const message = await testSubjects.getVisibleText('discoverErrorCalloutMessage'); expect(message).to.contain( "[esql] > Couldn't parse Elasticsearch ES|QL query. Check your query and try again." diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index b20e055ea0d6a..47a79132212cc 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -453,12 +453,8 @@ export class DiscoverPageObject extends FtrService { return await this.testSubjects.exists('discoverNoResultsTimefilter'); } - public noResultsErrorVisible() { - return this.testSubjects.exists('discoverNoResultsError'); - } - - public mainErrorVisible() { - return this.testSubjects.exists('discoverMainError'); + public showsErrorCallout() { + return this.testSubjects.existOrFail('discoverErrorCalloutTitle'); } public getDiscoverErrorMessage() { diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 6c64ec463940e..a5ed852718005 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2245,7 +2245,6 @@ "discover.docTable.totalDocuments": "{totalDocuments} documents", "discover.dscTour.stepAddFields.description": "Cliquez sur {plusIcon} pour ajouter les champs qui vous intéressent.", "discover.dscTour.stepExpand.description": "Cliquez sur {expandIcon} pour afficher, comparer et filtrer les documents.", - "discover.errorCalloutFormattedTitle": "{title} : {errorMessage}", "discover.formatHit.moreFields": "et {count} autre(s) {count, plural, one {champ} many {champs} other {champs}}", "discover.howToSeeOtherMatchingDocumentsDescription": "Voici les {sampleSize} premiers documents correspondant à votre recherche. Veuillez affiner cette dernière pour en voir davantage.", "discover.noMatchRoute.bannerText": "L'application Discover ne reconnaît pas cet itinéraire : {route}", @@ -2368,7 +2367,6 @@ "discover.docTable.tableRow.viewSingleDocumentLinkText": "Afficher un seul document", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "Afficher les documents alentour", "discover.documentsAriaLabel": "Documents", - "discover.documentsErrorTitle": "Erreur lors de la recherche", "discover.docViews.table.scoreSortWarningTooltip": "Filtrez sur _score pour pouvoir récupérer les valeurs correspondantes.", "discover.dropZoneTableLabel": "Abandonner la zone pour ajouter un champ en tant que colonne dans la table", "discover.dscTour.stepAddFields.imageAltText": "Dans la liste Champs disponibles, cliquez sur l'icône Plus pour afficher/masquer un champ dans le tableau de documents.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a24d4d8cc7c10..58375f665fa0c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2259,7 +2259,6 @@ "discover.docTable.totalDocuments": "{totalDocuments}ドキュメント", "discover.dscTour.stepAddFields.description": "{plusIcon}をクリックして、関心があるフィールドを追加します。", "discover.dscTour.stepExpand.description": "{expandIcon}をクリックすると、ドキュメントを表示、比較、フィルタリングできます。", - "discover.errorCalloutFormattedTitle": "{title}:{errorMessage}", "discover.formatHit.moreFields": "およびその他{count}個の{count, plural, other {フィールド}}", "discover.howToSeeOtherMatchingDocumentsDescription": "これらは検索条件に一致した初めの{sampleSize}件のドキュメントです。他の結果を表示するには検索条件を絞ってください。", "discover.noMatchRoute.bannerText": "Discoverアプリケーションはこのルートを認識できません:{route}", @@ -2382,7 +2381,6 @@ "discover.docTable.tableRow.viewSingleDocumentLinkText": "単一のドキュメントを表示", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "周りのドキュメントを表示", "discover.documentsAriaLabel": "ドキュメント", - "discover.documentsErrorTitle": "検索エラー", "discover.docViews.table.scoreSortWarningTooltip": "_scoreの値を取得するには、並べ替える必要があります。", "discover.dropZoneTableLabel": "フィールドを列として表に追加するには、ゾーンをドロップします", "discover.dscTour.stepAddFields.imageAltText": "[使用可能なフィールド]リストで、プラスアイコンをクリックし、フィールドをドキュメントテーブルに切り替えます。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index d9aaa9c724465..003312fef8d19 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2259,7 +2259,6 @@ "discover.docTable.totalDocuments": "{totalDocuments} 个文档", "discover.dscTour.stepAddFields.description": "单击 {plusIcon} 以添加您感兴趣的字段。", "discover.dscTour.stepExpand.description": "单击 {expandIcon} 以查看、比较和筛选文档。", - "discover.errorCalloutFormattedTitle": "{title}:{errorMessage}", "discover.formatHit.moreFields": "及另外 {count} 个{count, plural, other {字段}}", "discover.howToSeeOtherMatchingDocumentsDescription": "以下是匹配您的搜索的前 {sampleSize} 个文档,请优化您的搜索以查看其他文档。", "discover.noMatchRoute.bannerText": "Discover 应用程序无法识别此路由:{route}", @@ -2382,7 +2381,6 @@ "discover.docTable.tableRow.viewSingleDocumentLinkText": "查看单个文档", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "查看周围文档", "discover.documentsAriaLabel": "文档", - "discover.documentsErrorTitle": "搜索错误", "discover.docViews.table.scoreSortWarningTooltip": "要检索 _score 的值,必须按其筛选。", "discover.dropZoneTableLabel": "放置区域以将字段作为列添加到表中", "discover.dscTour.stepAddFields.imageAltText": "在可用字段列表中,单击加号图标将字段切换为文档表。", diff --git a/x-pack/test/functional/apps/discover/error_handling.ts b/x-pack/test/functional/apps/discover/error_handling.ts index 46eff2e7d0c89..cf362e8a12475 100644 --- a/x-pack/test/functional/apps/discover/error_handling.ts +++ b/x-pack/test/functional/apps/discover/error_handling.ts @@ -31,7 +31,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // this is the same test as in OSS but it catches different error message issue in different licences describe('invalid scripted field error', () => { it('is rendered', async () => { - expect(await PageObjects.discover.noResultsErrorVisible()).to.be(true); + await PageObjects.discover.showsErrorCallout(); const painlessStackTrace = await testSubjects.find('painlessStackTrace'); expect(painlessStackTrace).not.to.be(undefined); }); diff --git a/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts b/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts index 9dc632931d301..251290c6f4b5e 100644 --- a/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts +++ b/x-pack/test/search_sessions_integration/tests/apps/discover/async_search.ts @@ -62,7 +62,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await browser.navigateTo(savedSessionURL); await PageObjects.header.waitUntilLoadingHasFinished(); await searchSessions.expectState('restored'); - await testSubjects.existOrFail('discoverNoResultsError'); // expect error because of fake searchSessionId + await testSubjects.existOrFail('discoverErrorCalloutTitle'); // expect error because of fake searchSessionId await PageObjects.common.clearAllToasts(); const searchSessionId1 = await getSearchSessionId(); expect(searchSessionId1).to.be(fakeSearchSessionId); @@ -84,10 +84,15 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { // Note this currently fails, for some reason the fakeSearchSessionId is not restored await searchSessions.expectState('restored'); expect(await getSearchSessionId()).to.be(fakeSearchSessionId); + + // back navigation takes discover to fakeSearchSessionId which is in error state + // clean up page to get out of error state before proceeding to next test + await PageObjects.common.clearAllToasts(); + await queryBar.clickQuerySubmitButton(); + await PageObjects.header.waitUntilLoadingHasFinished(); }); it('navigation to context cleans the session', async () => { - await PageObjects.common.clearAllToasts(); const table = await PageObjects.discover.getDocTable(); const isLegacy = await PageObjects.discover.useLegacyTable(); await table.clickRowToggle({ rowIndex: 0 }); diff --git a/x-pack/test/search_sessions_integration/tests/apps/discover/sessions_in_space.ts b/x-pack/test/search_sessions_integration/tests/apps/discover/sessions_in_space.ts index ad1e2cae04877..1bb691629a63e 100644 --- a/x-pack/test/search_sessions_integration/tests/apps/discover/sessions_in_space.ts +++ b/x-pack/test/search_sessions_integration/tests/apps/discover/sessions_in_space.ts @@ -71,7 +71,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Check that session is restored await searchSessions.expectState('restored'); - await testSubjects.missingOrFail('discoverNoResultsError'); expect(await toasts.getToastCount()).to.be(0); // no session restoration related warnings }); }); From 45a160b8058407eeebadefc1984fbefbcbed223c Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Fri, 10 Nov 2023 15:28:00 +0100 Subject: [PATCH 36/51] [Ops] Fix cache build (#171019) ## Summary There was a small change introduced in https://github.com/elastic/kibana/pull/170918 that exposes a custom env var, that started to fail on cache builds on CI (https://buildkite.com/elastic/kibana-agent-packer-cache/builds/474#018bb945-4910-4f5e-b78b-f020574c5b89). Apparently the BUILDKITE_BRANCH is not available in the script, it's because it's the same build script called not from buildkite, but through packer, which probably doesn't forward all the environment variables. In this case, we can probably default to `""` and let the script ignore that section where this variable is exported, because this export is probably not meant for the cache build. However, we should keep this in mind, that the packer/cache build is invoking some scripts with a different env context (might lead to different results if we depend on some of these vars). chore: use an empty default when missing BUILDKITE_BRANCH to prevent error --- .buildkite/scripts/common/env.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/scripts/common/env.sh b/.buildkite/scripts/common/env.sh index 3e086cb4505ec..89c9dce5a3b8f 100755 --- a/.buildkite/scripts/common/env.sh +++ b/.buildkite/scripts/common/env.sh @@ -29,7 +29,7 @@ KIBANA_PKG_VERSION="$(jq -r .version "$KIBANA_DIR/package.json")" export KIBANA_PKG_VERSION # Detects and exports the final target branch when using a merge queue -if [[ "$BUILDKITE_BRANCH" == "gh-readonly-queue"* ]]; then +if [[ "${BUILDKITE_BRANCH:-}" == "gh-readonly-queue"* ]]; then # removes gh-readonly-queue/ BKBRANCH_WITHOUT_GH_MQ_PREFIX="${BUILDKITE_BRANCH#gh-readonly-queue/}" @@ -42,7 +42,7 @@ export MERGE_QUEUE_TARGET_BRANCH # Exports BUILDKITE_BRANCH_MERGE_QUEUE which will use the value from MERGE_QUEUE_TARGET_BRANCH if defined otherwise # will fallback to BUILDKITE_BRANCH. -BUILDKITE_BRANCH_MERGE_QUEUE="${MERGE_QUEUE_TARGET_BRANCH:-$BUILDKITE_BRANCH}" +BUILDKITE_BRANCH_MERGE_QUEUE="${MERGE_QUEUE_TARGET_BRANCH:-${BUILDKITE_BRANCH:-}}" export BUILDKITE_BRANCH_MERGE_QUEUE From b0862085f69b0b3503fad9b7ba0548ddb2329862 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Fri, 10 Nov 2023 09:33:41 -0500 Subject: [PATCH 37/51] [Fleet] Allow to download policy and manifest with version in querystring (#170987) --- .../agent_policy/components/agent_policy_yaml_flyout.tsx | 7 ++++--- .../page_steps/install_agent/install_agent_standalone.tsx | 6 ++++-- .../kubernetes_instructions.test.tsx | 6 +++--- .../agent_enrollment_flyout/kubernetes_instructions.tsx | 3 ++- .../agent_enrollment_flyout/steps/compute_steps.tsx | 8 +++++--- x-pack/plugins/fleet/server/routes/agent_policy/index.ts | 2 ++ 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_yaml_flyout.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_yaml_flyout.tsx index d1cfd995cdda9..6488550b18358 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_yaml_flyout.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_yaml_flyout.tsx @@ -27,6 +27,7 @@ import { import { useGetOneAgentPolicyFull, useGetOneAgentPolicy, useStartServices } from '../../../hooks'; import { Loading } from '../../../components'; import { fullAgentPolicyToYaml, agentPolicyRouteService } from '../../../services'; +import { API_VERSIONS } from '../../../../../../common/constants'; const FlyoutBody = styled(EuiFlyoutBody)` .euiFlyoutBody__overflowContent { @@ -65,9 +66,9 @@ export const AgentPolicyYamlFlyout = memo<{ policyId: string; onClose: () => voi ); - const downloadLink = core.http.basePath.prepend( - agentPolicyRouteService.getInfoFullDownloadPath(policyId) - ); + const downloadLink = + core.http.basePath.prepend(agentPolicyRouteService.getInfoFullDownloadPath(policyId)) + + `?apiVersion=${API_VERSIONS.public.v1}`; return ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx index 3f84a95239beb..f49aaefd65dd9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx @@ -11,7 +11,7 @@ import { EuiSteps, EuiSpacer } from '@elastic/eui'; import { safeDump } from 'js-yaml'; import type { FullAgentPolicy } from '../../../../../../../../../../common/types/models/agent_policy'; - +import { API_VERSIONS } from '../../../../../../../../../../common/constants'; import { AgentStandaloneBottomBar, StandaloneModeWarningCallout, @@ -95,7 +95,9 @@ export const InstallElasticAgentStandalonePageStep: React.FC { it('should return the correct link', () => { expect(getManifestDownloadLink('https://fleet.host', 'enrollmentToken')).toEqual( - '/api/fleet/kubernetes/download?fleetServer=https%3A%2F%2Ffleet.host&enrolToken=enrollmentToken' + '/api/fleet/kubernetes/download?apiVersion=2023-10-31&fleetServer=https%3A%2F%2Ffleet.host&enrolToken=enrollmentToken' ); expect(getManifestDownloadLink('https://fleet.host')).toEqual( - '/api/fleet/kubernetes/download?fleetServer=https%3A%2F%2Ffleet.host' + '/api/fleet/kubernetes/download?apiVersion=2023-10-31&fleetServer=https%3A%2F%2Ffleet.host' ); expect(getManifestDownloadLink(undefined, 'enrollmentToken')).toEqual( - '/api/fleet/kubernetes/download?enrolToken=enrollmentToken' + '/api/fleet/kubernetes/download?apiVersion=2023-10-31&enrolToken=enrollmentToken' ); }); }); diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx index a44b7ab4020e9..f1cf6b5a29032 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/kubernetes_instructions.tsx @@ -20,7 +20,7 @@ import { i18n } from '@kbn/i18n'; import { useStartServices } from '../../hooks'; -import { agentPolicyRouteService } from '../../../common'; +import { agentPolicyRouteService, API_VERSIONS } from '../../../common'; import { sendGetK8sManifest } from '../../hooks/use_request/k8s'; @@ -33,6 +33,7 @@ interface Props { export const getManifestDownloadLink = (fleetServerHost?: string, enrollmentAPIKey?: string) => { const searchParams = new URLSearchParams({ + apiVersion: API_VERSIONS.public.v1, ...(fleetServerHost && { fleetServer: fleetServerHost }), ...(enrollmentAPIKey && { enrolToken: enrollmentAPIKey }), }); diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx index 495266897db89..5cc8c109131ae 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx @@ -13,7 +13,7 @@ import { safeDump } from 'js-yaml'; import type { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps'; import type { FullAgentPolicy } from '../../../../common/types/models/agent_policy'; - +import { API_VERSIONS } from '../../../../common/constants'; import { fullAgentPolicyToYaml, agentPolicyRouteService, @@ -73,10 +73,12 @@ export const StandaloneSteps: React.FunctionComponent = ({ ? core.http.basePath.prepend( `${agentPolicyRouteService.getInfoFullDownloadPath( selectedPolicy?.id - )}?kubernetes=true&standalone=true` + )}?kubernetes=true&standalone=true&apiVersion=${API_VERSIONS.public.v1}` ) : core.http.basePath.prepend( - `${agentPolicyRouteService.getInfoFullDownloadPath(selectedPolicy?.id)}?standalone=true` + `${agentPolicyRouteService.getInfoFullDownloadPath( + selectedPolicy?.id + )}?standalone=true&apiVersion=${API_VERSIONS.public.v1}` ); } diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/index.ts b/x-pack/plugins/fleet/server/routes/agent_policy/index.ts index 7ca3409f72b88..747bc6face1f8 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/index.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/index.ts @@ -174,6 +174,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { all: true }, }, + enableQueryVersion: true, }) .addVersion( { @@ -206,6 +207,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { all: true }, }, + enableQueryVersion: true, }) .addVersion( { From c43e6997af35492577b07f196d25d11a6bec6f14 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Fri, 10 Nov 2023 15:42:14 +0100 Subject: [PATCH 38/51] redact ES client errors (#171018) ## Summary Define a custom `toJSON` method on errors from the ES client to have better control of the format of the output of their JSON serialization --- .../src/configure_client.ts | 4 ++ .../src/patch_client.ts | 20 ++++++ .../elasticsearch/errors.test.ts | 70 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/patch_client.ts create mode 100644 src/core/server/integration_tests/elasticsearch/errors.test.ts diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.ts index 5f8d793b0a426..287f3a670ce48 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.ts +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/configure_client.ts @@ -13,9 +13,13 @@ import { parseClientOptions } from './client_config'; import { instrumentEsQueryAndDeprecationLogger } from './log_query_and_deprecation'; import { createTransport } from './create_transport'; import type { AgentFactoryProvider } from './agent_manager'; +import { patchElasticsearchClient } from './patch_client'; const noop = () => undefined; +// Apply ES client patches on module load +patchElasticsearchClient(); + export const configureClient = ( config: ElasticsearchClientConfig, { diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/patch_client.ts b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/patch_client.ts new file mode 100644 index 0000000000000..75ea5db91b2e3 --- /dev/null +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/src/patch_client.ts @@ -0,0 +1,20 @@ +/* + * 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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { errors } from '@elastic/elasticsearch'; + +export const patchElasticsearchClient = () => { + const baseErrorPrototype = errors.ElasticsearchClientError.prototype; + // @ts-expect-error + baseErrorPrototype.toJSON = function () { + return { + name: this.name, + message: this.message, + }; + }; +}; diff --git a/src/core/server/integration_tests/elasticsearch/errors.test.ts b/src/core/server/integration_tests/elasticsearch/errors.test.ts new file mode 100644 index 0000000000000..b9dcfb33a23a4 --- /dev/null +++ b/src/core/server/integration_tests/elasticsearch/errors.test.ts @@ -0,0 +1,70 @@ +/* + * 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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + createTestServers, + type TestElasticsearchUtils, + type TestKibanaUtils, +} from '@kbn/core-test-helpers-kbn-server'; + +describe('elasticsearch clients errors', () => { + let esServer: TestElasticsearchUtils; + let kibanaServer: TestKibanaUtils; + + beforeAll(async () => { + const { startES, startKibana } = createTestServers({ + adjustTimeout: jest.setTimeout, + }); + + esServer = await startES(); + kibanaServer = await startKibana(); + }); + + afterAll(async () => { + await kibanaServer.stop(); + await esServer.stop(); + }); + + it('has the proper JSON representation', async () => { + const esClient = kibanaServer.coreStart.elasticsearch.client.asInternalUser; + + try { + await esClient.search({ + index: '.kibana', + // @ts-expect-error yes this is invalid + query: { someInvalidQuery: { foo: 'bar' } }, + }); + expect('should have thrown').toEqual('but it did not'); + } catch (e) { + expect(JSON.stringify(e)).toMatchInlineSnapshot( + `"{\\"name\\":\\"ResponseError\\",\\"message\\":\\"parsing_exception\\\\n\\\\tCaused by:\\\\n\\\\t\\\\tnamed_object_not_found_exception: [1:30] unknown field [someInvalidQuery]\\\\n\\\\tRoot causes:\\\\n\\\\t\\\\tparsing_exception: unknown query [someInvalidQuery]\\"}"` + ); + } + }); + + it('has the proper string representation', async () => { + const esClient = kibanaServer.coreStart.elasticsearch.client.asInternalUser; + + try { + await esClient.search({ + index: '.kibana', + // @ts-expect-error yes this is invalid + query: { someInvalidQuery: { foo: 'bar' } }, + }); + expect('should have thrown').toEqual('but it did not'); + } catch (e) { + expect(String(e)).toMatchInlineSnapshot(` + "ResponseError: parsing_exception + Caused by: + named_object_not_found_exception: [1:30] unknown field [someInvalidQuery] + Root causes: + parsing_exception: unknown query [someInvalidQuery]" + `); + } + }); +}); From 2b60d3a6ec7745c3e38bb2f6b3b7f73bd7ceb16c Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Fri, 10 Nov 2023 15:45:51 +0100 Subject: [PATCH 39/51] Minor `reduce` perf optimizations (#170922) ## Summary Cherry picked from https://github.com/elastic/kibana/pull/168812 the changes from `core` packages and the `security` and `spaces` plugins --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../src/lib/search/aggregations/validation.ts | 13 ++++---- .../src/types/object_type.ts | 5 +-- packages/kbn-i18n/src/core/helper.ts | 15 +++------ packages/kbn-i18n/src/loader.ts | 11 +++---- packages/kbn-std/src/iteration/map.ts | 5 ++- .../src/tools/serializer.ts | 5 ++- .../server/authorization/check_privileges.ts | 12 +++---- .../authorization/disable_ui_capabilities.ts | 32 +++++++++---------- .../feature_privilege_builder/management.ts | 3 +- .../authorization/privileges/privileges.ts | 18 ++++++----- .../routes/authorization/privileges/get.ts | 8 ++--- .../server/saved_objects/ensure_authorized.ts | 5 ++- .../spaces/secure_spaces_client_wrapper.ts | 14 +++++--- .../security_usage_collector.ts | 7 +--- .../capabilities/capabilities_switcher.ts | 13 +++++--- 15 files changed, 83 insertions(+), 83 deletions(-) diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/search/aggregations/validation.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/search/aggregations/validation.ts index d5dfbb8e8cb1d..d058feb31ba78 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/search/aggregations/validation.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/search/aggregations/validation.ts @@ -98,13 +98,14 @@ const validateAggregationContainer = ( ) => { return Object.entries(container).reduce( (memo, [aggName, aggregation]) => { - if (aggregationKeys.includes(aggName)) { - return memo; + if (!aggregationKeys.includes(aggName)) { + (memo as Record)[aggName] = validateAggregationType( + aggName, + aggregation, + childContext(context, aggName) + ); } - return { - ...memo, - [aggName]: validateAggregationType(aggName, aggregation, childContext(context, aggName)), - }; + return memo; }, {} ); diff --git a/packages/kbn-config-schema/src/types/object_type.ts b/packages/kbn-config-schema/src/types/object_type.ts index fa72ee61ab7ff..6927a10630b1e 100644 --- a/packages/kbn-config-schema/src/types/object_type.ts +++ b/packages/kbn-config-schema/src/types/object_type.ts @@ -159,10 +159,7 @@ export class ObjectType

extends Type> ...newProps, }).reduce((memo, [key, value]) => { if (value !== null && value !== undefined) { - return { - ...memo, - [key]: value, - }; + (memo as Record)[key] = value; } return memo; }, {} as ExtendedProps); diff --git a/packages/kbn-i18n/src/core/helper.ts b/packages/kbn-i18n/src/core/helper.ts index 405f0596cd037..eef4bb88e4927 100644 --- a/packages/kbn-i18n/src/core/helper.ts +++ b/packages/kbn-i18n/src/core/helper.ts @@ -18,17 +18,12 @@ export const unique = (arr: T[] = []): T[] => [...new Set(arr)]; const merge = (a: any, b: any): { [k: string]: any } => unique([...Object.keys(a), ...Object.keys(b)]).reduce((acc, key) => { if (isObject(a[key]) && isObject(b[key]) && !Array.isArray(a[key]) && !Array.isArray(b[key])) { - return { - ...acc, - [key]: merge(a[key], b[key]), - }; + acc[key] = merge(a[key], b[key]); + } else { + acc[key] = b[key] === undefined ? a[key] : b[key]; } - - return { - ...acc, - [key]: b[key] === undefined ? a[key] : b[key], - }; - }, {}); + return acc; + }, {} as { [k: string]: any }); export const mergeAll = (...sources: any[]) => sources.filter(isObject).reduce((acc, source) => merge(acc, source)); diff --git a/packages/kbn-i18n/src/loader.ts b/packages/kbn-i18n/src/loader.ts index 5b4417b54646c..55c924e989daf 100644 --- a/packages/kbn-i18n/src/loader.ts +++ b/packages/kbn-i18n/src/loader.ts @@ -148,13 +148,10 @@ export async function getAllTranslations(): Promise<{ [key: string]: Translation const locales = getRegisteredLocales(); const translations = await Promise.all(locales.map(getTranslationsByLocale)); - return locales.reduce( - (acc, locale, index) => ({ - ...acc, - [locale]: translations[index], - }), - {} - ); + return locales.reduce((acc, locale, index) => { + acc[locale] = translations[index]; + return acc; + }, {} as { [key: string]: Translation }); } /** diff --git a/packages/kbn-std/src/iteration/map.ts b/packages/kbn-std/src/iteration/map.ts index 44765d69e1bd0..a65951cc14db5 100644 --- a/packages/kbn-std/src/iteration/map.ts +++ b/packages/kbn-std/src/iteration/map.ts @@ -58,5 +58,8 @@ export async function asyncMapWithLimit( return results .sort(([a], [b]) => a - b) - .reduce((acc: T2[], [, result]) => acc.concat(result), []); + .reduce((acc: T2[], [, result]) => { + acc.push(...result); + return acc; + }, []); } diff --git a/packages/kbn-telemetry-tools/src/tools/serializer.ts b/packages/kbn-telemetry-tools/src/tools/serializer.ts index a33d2d78e4137..ab891f1220323 100644 --- a/packages/kbn-telemetry-tools/src/tools/serializer.ts +++ b/packages/kbn-telemetry-tools/src/tools/serializer.ts @@ -178,7 +178,10 @@ export function getDescriptor(node: ts.Node, program: ts.Program): Descriptor | const constraints = getConstraints(constraint, program); const constraintsArray = Array.isArray(constraints) ? constraints : [constraints]; if (typeof constraintsArray[0] === 'string') { - return constraintsArray.reduce((acc, c) => ({ ...acc, [c]: descriptor }), {}); + return constraintsArray.reduce((acc, c) => { + (acc as Record)[c] = descriptor; + return acc; + }, {}); } } return { '@@INDEX@@': descriptor }; diff --git a/x-pack/plugins/security/server/authorization/check_privileges.ts b/x-pack/plugins/security/server/authorization/check_privileges.ts index 0e842da4e4851..abc0b791dd49a 100644 --- a/x-pack/plugins/security/server/authorization/check_privileges.ts +++ b/x-pack/plugins/security/server/authorization/check_privileges.ts @@ -144,13 +144,11 @@ export function checkPrivilegesFactory( const indexPrivileges = Object.entries(hasPrivilegesResponse.index ?? {}).reduce< CheckPrivilegesResponse['privileges']['elasticsearch']['index'] >((acc, [index, indexResponse]) => { - return { - ...acc, - [index]: Object.entries(indexResponse).map(([privilege, authorized]) => ({ - privilege, - authorized, - })), - }; + acc[index] = Object.entries(indexResponse).map(([privilege, authorized]) => ({ + privilege, + authorized, + })); + return acc; }, {}); // we need to filter out the non requested privileges from the response diff --git a/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts b/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts index e3cd51bc77015..7283b955e906c 100644 --- a/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts +++ b/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts @@ -37,10 +37,8 @@ export function disableUICapabilitiesFactory( const elasticsearchFeatureMap = elasticsearchFeatures.reduce< Record> >((acc, esFeature) => { - return { - ...acc, - [esFeature.id]: esFeature.privileges, - }; + acc[esFeature.id] = esFeature.privileges; + return acc; }, {}); const allRequiredClusterPrivileges = Array.from( @@ -59,11 +57,9 @@ export function disableUICapabilitiesFactory( return { ...acc, ...Object.entries(p.requiredIndexPrivileges!).reduce((acc2, [indexName, privileges]) => { - return { - ...acc2, - [indexName]: [...(acc[indexName] ?? []), ...privileges], - }; - }, {}), + acc2[indexName] = [...(acc[indexName] ?? []), ...privileges]; + return acc2; + }, {} as Record), }; }, {}); @@ -157,14 +153,16 @@ export function disableUICapabilitiesFactory( } const uiActions = Object.entries(uiCapabilities).reduce( - (acc, [featureId, featureUICapabilities]) => [ - ...acc, - ...flatten( - Object.entries(featureUICapabilities).map(([uiCapability, value]) => { - return getActionsForFeatureCapability(featureId, uiCapability, value); - }) - ), - ], + (acc, [featureId, featureUICapabilities]) => { + acc.push( + ...flatten( + Object.entries(featureUICapabilities).map(([uiCapability, value]) => { + return getActionsForFeatureCapability(featureId, uiCapability, value); + }) + ) + ); + return acc; + }, [] ); diff --git a/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/management.ts b/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/management.ts index 72cc28f5570b5..ef84f8696a212 100644 --- a/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/management.ts +++ b/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/management.ts @@ -18,7 +18,8 @@ export class FeaturePrivilegeManagementBuilder extends BaseFeaturePrivilegeBuild } return Object.entries(managementSections).reduce((acc, [sectionId, items]) => { - return [...acc, ...items.map((item) => this.actions.ui.get('management', sectionId, item))]; + acc.push(...items.map((item) => this.actions.ui.get('management', sectionId, item))); + return acc; }, [] as string[]); } } diff --git a/x-pack/plugins/security/server/authorization/privileges/privileges.ts b/x-pack/plugins/security/server/authorization/privileges/privileges.ts index 20de4011c39f4..e3e151052f056 100644 --- a/x-pack/plugins/security/server/authorization/privileges/privileges.ts +++ b/x-pack/plugins/security/server/authorization/privileges/privileges.ts @@ -37,8 +37,8 @@ export function privilegesFactory( (feature) => !feature.excludeFromBasePrivileges ); - let allActions: string[] = []; - let readActions: string[] = []; + const allActionsSet = new Set(); + const readActionsSet = new Set(); basePrivilegeFeatures.forEach((feature) => { for (const { privilegeId, privilege } of featuresService.featurePrivilegeIterator(feature, { @@ -47,15 +47,17 @@ export function privilegesFactory( predicate: (pId, featurePrivilege) => !featurePrivilege.excludeFromBasePrivileges, })) { const privilegeActions = featurePrivilegeBuilder.getActions(privilege, feature); - allActions = [...allActions, ...privilegeActions]; - if (privilegeId === 'read') { - readActions = [...readActions, ...privilegeActions]; - } + privilegeActions.forEach((action) => { + allActionsSet.add(action); + if (privilegeId === 'read') { + readActionsSet.add(action); + } + }); } }); - allActions = uniq(allActions); - readActions = uniq(readActions); + const allActions = [...allActionsSet]; + const readActions = [...readActionsSet]; const featurePrivileges: Record> = {}; for (const feature of features) { diff --git a/x-pack/plugins/security/server/routes/authorization/privileges/get.ts b/x-pack/plugins/security/server/routes/authorization/privileges/get.ts index 8817fca4831ae..1d278aa676ac3 100644 --- a/x-pack/plugins/security/server/routes/authorization/privileges/get.ts +++ b/x-pack/plugins/security/server/routes/authorization/privileges/get.ts @@ -38,12 +38,10 @@ export function defineGetPrivilegesRoutes({ router, authz }: RouteDefinitionPara space: Object.keys(privileges.space), features: Object.entries(privileges.features).reduce( (acc, [featureId, featurePrivileges]) => { - return { - ...acc, - [featureId]: Object.keys(featurePrivileges), - }; + acc[featureId] = Object.keys(featurePrivileges); + return acc; }, - {} + {} as Record ), reserved: Object.keys(privileges.reserved), }; diff --git a/x-pack/plugins/security/server/saved_objects/ensure_authorized.ts b/x-pack/plugins/security/server/saved_objects/ensure_authorized.ts index e945848d71105..79e15be650773 100644 --- a/x-pack/plugins/security/server/saved_objects/ensure_authorized.ts +++ b/x-pack/plugins/security/server/saved_objects/ensure_authorized.ts @@ -104,7 +104,10 @@ export async function ensureAuthorized( // Neither fully nor partially authorized. Bail with error. const uniqueUnauthorizedPrivileges = [...missingPrivileges.entries()].reduce( - (acc, [, privilegeSet]) => new Set([...acc, ...privilegeSet]), + (acc, [, privilegeSet]) => { + privilegeSet.forEach((entry) => acc.add(entry)); + return acc; + }, new Set() ); const targetTypesAndActions = [...uniqueUnauthorizedPrivileges] diff --git a/x-pack/plugins/security/server/spaces/secure_spaces_client_wrapper.ts b/x-pack/plugins/security/server/spaces/secure_spaces_client_wrapper.ts index 18c6ae824584c..1e9e25b6b800d 100644 --- a/x-pack/plugins/security/server/spaces/secure_spaces_client_wrapper.ts +++ b/x-pack/plugins/security/server/spaces/secure_spaces_client_wrapper.ts @@ -81,10 +81,13 @@ export class SecureSpacesClientWrapper implements ISpacesClient { // Collect all privileges which need to be checked const allPrivileges = Object.entries(PURPOSE_PRIVILEGE_MAP).reduce( - (acc, [getSpacesPurpose, privilegeFactory]) => - !includeAuthorizedPurposes && getSpacesPurpose !== purpose - ? acc - : { ...acc, [getSpacesPurpose]: privilegeFactory(this.authorization) }, + (acc, [getSpacesPurpose, privilegeFactory]) => { + if (!includeAuthorizedPurposes && getSpacesPurpose !== purpose) { + return acc; + } + acc[getSpacesPurpose as GetAllSpacesPurpose] = privilegeFactory(this.authorization); + return acc; + }, {} as Record ); @@ -117,7 +120,8 @@ export class SecureSpacesClientWrapper implements ISpacesClient { const requiredActions = privilegeFactory(this.authorization); const hasAllRequired = checkHasAllRequired(space, requiredActions); hasAnyAuthorization = hasAnyAuthorization || hasAllRequired; - return { ...acc, [purposeKey]: hasAllRequired }; + acc[purposeKey as GetAllSpacesPurpose] = hasAllRequired; + return acc; }, {} as Record ); diff --git a/x-pack/plugins/security/server/usage_collector/security_usage_collector.ts b/x-pack/plugins/security/server/usage_collector/security_usage_collector.ts index f73ac0bbb25a3..5859943391442 100644 --- a/x-pack/plugins/security/server/usage_collector/security_usage_collector.ts +++ b/x-pack/plugins/security/server/usage_collector/security_usage_collector.ts @@ -160,12 +160,7 @@ export function registerSecurityUsageCollector({ usageCollection, config, licens const loginSelectorEnabled = config.authc.selector.enabled; const authProviderCount = config.authc.sortedProviders.length; const enabledAuthProviders = [ - ...new Set( - config.authc.sortedProviders.reduce( - (acc, provider) => [...acc, provider.type], - [] as string[] - ) - ), + ...new Set(config.authc.sortedProviders.map((provider) => provider.type)), ]; const accessAgreementEnabled = allowAccessAgreement && diff --git a/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts b/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts index e3183185022f6..b5d9be07d91af 100644 --- a/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts +++ b/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts @@ -63,14 +63,19 @@ function toggleDisabledFeatures( ) { const disabledFeatureKeys = activeSpace.disabledFeatures; - const [enabledFeatures, disabledFeatures] = features.reduce( + const { enabledFeatures, disabledFeatures } = features.reduce( (acc, feature) => { if (disabledFeatureKeys.includes(feature.id)) { - return [acc[0], [...acc[1], feature]]; + acc.disabledFeatures.push(feature); + } else { + acc.enabledFeatures.push(feature); } - return [[...acc[0], feature], acc[1]]; + return acc; }, - [[], []] as [KibanaFeature[], KibanaFeature[]] + { enabledFeatures: [], disabledFeatures: [] } as { + enabledFeatures: KibanaFeature[]; + disabledFeatures: KibanaFeature[]; + } ); const navLinks = capabilities.navLinks; From 2720e4f42d7e8a728154765ce277a671fb03fcd4 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Fri, 10 Nov 2023 15:46:38 +0100 Subject: [PATCH 40/51] [EDR Workflows] fix Osquery test - SavedQueryDropdown flakiness (#170952) --- .../osquery/cypress/e2e/all/add_integration.cy.ts | 8 +++++++- .../osquery/cypress/e2e/all/alerts_cases.cy.ts | 1 + .../plugins/osquery/cypress/e2e/all/live_query.cy.ts | 12 ++++++------ .../osquery/cypress/e2e/all/live_query_packs.cy.ts | 2 +- .../osquery/cypress/e2e/all/live_query_run.cy.ts | 2 +- .../osquery/cypress/e2e/all/packs_create_edit.cy.ts | 8 +++++++- .../osquery/cypress/e2e/all/packs_integration.cy.ts | 2 +- .../osquery/cypress/e2e/all/saved_queries.cy.ts | 4 +++- .../cypress/e2e/roles/t1_and_t2_analyst.cy.ts | 2 +- x-pack/plugins/osquery/cypress/screens/live_query.ts | 2 +- x-pack/plugins/osquery/cypress/tasks/live_query.ts | 4 ++-- 11 files changed, 31 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts index 6eae4381cf34b..90875bebc8384 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts @@ -5,10 +5,12 @@ * 2.0. */ +import { LIVE_QUERY_EDITOR } from '../../screens/live_query'; import { ADD_PACK_HEADER_BUTTON, ADD_QUERY_BUTTON, formFieldInputSelector, + SAVED_QUERY_DROPDOWN_SELECT, TABLE_ROWS, } from '../../screens/packs'; import { @@ -178,11 +180,15 @@ describe('ALL - Add Integration', { tags: ['@ess', '@serverless'] }, () => { navigateTo('app/osquery/packs'); cy.getBySel(ADD_PACK_HEADER_BUTTON).click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.get(formFieldInputSelector('name')).type(`${packName}{downArrow}{enter}`); cy.getBySel('policyIdsComboBox').type(`${policyName} {downArrow}{enter}`); cy.getBySel(ADD_QUERY_BUTTON).click(); - cy.getBySel('savedQuerySelect').click().type('{downArrow}{enter}'); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('exist'); + cy.getBySel(SAVED_QUERY_DROPDOWN_SELECT).click().type('{downArrow}{enter}'); cy.contains(/^Save$/).click(); cy.contains(/^Save pack$/).click(); cy.contains(`Successfully created "${packName}" pack`).click(); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts index 3c93bef865b96..7f6f0a006e05b 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts @@ -71,6 +71,7 @@ describe('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, () => cy.contains(/^\d+ agen(t|ts) selected/); cy.contains('Run a set of queries in a pack').click(); cy.get(OSQUERY_FLYOUT_BODY_EDITOR).should('not.exist'); + cy.getBySel('globalLoadingIndicator').should('not.exist'); cy.getBySel('select-live-pack').click().type(`${packName}{downArrow}{enter}`); submitQuery(); cy.get('[aria-label="Add to Case"]').first().click(); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts index a5f9fdab66a99..3e84dc001eed5 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts @@ -67,22 +67,22 @@ describe('ALL - Live Query', { tags: ['@ess', '@serverless'] }, () => { "where pos.remote_port !='0' {shift+enter}" + 'limit 1000;'; cy.contains('New live query').click(); - cy.get(LIVE_QUERY_EDITOR).invoke('height').and('be.gt', 99).and('be.lt', 110); - cy.get(LIVE_QUERY_EDITOR).click().invoke('val', multilineQuery); + cy.getBySel(LIVE_QUERY_EDITOR).invoke('height').and('be.gt', 99).and('be.lt', 110); + cy.getBySel(LIVE_QUERY_EDITOR).click().invoke('val', multilineQuery); inputQuery(multilineQuery); - cy.get(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 220).and('be.lt', 300); + cy.getBySel(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 220).and('be.lt', 300); selectAllAgents(); submitQuery(); cy.getBySel('osqueryResultsPanel'); // check if it get's bigger when we add more lines - cy.get(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 220).and('be.lt', 300); + cy.getBySel(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 220).and('be.lt', 300); inputQuery(multilineQuery); - cy.get(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 350).and('be.lt', 600); + cy.getBySel(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 350).and('be.lt', 600); inputQuery('{selectall}{backspace}{selectall}{backspace}'); // not sure if this is how it used to work when I implemented the functionality, but let's leave it like this for now - cy.get(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 200).and('be.lt', 400); + cy.getBySel(LIVE_QUERY_EDITOR).invoke('height').should('be.gt', 200).and('be.lt', 400); }); }); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query_packs.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query_packs.cy.ts index 4269d0e3d7901..da598382bf0ee 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query_packs.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query_packs.cy.ts @@ -67,7 +67,7 @@ describe('ALL - Live Query Packs', { tags: ['@ess', '@serverless'] }, () => { it('should run live pack', () => { cy.contains('New live query').click(); cy.contains('Run a set of queries in a pack.').click(); - cy.get(LIVE_QUERY_EDITOR).should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('not.exist'); cy.getBySel('select-live-pack').click().type(`${packName}{downArrow}{enter}`); cy.contains('This table contains 3 rows.'); cy.contains('system_memory_linux_elastic'); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts index 1200e3e6f610d..035c228623fda 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts @@ -99,7 +99,7 @@ describe('ALL - Live Query run custom and saved', { tags: ['@ess', '@serverless' navigateTo('/app/osquery'); cy.get('[aria-label="Run query"]').first().should('be.visible').click(); - cy.get(LIVE_QUERY_EDITOR).contains('select * from users;'); + cy.getBySel(LIVE_QUERY_EDITOR).contains('select * from users;'); }); it('should open query details by clicking the details icon', () => { diff --git a/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts index 64cb28d93d22c..32e2496f8ea06 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts @@ -33,7 +33,7 @@ import { interceptPackId, } from '../../tasks/integrations'; import { DEFAULT_POLICY } from '../../screens/fleet'; -import { getIdFormField } from '../../screens/live_query'; +import { getIdFormField, LIVE_QUERY_EDITOR } from '../../screens/live_query'; import { loadSavedQuery, cleanupSavedQuery, cleanupPack, loadPack } from '../../tasks/api_fixtures'; import { request } from '../../tasks/common'; import { ServerlessRoleName } from '../../support/roles'; @@ -254,6 +254,8 @@ describe('Packs - Create and Edit', { tags: ['@ess', '@serverless'] }, () => { cy.getBySel(ADD_QUERY_BUTTON).click(); cy.contains('Attach next query'); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('exist'); cy.getBySel(SAVED_QUERY_DROPDOWN_SELECT).type(`${savedQueryName}{downArrow}{enter}`); cy.getBySel('osquery-interval-field').click().clear().type('5'); cy.getBySel(FLYOUT_SAVED_QUERY_SAVE_BUTTON).click(); @@ -367,6 +369,8 @@ describe('Packs - Create and Edit', { tags: ['@ess', '@serverless'] }, () => { cy.getBySel(ADD_QUERY_BUTTON).click(); cy.contains('Attach next query'); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('exist'); cy.contains('ID must be unique').should('not.exist'); cy.getBySel(SAVED_QUERY_DROPDOWN_SELECT).type(`${savedQueryName}{downArrow}{enter}`); cy.getBySel(FLYOUT_SAVED_QUERY_SAVE_BUTTON).click(); @@ -671,6 +675,8 @@ describe('Packs - Create and Edit', { tags: ['@ess', '@serverless'] }, () => { cy.getBySel(ADD_QUERY_BUTTON).click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('exist'); cy.getBySel(SAVED_QUERY_DROPDOWN_SELECT).type( `${multipleMappingsSavedQueryName} {downArrow} {enter}` ); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/packs_integration.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/packs_integration.cy.ts index 73dc45837e2b3..30b8a1641fb94 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/packs_integration.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/packs_integration.cy.ts @@ -162,7 +162,7 @@ describe('ALL - Packs', { tags: ['@ess', '@serverless'] }, () => { navigateTo('/app/osquery/live_queries'); cy.contains('New live query').click(); cy.contains('Run a set of queries in a pack.').click(); - cy.get(LIVE_QUERY_EDITOR).should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('not.exist'); cy.getBySel('select-live-pack').click().type('osquery-monitoring{downArrow}{enter}'); selectAllAgents(); submitQuery(); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts index 1319d4e173ec4..6638567a92625 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { LIVE_QUERY_EDITOR } from '../../screens/live_query'; import { ADD_QUERY_BUTTON, customActionEditSavedQuerySelector, @@ -142,7 +143,8 @@ describe('ALL - Saved queries', { tags: ['@ess', '@serverless'] }, () => { cy.getBySel(ADD_QUERY_BUTTON).click(); cy.contains('Attach next query'); - + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('exist'); cy.getBySel(SAVED_QUERY_DROPDOWN_SELECT).click().type('users_elastic{downArrow} {enter}'); inputQuery('where name=1'); cy.getBySel('resultsTypeField').click(); diff --git a/x-pack/plugins/osquery/cypress/e2e/roles/t1_and_t2_analyst.cy.ts b/x-pack/plugins/osquery/cypress/e2e/roles/t1_and_t2_analyst.cy.ts index 470c844530452..d512f5d5df5bb 100644 --- a/x-pack/plugins/osquery/cypress/e2e/roles/t1_and_t2_analyst.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/roles/t1_and_t2_analyst.cy.ts @@ -113,7 +113,7 @@ describe(`T1 and T2 analysts`, { tags: ['@ess', '@serverless'] }, () => { cy.contains('New live query').click(); selectAllAgents(); - cy.get(LIVE_QUERY_EDITOR).should('not.exist'); + cy.getBySel(LIVE_QUERY_EDITOR).should('not.exist'); submitQuery(); cy.contains('Query is a required field'); }); diff --git a/x-pack/plugins/osquery/cypress/screens/live_query.ts b/x-pack/plugins/osquery/cypress/screens/live_query.ts index 9dc543072fe07..04c56fbce44c7 100644 --- a/x-pack/plugins/osquery/cypress/screens/live_query.ts +++ b/x-pack/plugins/osquery/cypress/screens/live_query.ts @@ -7,7 +7,7 @@ export const AGENT_FIELD = '[data-test-subj="comboBoxInput"]'; export const ALL_AGENTS_OPTION = '[title="All agents"]'; -export const LIVE_QUERY_EDITOR = '.kibanaCodeEditor'; +export const LIVE_QUERY_EDITOR = 'kibanaCodeEditor'; export const OSQUERY_FLYOUT_BODY_EDITOR = '[data-test-subj="flyout-body-osquery"] .kibanaCodeEditor'; export const SUBMIT_BUTTON = '#submit-button'; diff --git a/x-pack/plugins/osquery/cypress/tasks/live_query.ts b/x-pack/plugins/osquery/cypress/tasks/live_query.ts index 6a342246517ac..d57f778e2c966 100644 --- a/x-pack/plugins/osquery/cypress/tasks/live_query.ts +++ b/x-pack/plugins/osquery/cypress/tasks/live_query.ts @@ -25,10 +25,10 @@ export const selectAllAgents = () => { }; export const clearInputQuery = () => - cy.get(LIVE_QUERY_EDITOR).click().type(`{selectall}{backspace}`); + cy.getBySel(LIVE_QUERY_EDITOR).click().type(`{selectall}{backspace}`); export const inputQuery = (query: string, options?: { parseSpecialCharSequences: boolean }) => - cy.get(LIVE_QUERY_EDITOR).type(query, options); + cy.getBySel(LIVE_QUERY_EDITOR).type(query, options); export const inputQueryInFlyout = ( query: string, From 65e65a834e56cf41d44140d9c4fef90167cbf926 Mon Sep 17 00:00:00 2001 From: mohamedhamed-ahmed Date: Fri, 10 Nov 2023 15:02:12 +0000 Subject: [PATCH 41/51] [Dataset quality] Creating initial plugin (#171009) Related to https://github.com/elastic/kibana/issues/169759. ## Summary This PR creates the initial plugin for Dataset Quality. The plugin has the basic boilerplate that allows us to continue working on the UI and Server sides in parallel. Further configs are to be added along with upcoming commits like: 1. Storybook 2. FTR configs --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/ftr_configs.yml | 1 - .github/CODEOWNERS | 1 + docs/developer/plugin-list.asciidoc | 4 +++ package.json | 1 + packages/kbn-optimizer/limits.yml | 1 + tsconfig.base.json | 2 ++ x-pack/.i18nrc.json | 1 + x-pack/plugins/dataset_quality/README.md | 3 ++ .../plugins/dataset_quality/common/index.ts | 8 +++++ .../dataset_quality/common/plugin_config.ts | 9 ++++++ x-pack/plugins/dataset_quality/jest.config.js | 15 +++++++++ x-pack/plugins/dataset_quality/kibana.jsonc | 16 ++++++++++ .../plugins/dataset_quality/public/index.ts | 16 ++++++++++ .../plugins/dataset_quality/public/plugin.ts | 31 +++++++++++++++++++ .../plugins/dataset_quality/public/types.ts | 18 +++++++++++ .../plugins/dataset_quality/server/index.ts | 10 ++++++ .../plugins/dataset_quality/server/plugin.ts | 14 +++++++++ x-pack/plugins/dataset_quality/tsconfig.json | 17 ++++++++++ yarn.lock | 4 +++ 19 files changed, 171 insertions(+), 1 deletion(-) create mode 100755 x-pack/plugins/dataset_quality/README.md create mode 100644 x-pack/plugins/dataset_quality/common/index.ts create mode 100644 x-pack/plugins/dataset_quality/common/plugin_config.ts create mode 100644 x-pack/plugins/dataset_quality/jest.config.js create mode 100644 x-pack/plugins/dataset_quality/kibana.jsonc create mode 100644 x-pack/plugins/dataset_quality/public/index.ts create mode 100644 x-pack/plugins/dataset_quality/public/plugin.ts create mode 100644 x-pack/plugins/dataset_quality/public/types.ts create mode 100644 x-pack/plugins/dataset_quality/server/index.ts create mode 100644 x-pack/plugins/dataset_quality/server/plugin.ts create mode 100644 x-pack/plugins/dataset_quality/tsconfig.json diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 95588c63f7489..cc67d14eefcf8 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -462,7 +462,6 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/alerts/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/entity_analytics/default_license/risk_engine/configs/ess.config.ts - - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/configs/serverless.config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 19b62559fa3c0..453cbc463b270 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -314,6 +314,7 @@ src/plugins/data_view_field_editor @elastic/kibana-data-discovery src/plugins/data_view_management @elastic/kibana-data-discovery src/plugins/data_views @elastic/kibana-data-discovery x-pack/plugins/data_visualizer @elastic/ml-ui +x-pack/plugins/dataset_quality @elastic/obs-ux-logs-team packages/kbn-datemath @elastic/kibana-data-discovery packages/deeplinks/analytics @elastic/kibana-data-discovery @elastic/kibana-presentation @elastic/kibana-visualizations packages/deeplinks/devtools @elastic/platform-deployment-management diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 868ef59f47966..df3f4c8ec855d 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -519,6 +519,10 @@ Plugin server-side only. Plugin has three main functions: |Adds drilldown capabilities to dashboard. Owned by the Kibana App team. +|{kib-repo}blob/{branch}/x-pack/plugins/dataset_quality/README.md[datasetQuality] +|In order to make ongoing maintenance of log collection easy we want to introduce the concept of dataset quality, where users can easily get an overview on the datasets they have with information such as integration, size, last activity, among others. + + |{kib-repo}blob/{branch}/x-pack/plugins/data_visualizer/README.md[dataVisualizer] |The data_visualizer plugin enables you to explore the fields in your data. diff --git a/package.json b/package.json index 3a2052836d5de..7db00b814d99d 100644 --- a/package.json +++ b/package.json @@ -364,6 +364,7 @@ "@kbn/data-view-management-plugin": "link:src/plugins/data_view_management", "@kbn/data-views-plugin": "link:src/plugins/data_views", "@kbn/data-visualizer-plugin": "link:x-pack/plugins/data_visualizer", + "@kbn/dataset-quality-plugin": "link:x-pack/plugins/dataset_quality", "@kbn/datemath": "link:packages/kbn-datemath", "@kbn/deeplinks-analytics": "link:packages/deeplinks/analytics", "@kbn/deeplinks-devtools": "link:packages/deeplinks/devtools", diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index de07bccf8bbcb..a3f99b4f93186 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -28,6 +28,7 @@ pageLoadAssetSize: dashboard: 82025 dashboardEnhanced: 65646 data: 454087 + datasetQuality: 35000 dataViewEditor: 28082 dataViewFieldEditor: 27000 dataViewManagement: 5100 diff --git a/tsconfig.base.json b/tsconfig.base.json index 40b1ede664328..c367ace533937 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -622,6 +622,8 @@ "@kbn/data-views-plugin/*": ["src/plugins/data_views/*"], "@kbn/data-visualizer-plugin": ["x-pack/plugins/data_visualizer"], "@kbn/data-visualizer-plugin/*": ["x-pack/plugins/data_visualizer/*"], + "@kbn/dataset-quality-plugin": ["x-pack/plugins/dataset_quality"], + "@kbn/dataset-quality-plugin/*": ["x-pack/plugins/dataset_quality/*"], "@kbn/datemath": ["packages/kbn-datemath"], "@kbn/datemath/*": ["packages/kbn-datemath/*"], "@kbn/deeplinks-analytics": ["packages/deeplinks/analytics"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 923d0cce0759d..bb14c06a53e36 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -20,6 +20,7 @@ "xpack.csp": "plugins/cloud_security_posture", "xpack.customBranding": "plugins/custom_branding", "xpack.dashboard": "plugins/dashboard_enhanced", + "xpack.datasetQuality": "plugins/dataset_quality", "xpack.discover": "plugins/discover_enhanced", "xpack.crossClusterReplication": "plugins/cross_cluster_replication", "xpack.elasticAssistant": "packages/kbn-elastic-assistant", diff --git a/x-pack/plugins/dataset_quality/README.md b/x-pack/plugins/dataset_quality/README.md new file mode 100755 index 0000000000000..cd5bfc30658d4 --- /dev/null +++ b/x-pack/plugins/dataset_quality/README.md @@ -0,0 +1,3 @@ +# Dataset Quality + +In order to make ongoing maintenance of log collection easy we want to introduce the concept of dataset quality, where users can easily get an overview on the datasets they have with information such as integration, size, last activity, among others. diff --git a/x-pack/plugins/dataset_quality/common/index.ts b/x-pack/plugins/dataset_quality/common/index.ts new file mode 100644 index 0000000000000..440e8780e6bf5 --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export type { DatasetQualityConfig } from './plugin_config'; diff --git a/x-pack/plugins/dataset_quality/common/plugin_config.ts b/x-pack/plugins/dataset_quality/common/plugin_config.ts new file mode 100644 index 0000000000000..d0dac3d6cfdbb --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/plugin_config.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualityConfig {} diff --git a/x-pack/plugins/dataset_quality/jest.config.js b/x-pack/plugins/dataset_quality/jest.config.js new file mode 100644 index 0000000000000..fdd27a97fc347 --- /dev/null +++ b/x-pack/plugins/dataset_quality/jest.config.js @@ -0,0 +1,15 @@ +/* + * 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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/x-pack/plugins/dataset_quality'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/dataset_quality', + coverageReporters: ['text', 'html'], + collectCoverageFrom: ['/x-pack/plugins/dataset_quality/{common,public}/**/*.{ts,tsx}'], +}; diff --git a/x-pack/plugins/dataset_quality/kibana.jsonc b/x-pack/plugins/dataset_quality/kibana.jsonc new file mode 100644 index 0000000000000..133537a76d831 --- /dev/null +++ b/x-pack/plugins/dataset_quality/kibana.jsonc @@ -0,0 +1,16 @@ +{ + "type": "plugin", + "id": "@kbn/dataset-quality-plugin", + "owner": "@elastic/obs-ux-logs-team", + "description": "This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have.", + "plugin": { + "id": "datasetQuality", + "server": true, + "browser": true, + "configPath": ["xpack", "datasetQuality"], + "requiredPlugins": ["data", "kibanaReact", "kibanaUtils", "controls", "embeddable", "share"], + "optionalPlugins": [], + "requiredBundles": [], + "extraPublicDirs": ["common"] + } +} diff --git a/x-pack/plugins/dataset_quality/public/index.ts b/x-pack/plugins/dataset_quality/public/index.ts new file mode 100644 index 0000000000000..339be1ec1de9b --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/index.ts @@ -0,0 +1,16 @@ +/* + * 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 type { PluginInitializerContext } from '@kbn/core/public'; +import { DatasetQualityConfig } from '../common/plugin_config'; +import { DatasetQualityPlugin } from './plugin'; + +export type { DatasetQualityPluginSetup, DatasetQualityPluginStart } from './types'; + +export function plugin(context: PluginInitializerContext) { + return new DatasetQualityPlugin(context); +} diff --git a/x-pack/plugins/dataset_quality/public/plugin.ts b/x-pack/plugins/dataset_quality/public/plugin.ts new file mode 100644 index 0000000000000..520c02481cd60 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/plugin.ts @@ -0,0 +1,31 @@ +/* + * 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 { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; +import { + DatasetQualityPluginSetup, + DatasetQualityPluginStart, + DatasetQualitySetupDependencies, + DatasetQualityStartDependencies, +} from './types'; + +export class DatasetQualityPlugin + implements Plugin +{ + constructor(context: PluginInitializerContext) {} + + public setup(core: CoreSetup, plugins: DatasetQualitySetupDependencies) { + return {}; + } + + public start( + core: CoreStart, + plugins: DatasetQualityStartDependencies + ): DatasetQualityPluginStart { + return {}; + } +} diff --git a/x-pack/plugins/dataset_quality/public/types.ts b/x-pack/plugins/dataset_quality/public/types.ts new file mode 100644 index 0000000000000..2d57bd6bb1b2e --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/types.ts @@ -0,0 +1,18 @@ +/* + * 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. + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualityPluginSetup {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualityPluginStart {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualityStartDependencies {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DatasetQualitySetupDependencies {} diff --git a/x-pack/plugins/dataset_quality/server/index.ts b/x-pack/plugins/dataset_quality/server/index.ts new file mode 100644 index 0000000000000..17b028aa19431 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/index.ts @@ -0,0 +1,10 @@ +/* + * 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 { DatasetQualityServerPlugin } from './plugin'; + +export const plugin = () => new DatasetQualityServerPlugin(); diff --git a/x-pack/plugins/dataset_quality/server/plugin.ts b/x-pack/plugins/dataset_quality/server/plugin.ts new file mode 100644 index 0000000000000..b673fed3ad622 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/plugin.ts @@ -0,0 +1,14 @@ +/* + * 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 { Plugin } from '@kbn/core/server'; + +export class DatasetQualityServerPlugin implements Plugin { + setup() {} + + start() {} +} diff --git a/x-pack/plugins/dataset_quality/tsconfig.json b/x-pack/plugins/dataset_quality/tsconfig.json new file mode 100644 index 0000000000000..efe7ece5983ac --- /dev/null +++ b/x-pack/plugins/dataset_quality/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "../../../typings/**/*", + "common/**/*", + "public/**/*", + "server/**/*.ts", + "../../typings/**/*" + ], + "kbn_references": [ + "@kbn/core", + ], + "exclude": ["target/**/*"] +} diff --git a/yarn.lock b/yarn.lock index a2d0d454a4d34..dbf3facc5ec10 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4148,6 +4148,10 @@ version "0.0.0" uid "" +"@kbn/dataset-quality-plugin@link:x-pack/plugins/dataset_quality": + version "0.0.0" + uid "" + "@kbn/datemath@link:packages/kbn-datemath": version "0.0.0" uid "" From f7ab8833198ad1d0c2dc2f594e69eb3d7c44f859 Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Fri, 10 Nov 2023 16:12:31 +0100 Subject: [PATCH 42/51] [Index Management] Add data retention support to index template (#170609) --- .../template_clone.test.tsx | 9 +- .../template_create.test.tsx | 22 +++++ .../template_edit.test.tsx | 11 +++ .../template_form.helpers.ts | 19 +++- .../common/lib/data_stream_serialization.ts | 42 +++++++- .../common/lib/template_serialization.ts | 2 + .../common/types/data_streams.ts | 7 ++ .../index_management/common/types/index.ts | 8 +- .../common/types/templates.ts | 3 + .../shared/fields}/unit_field.tsx | 2 +- .../application/components/shared/index.ts | 4 + .../template_form/steps/step_logistics.tsx | 96 ++++++++++++++++++- .../template_form/steps/step_review.tsx | 18 ++++ .../template_form/template_form.tsx | 9 +- .../template_form/template_form_schemas.tsx | 79 +++++++++++++++ .../edit_data_retention_modal.tsx | 2 +- .../template_details/tabs/tab_summary.tsx | 21 ++++ .../routes/api/templates/validate_schemas.ts | 6 ++ .../test/fixtures/template.ts | 10 +- .../management/index_management/templates.js | 58 ++++++++++- .../create_index_template.ts | 53 ++++++++++ .../index_templates_tab/index.ts | 14 +++ 22 files changed, 476 insertions(+), 19 deletions(-) rename x-pack/plugins/index_management/public/application/{sections/home/data_stream_list/edit_data_retention_modal => components/shared/fields}/unit_field.tsx (97%) create mode 100644 x-pack/test/functional/apps/index_management/index_templates_tab/create_index_template.ts create mode 100644 x-pack/test/functional/apps/index_management/index_templates_tab/index.ts diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx index ecd3e617635f1..91afa2ff3947a 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx @@ -12,7 +12,7 @@ import { API_BASE_PATH } from '../../../common/constants'; import { getComposableTemplate } from '../../../test/fixtures'; import { setupEnvironment } from '../helpers'; -import { TEMPLATE_NAME, INDEX_PATTERNS as DEFAULT_INDEX_PATTERNS, MAPPINGS } from './constants'; +import { TEMPLATE_NAME, INDEX_PATTERNS as DEFAULT_INDEX_PATTERNS } from './constants'; import { setup } from './template_clone.helpers'; import { TemplateFormTestBed } from './template_form.helpers'; @@ -37,9 +37,7 @@ jest.mock('@elastic/eui', () => { const templateToClone = getComposableTemplate({ name: TEMPLATE_NAME, indexPatterns: ['indexPattern1'], - template: { - mappings: MAPPINGS, - }, + template: {}, allowAutoCreate: true, }); @@ -98,7 +96,7 @@ describe('', () => { actions.clickNextButton(); }); - const { priority, version, _kbnMeta, allowAutoCreate } = templateToClone; + const { template, priority, version, _kbnMeta, allowAutoCreate } = templateToClone; expect(httpSetup.post).toHaveBeenLastCalledWith( `${API_BASE_PATH}/index_templates`, expect.objectContaining({ @@ -109,6 +107,7 @@ describe('', () => { version, allowAutoCreate, _kbnMeta, + template, }), }) ); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx index 7558ae7ce272a..fd373efb6d17d 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx @@ -532,6 +532,12 @@ describe('', () => { await actions.completeStepOne({ name: TEMPLATE_NAME, indexPatterns: DEFAULT_INDEX_PATTERNS, + dataStream: {}, + lifecycle: { + enabled: true, + value: 1, + unit: 'd', + }, allowAutoCreate: true, }); // Component templates @@ -560,6 +566,7 @@ describe('', () => { name: TEMPLATE_NAME, indexPatterns: DEFAULT_INDEX_PATTERNS, allowAutoCreate: true, + dataStream: {}, _kbnMeta: { type: 'default', hasDatastream: false, @@ -582,6 +589,10 @@ describe('', () => { }, }, aliases: ALIASES, + lifecycle: { + enabled: true, + data_retention: '1d', + }, }, }), }) @@ -621,6 +632,11 @@ describe('', () => { name: TEMPLATE_NAME, indexPatterns: DEFAULT_INDEX_PATTERNS, dataStream: {}, + lifecycle: { + enabled: true, + value: 1, + unit: 'd', + }, }); await act(async () => { @@ -631,6 +647,12 @@ describe('', () => { `${API_BASE_PATH}/index_templates/simulate`, expect.objectContaining({ body: JSON.stringify({ + template: { + lifecycle: { + enabled: true, + data_retention: '1d', + }, + }, index_patterns: DEFAULT_INDEX_PATTERNS, data_stream: {}, allow_auto_create: false, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx index 157cec2f91cd4..56cfbf7968ecc 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx @@ -119,6 +119,11 @@ describe('', () => { name: 'test', indexPatterns: ['myPattern*'], version: 1, + lifecycle: { + enabled: true, + value: 1, + unit: 'd', + }, }); // Component templates await actions.completeStepTwo(); @@ -150,6 +155,12 @@ describe('', () => { hasDatastream: true, isLegacy: false, }, + template: { + lifecycle: { + enabled: true, + data_retention: '1d', + }, + }, }), }) ); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_form.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_form.helpers.ts index 0974ee79346ed..8b98fb769959f 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_form.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_form.helpers.ts @@ -146,6 +146,7 @@ export const formSetup = async (initTestBed: SetupFunc) => { priority, version, dataStream, + lifecycle, allowAutoCreate, }: Partial = {}) => { const { component, form, find } = testBed; @@ -184,12 +185,27 @@ export const formSetup = async (initTestBed: SetupFunc) => { if (version) { form.setInputValue('versionField.input', JSON.stringify(version)); } + }); + component.update(); + if (lifecycle && lifecycle.enabled) { + act(() => { + form.toggleEuiSwitch('dataRetentionToggle.input'); + }); + component.update(); + + act(() => { + form.setInputValue('valueDataRetentionField', String(lifecycle.value)); + }); + } + + await act(async () => { if (allowAutoCreate) { form.toggleEuiSwitch('allowAutoCreateField.input'); } clickNextButton(); + jest.advanceTimersByTime(0); }); component.update(); @@ -215,7 +231,6 @@ export const formSetup = async (initTestBed: SetupFunc) => { await act(async () => { clickNextButton(); - jest.advanceTimersByTime(0); }); component.update(); @@ -337,6 +352,7 @@ export type TestSubjects = | 'orderField.input' | 'priorityField.input' | 'dataStreamField.input' + | 'dataRetentionToggle.input' | 'allowAutoCreateField.input' | 'pageTitle' | 'previewTab' @@ -361,6 +377,7 @@ export type TestSubjects = | 'aliasesEditor' | 'settingsEditor' | 'versionField.input' + | 'valueDataRetentionField' | 'mappingsEditor.formTab' | 'mappingsEditor.advancedConfiguration.sizeEnabledToggle' | 'previewIndexTemplate'; diff --git a/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts index d7bd1d9e92f95..ceedd072139aa 100644 --- a/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts +++ b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { DataStream, EnhancedDataStreamFromEs, Health } from '../types'; +import { DataStream, EnhancedDataStreamFromEs, Health, DataRetention } from '../types'; export function deserializeDataStream(dataStreamFromEs: EnhancedDataStreamFromEs): DataStream { const { @@ -83,3 +83,43 @@ export const splitSizeAndUnits = (field: string): { size: string; unit: string } unit, }; }; + +export const serializeAsESLifecycle = (lifecycle?: DataRetention): DataStream['lifecycle'] => { + if (!lifecycle || !lifecycle?.enabled) { + return undefined; + } + + const { infiniteDataRetention, value, unit } = lifecycle; + + if (infiniteDataRetention) { + return { + enabled: true, + }; + } + + return { + enabled: true, + data_retention: `${value}${unit}`, + }; +}; + +export const deserializeESLifecycle = (lifecycle?: DataStream['lifecycle']): DataRetention => { + if (!lifecycle || !lifecycle?.enabled) { + return { enabled: false }; + } + + if (!lifecycle.data_retention) { + return { + enabled: true, + infiniteDataRetention: true, + }; + } + + const { size, unit } = splitSizeAndUnits(lifecycle.data_retention as string); + + return { + enabled: true, + value: Number(size), + unit, + }; +}; diff --git a/x-pack/plugins/index_management/common/lib/template_serialization.ts b/x-pack/plugins/index_management/common/lib/template_serialization.ts index 7c75ec3c56f97..bb871b1556d30 100644 --- a/x-pack/plugins/index_management/common/lib/template_serialization.ts +++ b/x-pack/plugins/index_management/common/lib/template_serialization.ts @@ -12,6 +12,7 @@ import { TemplateListItem, TemplateType, } from '../types'; +import { deserializeESLifecycle } from './data_stream_serialization'; const hasEntries = (data: object = {}) => Object.entries(data).length > 0; @@ -69,6 +70,7 @@ export function deserializeTemplate( name, version, priority, + ...(template.lifecycle ? { lifecycle: deserializeESLifecycle(template.lifecycle) } : {}), indexPatterns: indexPatterns.sort(), template, ilmPolicy: settings?.index?.lifecycle, diff --git a/x-pack/plugins/index_management/common/types/data_streams.ts b/x-pack/plugins/index_management/common/types/data_streams.ts index 80a4be29ee924..f3890dd032a5a 100644 --- a/x-pack/plugins/index_management/common/types/data_streams.ts +++ b/x-pack/plugins/index_management/common/types/data_streams.ts @@ -75,3 +75,10 @@ export interface DataStreamIndex { preferILM: boolean; managedBy: string; } + +export interface DataRetention { + enabled: boolean; + infiniteDataRetention?: boolean; + value?: number; + unit?: string; +} diff --git a/x-pack/plugins/index_management/common/types/index.ts b/x-pack/plugins/index_management/common/types/index.ts index f3f2315cdd15b..ef2e8a389c079 100644 --- a/x-pack/plugins/index_management/common/types/index.ts +++ b/x-pack/plugins/index_management/common/types/index.ts @@ -13,7 +13,13 @@ export * from './mappings'; export * from './templates'; -export type { EnhancedDataStreamFromEs, Health, DataStream, DataStreamIndex } from './data_streams'; +export type { + EnhancedDataStreamFromEs, + Health, + DataStream, + DataStreamIndex, + DataRetention, +} from './data_streams'; export * from './component_templates'; diff --git a/x-pack/plugins/index_management/common/types/templates.ts b/x-pack/plugins/index_management/common/types/templates.ts index 53e120c88c96f..7d85bb4d20ae0 100644 --- a/x-pack/plugins/index_management/common/types/templates.ts +++ b/x-pack/plugins/index_management/common/types/templates.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { DataRetention, DataStream } from './data_streams'; import { IndexSettings } from './indices'; import { Aliases } from './aliases'; import { Mappings } from './mappings'; @@ -18,6 +19,7 @@ export interface TemplateSerialized { settings?: IndexSettings; aliases?: Aliases; mappings?: Mappings; + lifecycle?: DataStream['lifecycle']; }; composed_of?: string[]; version?: number; @@ -40,6 +42,7 @@ export interface TemplateDeserialized { aliases?: Aliases; mappings?: Mappings; }; + lifecycle?: DataRetention; composedOf?: string[]; // Composable template only version?: number; priority?: number; // Composable template only diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/unit_field.tsx b/x-pack/plugins/index_management/public/application/components/shared/fields/unit_field.tsx similarity index 97% rename from x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/unit_field.tsx rename to x-pack/plugins/index_management/public/application/components/shared/fields/unit_field.tsx index fc12b2ce9edaf..8a01118a5f095 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/unit_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/shared/fields/unit_field.tsx @@ -7,7 +7,7 @@ import React, { FunctionComponent, useState } from 'react'; import { EuiFilterSelectItem, EuiPopover, EuiButtonEmpty } from '@elastic/eui'; -import { UseField } from '../../../../../shared_imports'; +import { UseField } from '../../../../shared_imports'; interface Props { path: string; diff --git a/x-pack/plugins/index_management/public/application/components/shared/index.ts b/x-pack/plugins/index_management/public/application/components/shared/index.ts index 06899e202ef82..66681ab20c177 100644 --- a/x-pack/plugins/index_management/public/application/components/shared/index.ts +++ b/x-pack/plugins/index_management/public/application/components/shared/index.ts @@ -6,6 +6,7 @@ */ export type { CommonWizardSteps } from './components'; + export { TabAliases, TabMappings, @@ -15,3 +16,6 @@ export { StepSettingsContainer, TemplateContentIndicator, } from './components'; + +export { UnitField } from './fields/unit_field'; +export { timeUnits } from '../../constants/time_units'; diff --git a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx index 6dd062ba42674..5307852d3c9e3 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx @@ -26,7 +26,10 @@ import { Field, Forms, JsonEditorField, + NumericField, } from '../../../../shared_imports'; +import { UnitField, timeUnits } from '../../shared'; +import { DataRetention } from '../../../../../common'; import { documentationService } from '../../../services/documentation'; import { schemas, nameConfig, nameConfigWithoutValidations } from '../template_form_schemas'; @@ -112,6 +115,19 @@ function getFieldsMeta(esDocsBase: string) { }), testSubject: 'versionField', }, + dataRetention: { + title: i18n.translate('xpack.idxMgmt.templateForm.stepLogistics.dataRetentionTitle', { + defaultMessage: 'Data retention', + }), + description: i18n.translate( + 'xpack.idxMgmt.templateForm.stepLogistics.dataRetentionDescription', + { + defaultMessage: + 'Data will be kept at least this long before being automatically deleted.', + } + ), + unitTestSubject: 'unitDataRetentionField', + }, allowAutoCreate: { title: i18n.translate('xpack.idxMgmt.templateForm.stepLogistics.allowAutoCreateTitle', { defaultMessage: 'Allow auto create', @@ -177,9 +193,18 @@ export const StepLogistics: React.FunctionComponent = React.memo( getFormData, } = form; - const [{ addMeta }] = useFormData<{ addMeta: boolean }>({ + const [{ addMeta, doCreateDataStream, lifecycle }] = useFormData<{ + addMeta: boolean; + lifecycle: DataRetention; + doCreateDataStream: boolean; + }>({ form, - watch: 'addMeta', + watch: [ + 'addMeta', + 'lifecycle.enabled', + 'lifecycle.infiniteDataRetention', + 'doCreateDataStream', + ], }); /** @@ -198,8 +223,16 @@ export const StepLogistics: React.FunctionComponent = React.memo( }); }, [onChange, isFormValid, validate, getFormData]); - const { name, indexPatterns, createDataStream, order, priority, version, allowAutoCreate } = - getFieldsMeta(documentationService.getEsDocsBase()); + const { + name, + indexPatterns, + createDataStream, + order, + priority, + version, + dataRetention, + allowAutoCreate, + } = getFieldsMeta(documentationService.getEsDocsBase()); return ( <> @@ -272,6 +305,61 @@ export const StepLogistics: React.FunctionComponent = React.memo( )} + {/* + Since data stream and data retention are settings that are only allowed for non legacy, + we only need to check if data stream is set to true to show the data retention. + */} + {doCreateDataStream && ( + + {dataRetention.description} + + + + } + > + {lifecycle?.enabled && ( + + } + componentProps={{ + euiFieldProps: { + disabled: lifecycle?.infiniteDataRetention, + 'data-test-subj': 'valueDataRetentionField', + min: 1, + append: ( + + ), + }, + }} + /> + )} + + )} + {/* Order */} {isLegacy && ( diff --git a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx index 3ecea64a73e4d..7d01966d207e9 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_review.tsx @@ -27,9 +27,11 @@ import { serializers } from '../../../../shared_imports'; import { serializeLegacyTemplate, serializeTemplate } from '../../../../../common/lib'; import { TemplateDeserialized, getTemplateParameter, Aliases } from '../../../../../common'; import { SimulateTemplate } from '../../index_templates'; +import { getLifecycleValue } from '../../../lib/data_streams'; import { WizardSection } from '../template_form'; const { stripEmptyFields } = serializers; +const INFINITE_AS_ICON = true; const NoneDescriptionText = () => ( = React.memo( indexPatterns, version, order, + template: indexTemplate, priority, allowAutoCreate, composedOf, @@ -109,6 +112,7 @@ export const StepReview: React.FunctionComponent = React.memo( const serializedMappings = getTemplateParameter(serializedTemplate, 'mappings'); const serializedSettings = getTemplateParameter(serializedTemplate, 'settings'); const serializedAliases = getTemplateParameter(serializedTemplate, 'aliases'); + const serializedLifecycle = (indexTemplate as TemplateDeserialized)?.lifecycle; const numIndexPatterns = indexPatterns!.length; @@ -274,6 +278,20 @@ export const StepReview: React.FunctionComponent = React.memo( {getDescriptionText(serializedAliases)} + {isLegacy !== true && serializedLifecycle?.enabled && ( + <> + + + + + {getLifecycleValue(serializedLifecycle, INFINITE_AS_ICON)} + + + )} + {/* Metadata (optional) */} {isLegacy !== true && _meta && ( <> diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx index 13797f1dfc05b..9d494e0a558d9 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx @@ -21,6 +21,7 @@ import { } from '../shared'; import { documentationService } from '../../services/documentation'; import { SectionError } from '../section_error'; +import { serializeAsESLifecycle } from '../../../../common/lib/data_stream_serialization'; import { SimulateTemplateFlyoutContent, SimulateTemplateProps, @@ -190,6 +191,9 @@ export const TemplateForm = ({ if (Object.keys(outputTemplate.template).length === 0) { delete outputTemplate.template; } + if (outputTemplate.lifecycle) { + delete outputTemplate.lifecycle; + } } return outputTemplate; @@ -206,10 +210,13 @@ export const TemplateForm = ({ settings: wizardData.settings, mappings: wizardData.mappings, aliases: wizardData.aliases, + lifecycle: wizardData.logistics.lifecycle + ? serializeAsESLifecycle(wizardData.logistics.lifecycle) + : undefined, }, }; - return cleanupTemplateObject(outputTemplate); + return cleanupTemplateObject(outputTemplate as TemplateDeserialized); }, [] ); diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx index 454a0ca4b5b0a..383b60c365086 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form_schemas.tsx @@ -158,6 +158,85 @@ export const schemas: Record = { }), formatters: [toInt], }, + + 'lifecycle.enabled': { + type: FIELD_TYPES.TOGGLE, + label: i18n.translate('xpack.idxMgmt.templateForm.stepLogistics.enableDataRetentionLabel', { + defaultMessage: 'Enable data retention', + }), + defaultValue: false, + }, + 'lifecycle.infiniteDataRetention': { + type: FIELD_TYPES.TOGGLE, + label: i18n.translate('xpack.idxMgmt.templateForm.stepLogistics.infiniteDataRetentionLabel', { + defaultMessage: 'Keep data indefinitely', + }), + defaultValue: false, + }, + 'lifecycle.value': { + type: FIELD_TYPES.TEXT, + label: i18n.translate( + 'xpack.idxMgmt.templateForm.stepLogistics.fieldDataRetentionValueLabel', + { + defaultMessage: 'Data Retention', + } + ), + formatters: [toInt], + validations: [ + { + validator: ({ value, formData }) => { + // If infiniteRetentionPeriod is set, we dont need to validate the data retention field + if (formData['lifecycle.infiniteDataRetention']) { + return undefined; + } + + if (!value) { + return { + message: i18n.translate( + 'xpack.idxMgmt.templateForm.stepLogistics.dataRetentionFieldRequiredError', + { + defaultMessage: 'A data retention value is required.', + } + ), + }; + } + + if (value <= 0) { + return { + message: i18n.translate( + 'xpack.idxMgmt.templateForm.stepLogistics.dataRetentionFieldNonNegativeError', + { + defaultMessage: `A positive value is required.`, + } + ), + }; + } + + if (value % 1 !== 0) { + return { + message: i18n.translate( + 'xpack.idxMgmt.templateForm.stepLogistics.dataRetentionFieldDecimalError', + { + defaultMessage: `The value should be an integer number.`, + } + ), + }; + } + }, + }, + ], + }, + 'lifecycle.unit': { + type: FIELD_TYPES.TEXT, + label: i18n.translate( + 'xpack.idxMgmt.templateForm.stepLogistics.fieldDataRetentionUnitLabel', + { + defaultMessage: 'Time unit', + } + ), + defaultValue: 'd', + }, + allowAutoCreate: { type: FIELD_TYPES.TOGGLE, label: i18n.translate('xpack.idxMgmt.templateForm.stepLogistics.fieldAllowAutoCreateLabel', { diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx index a1ac650ba0cb7..713fdc8a709d5 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx @@ -42,7 +42,7 @@ import { splitSizeAndUnits, DataStream } from '../../../../../../common'; import { timeUnits } from '../../../../constants/time_units'; import { isDSLWithILMIndices } from '../../../../lib/data_streams'; import { useAppContext } from '../../../../app_context'; -import { UnitField } from './unit_field'; +import { UnitField } from '../../../../components/shared'; import { updateDataRetention } from '../../../../services/api'; interface Props { diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx index 5e90a97fbcdb0..492c6f426acd5 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx @@ -20,6 +20,8 @@ import { EuiCodeBlock, EuiSpacer, } from '@elastic/eui'; +import { serializeAsESLifecycle } from '../../../../../../../common/lib/data_stream_serialization'; +import { getLifecycleValue } from '../../../../../lib/data_streams'; import { TemplateDeserialized } from '../../../../../../../common'; import { ILM_PAGES_POLICY_EDIT } from '../../../../../constants'; import { useIlmLocator } from '../../../../../services/use_ilm_locator'; @@ -28,6 +30,7 @@ interface Props { templateDetails: TemplateDeserialized; } +const INFINITE_AS_ICON = true; const i18nTexts = { yes: i18n.translate('xpack.idxMgmt.templateDetails.summaryTab.yesDescriptionText', { defaultMessage: 'Yes', @@ -194,6 +197,24 @@ export const TabSummary: React.FunctionComponent = ({ templateDetails }) {version || version === 0 ? version : i18nTexts.none} + {/* Data retention */} + {hasDatastream && templateDetails?.lifecycle && ( + <> + + + + + {getLifecycleValue( + serializeAsESLifecycle(templateDetails.lifecycle), + INFINITE_AS_ICON + )} + + + )} + {/* Allow auto create */} {isLegacy !== true && ( <> diff --git a/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts b/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts index d4236fb9051c4..b9020585ed676 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/validate_schemas.ts @@ -19,6 +19,12 @@ export const templateSchema = schema.object({ settings: schema.maybe(schema.object({}, { unknowns: 'allow' })), aliases: schema.maybe(schema.object({}, { unknowns: 'allow' })), mappings: schema.maybe(schema.object({}, { unknowns: 'allow' })), + lifecycle: schema.maybe( + schema.object({ + enabled: schema.boolean(), + data_retention: schema.maybe(schema.string()), + }) + ), }) ), composedOf: schema.maybe(schema.arrayOf(schema.string())), diff --git a/x-pack/plugins/index_management/test/fixtures/template.ts b/x-pack/plugins/index_management/test/fixtures/template.ts index 19a3b30c84c6b..01f83e2d76ff5 100644 --- a/x-pack/plugins/index_management/test/fixtures/template.ts +++ b/x-pack/plugins/index_management/test/fixtures/template.ts @@ -7,6 +7,7 @@ import { getRandomString, getRandomNumber } from '@kbn/test-jest-helpers'; import { TemplateDeserialized, TemplateType, TemplateListItem } from '../../common'; +import { IndexSettings, Aliases, Mappings, DataStream } from '../../common/types'; const objHasProperties = (obj?: Record): boolean => { return obj === undefined || Object.keys(obj).length === 0 ? false : true; @@ -17,7 +18,7 @@ export const getComposableTemplate = ({ version = getRandomNumber(), priority = getRandomNumber(), indexPatterns = [], - template: { settings, aliases, mappings } = {}, + template: { settings, aliases, mappings, lifecycle } = {}, hasDatastream = false, isLegacy = false, type = 'default', @@ -27,6 +28,12 @@ export const getComposableTemplate = ({ isLegacy?: boolean; type?: TemplateType; hasDatastream: boolean; + template?: { + settings?: IndexSettings; + aliases?: Aliases; + mappings?: Mappings; + lifecycle?: DataStream['lifecycle']; + }; } > = {}): TemplateDeserialized => { const indexTemplate = { @@ -39,6 +46,7 @@ export const getComposableTemplate = ({ aliases, mappings, settings, + lifecycle, }, _kbnMeta: { type, diff --git a/x-pack/test/api_integration/apis/management/index_management/templates.js b/x-pack/test/api_integration/apis/management/index_management/templates.js index 2c7ba54bb9c98..bb4007852b037 100644 --- a/x-pack/test/api_integration/apis/management/index_management/templates.js +++ b/x-pack/test/api_integration/apis/management/index_management/templates.js @@ -30,9 +30,26 @@ export default function ({ getService }) { after(() => Promise.all([cleanUpEsResources(), cleanUpTemplates()])); describe('get all', () => { - const templateName = `template-${getRandomString()}`; - const indexTemplate = getTemplatePayload(templateName, [getRandomString()]); - const legacyTemplate = getTemplatePayload(templateName, [getRandomString()], true); + const indexTemplate = getTemplatePayload(`template-${getRandomString()}`, [ + getRandomString(), + ]); + const legacyTemplate = getTemplatePayload( + `template-${getRandomString()}`, + [getRandomString()], + true + ); + const tmpTemplate = getTemplatePayload(`template-${getRandomString()}`, [getRandomString()]); + const indexTemplateWithLifecycle = { + ...tmpTemplate, + dataStream: {}, + template: { + ...tmpTemplate.template, + lifecycle: { + enabled: true, + data_retention: '10d', + }, + }, + }; beforeEach(async () => { const res1 = await createTemplate(indexTemplate); @@ -44,6 +61,11 @@ export default function ({ getService }) { if (res2.status !== 200) { throw new Error(res2.body.message); } + + const res3 = await createTemplate(indexTemplateWithLifecycle); + if (res3.status !== 200) { + throw new Error(res3.body.message); + } }); it('should list all the index templates with the expected parameters', async () => { @@ -107,6 +129,36 @@ export default function ({ getService }) { ].sort(); expect(Object.keys(legacyTemplateFound).sort()).to.eql(expectedLegacyKeys); + + // Index template with lifecycle + const templateWithLifecycle = allTemplates.templates.find( + (template) => template.name === indexTemplateWithLifecycle.name + ); + + if (!templateWithLifecycle) { + throw new Error( + `Index template with lifecycle "${ + indexTemplateWithLifecycle.name + }" not found in ${JSON.stringify(allTemplates.templates, null, 2)}` + ); + } + + const expectedWithLifecycleKeys = [ + 'name', + 'indexPatterns', + 'lifecycle', + 'hasSettings', + 'hasAliases', + 'hasMappings', + 'ilmPolicy', + 'priority', + 'composedOf', + 'dataStream', + 'version', + '_kbnMeta', + ].sort(); + + expect(Object.keys(templateWithLifecycle).sort()).to.eql(expectedWithLifecycleKeys); }); }); diff --git a/x-pack/test/functional/apps/index_management/index_templates_tab/create_index_template.ts b/x-pack/test/functional/apps/index_management/index_templates_tab/create_index_template.ts new file mode 100644 index 0000000000000..9b9d869fb9980 --- /dev/null +++ b/x-pack/test/functional/apps/index_management/index_templates_tab/create_index_template.ts @@ -0,0 +1,53 @@ +/* + * 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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default ({ getPageObjects, getService }: FtrProviderContext) => { + const pageObjects = getPageObjects(['common', 'indexManagement', 'header']); + const log = getService('log'); + const security = getService('security'); + const testSubjects = getService('testSubjects'); + + const INDEX_TEMPLATE_NAME = `test-index-template`; + + describe('Create index template', function () { + before(async () => { + await log.debug('Navigating to the index templates tab'); + await security.testUser.setRoles(['index_management_user']); + await pageObjects.common.navigateToApp('indexManagement'); + // Navigate to the data streams tab + await pageObjects.indexManagement.changeTabs('templatesTab'); + await pageObjects.header.waitUntilLoadingHasFinished(); + // Click create template button + await testSubjects.click('createTemplateButton'); + }); + + it('can create an index template with data retention', async () => { + // Complete required fields from step 1 + await testSubjects.setValue('nameField', INDEX_TEMPLATE_NAME); + await testSubjects.setValue('indexPatternsField', 'test-1'); + // Enable data stream + await testSubjects.click('dataStreamField > input'); + // Enable data retention + await testSubjects.click('dataRetentionToggle > input'); + // Set the retention to 7 hours + await testSubjects.setValue('valueDataRetentionField', '7'); + await testSubjects.click('show-filters-button'); + await testSubjects.click('filter-option-h'); + // Navigate to the last step of the wizard + await testSubjects.click('nextButton'); + await testSubjects.click('nextButton'); + await testSubjects.click('nextButton'); + await testSubjects.click('nextButton'); + await testSubjects.click('nextButton'); + + expect(await testSubjects.getVisibleText('lifecycleValue')).to.be('7 hours'); + }); + }); +}; diff --git a/x-pack/test/functional/apps/index_management/index_templates_tab/index.ts b/x-pack/test/functional/apps/index_management/index_templates_tab/index.ts new file mode 100644 index 0000000000000..992c2094c037e --- /dev/null +++ b/x-pack/test/functional/apps/index_management/index_templates_tab/index.ts @@ -0,0 +1,14 @@ +/* + * 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 { FtrProviderContext } from '../../../ftr_provider_context'; + +export default ({ loadTestFile }: FtrProviderContext) => { + describe('Index Management: index templates tab', function () { + loadTestFile(require.resolve('./create_index_template')); + }); +}; From 3c0ba20369d9582e9fcff69e27d6932a0d991646 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Fri, 10 Nov 2023 08:20:25 -0700 Subject: [PATCH 43/51] [maps] fix vector tile layer with joins stuck in loading state when not visible (#170984) Closes https://github.com/elastic/kibana/issues/170983 ### Test instructions 1. Download world countries geojson from https://maps.elastic.co/v8.12/index.html?locale=en#file/world_countries 2. upload downloaded world countries 3. create new map 4. add "Choropleth" layer 5. Set boundaries source to "Points, lines, and polygons from elasticsearch". Select world countries data view. Set join field to "iso2" 6. Set statistics view to kibana sample web logs. Set join field to "geo.src" 7. minimize layer TOC 8. save map and re-open. 9. Minimized layer legend icon should stop showing loading state once EMS base map is loaded --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../layers/layer_group/layer_group.tsx | 4 + .../geojson_vector_layer.test.ts | 12 + .../geojson_vector_layer.tsx | 4 + .../mvt_vector_layer.test.tsx | 227 ++++++++---------- .../mvt_vector_layer/mvt_vector_layer.tsx | 4 + 5 files changed, 127 insertions(+), 124 deletions(-) diff --git a/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx b/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx index 54ead3de1cbd6..7b7ac229f154e 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx +++ b/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx @@ -284,6 +284,10 @@ export class LayerGroup implements ILayer { } isLayerLoading(zoom: number): boolean { + if (!this.isVisible()) { + return false; + } + return this._children.some((child) => { return child.isLayerLoading(zoom); }); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.test.ts index 6717a04bc80d0..cf558c33458ce 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.test.ts @@ -75,6 +75,18 @@ describe('isLayerLoading', () => { }); describe('joins', () => { + test('should return false when layer is not visible', () => { + const layer = new GeoJsonVectorLayer({ + customIcons: [], + joins: [mockJoin], + layerDescriptor: { + visible: false, + } as unknown as VectorLayerDescriptor, + source: {} as unknown as IVectorSource, + }); + expect(layer.isLayerLoading(1)).toBe(false); + }); + describe('source data loaded with no features', () => { test('should return false when join loading has not started', () => { const layer = new GeoJsonVectorLayer({ diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx index 78d1ac7442a95..4faa32668f7de 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx @@ -61,6 +61,10 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { } isLayerLoading(zoom: number) { + if (!this.isVisible() || !this.showAtZoomLevel(zoom)) { + return false; + } + const isSourceLoading = super.isLayerLoading(zoom); if (isSourceLoading) { return true; diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.test.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.test.tsx index 4347452c8d22e..69ac1a00068f2 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.test.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.test.tsx @@ -110,139 +110,118 @@ describe('isLayerLoading', () => { dataRequestMetaAtStart: undefined, dataRequestToken: undefined, }; - test('should be true when tile loading has not started', () => { - const layer = new MvtVectorLayer({ - customIcons: [], - layerDescriptor: { - __dataRequests: [sourceDataRequestDescriptor], - } as unknown as VectorLayerDescriptor, - source: { - getMaxZoom: () => { - return 24; - }, - getMinZoom: () => { - return 0; - }, - } as unknown as IVectorSource, + const mockSource = { + getMaxZoom: () => { + return 24; + }, + getMinZoom: () => { + return 0; + }, + } as unknown as IVectorSource; + + describe('no joins', () => { + test('should be true when tile loading has not started', () => { + const layer = new MvtVectorLayer({ + customIcons: [], + layerDescriptor: { + __dataRequests: [sourceDataRequestDescriptor], + } as unknown as VectorLayerDescriptor, + source: mockSource, + }); + expect(layer.isLayerLoading(1)).toBe(true); }); - expect(layer.isLayerLoading(1)).toBe(true); - }); - test('should be true when tiles are loading', () => { - const layer = new MvtVectorLayer({ - customIcons: [], - layerDescriptor: { - __areTilesLoaded: false, - __dataRequests: [sourceDataRequestDescriptor], - } as unknown as VectorLayerDescriptor, - source: { - getMaxZoom: () => { - return 24; - }, - getMinZoom: () => { - return 0; - }, - } as unknown as IVectorSource, + test('should be true when tiles are loading', () => { + const layer = new MvtVectorLayer({ + customIcons: [], + layerDescriptor: { + __areTilesLoaded: false, + __dataRequests: [sourceDataRequestDescriptor], + } as unknown as VectorLayerDescriptor, + source: mockSource, + }); + expect(layer.isLayerLoading(1)).toBe(true); }); - expect(layer.isLayerLoading(1)).toBe(true); - }); - test('should be false when tiles are loaded', () => { - const layer = new MvtVectorLayer({ - customIcons: [], - layerDescriptor: { - __areTilesLoaded: true, - __dataRequests: [sourceDataRequestDescriptor], - } as unknown as VectorLayerDescriptor, - source: { - getMaxZoom: () => { - return 24; - }, - getMinZoom: () => { - return 0; - }, - } as unknown as IVectorSource, + test('should be false when tiles are loaded', () => { + const layer = new MvtVectorLayer({ + customIcons: [], + layerDescriptor: { + __areTilesLoaded: true, + __dataRequests: [sourceDataRequestDescriptor], + } as unknown as VectorLayerDescriptor, + source: mockSource, + }); + expect(layer.isLayerLoading(1)).toBe(false); }); - expect(layer.isLayerLoading(1)).toBe(false); }); - test('should be true when tiles are loaded but join is loading', () => { - const layer = new MvtVectorLayer({ - customIcons: [], - joins: [ - { - hasCompleteConfig: () => { - return true; - }, - getSourceDataRequestId: () => { - return 'join_source_a0b0da65-5e1a-4967-9dbe-74f24391afe2'; - }, - getRightJoinSource: () => { - return {} as unknown as IJoinSource; - }, - } as unknown as InnerJoin, - ], - layerDescriptor: { - __areTilesLoaded: true, - __dataRequests: [ - sourceDataRequestDescriptor, - { - dataId: 'join_source_a0b0da65-5e1a-4967-9dbe-74f24391afe2', - dataRequestMetaAtStart: {}, - dataRequestToken: Symbol('join request'), - }, - ], - } as unknown as VectorLayerDescriptor, - source: { - getMaxZoom: () => { - return 24; - }, - getMinZoom: () => { - return 0; - }, - } as unknown as IVectorSource, + describe('joins', () => { + const joinDataRequestId = 'join_source_a0b0da65-5e1a-4967-9dbe-74f24391afe2'; + const mockJoin = { + hasCompleteConfig: () => { + return true; + }, + getSourceDataRequestId: () => { + return joinDataRequestId; + }, + getRightJoinSource: () => { + return {} as unknown as IJoinSource; + }, + } as unknown as InnerJoin; + + test('should be false when layer is not visible', () => { + const layer = new MvtVectorLayer({ + customIcons: [], + joins: [mockJoin], + layerDescriptor: { + visible: false, + } as unknown as VectorLayerDescriptor, + source: mockSource, + }); + expect(layer.isLayerLoading(1)).toBe(false); + }); + + test('should be true when tiles are loaded but join is loading', () => { + const layer = new MvtVectorLayer({ + customIcons: [], + joins: [mockJoin], + layerDescriptor: { + __areTilesLoaded: true, + __dataRequests: [ + sourceDataRequestDescriptor, + { + dataId: joinDataRequestId, + dataRequestMetaAtStart: {}, + dataRequestToken: Symbol('join request'), + }, + ], + } as unknown as VectorLayerDescriptor, + source: mockSource, + }); + expect(layer.isLayerLoading(1)).toBe(true); }); - expect(layer.isLayerLoading(1)).toBe(true); - }); - test('should be false when tiles are loaded and joins are loaded', () => { - const layer = new MvtVectorLayer({ - customIcons: [], - joins: [ - { - hasCompleteConfig: () => { - return true; - }, - getSourceDataRequestId: () => { - return 'join_source_a0b0da65-5e1a-4967-9dbe-74f24391afe2'; - }, - getRightJoinSource: () => { - return {} as unknown as IJoinSource; - }, - } as unknown as InnerJoin, - ], - layerDescriptor: { - __areTilesLoaded: true, - __dataRequests: [ - sourceDataRequestDescriptor, - { - data: {}, - dataId: 'join_source_a0b0da65-5e1a-4967-9dbe-74f24391afe2', - dataRequestMeta: {}, - dataRequestMetaAtStart: undefined, - dataRequestToken: undefined, - }, - ], - } as unknown as VectorLayerDescriptor, - source: { - getMaxZoom: () => { - return 24; - }, - getMinZoom: () => { - return 0; - }, - } as unknown as IVectorSource, + test('should be false when tiles are loaded and joins are loaded', () => { + const layer = new MvtVectorLayer({ + customIcons: [], + joins: [mockJoin], + layerDescriptor: { + __areTilesLoaded: true, + __dataRequests: [ + sourceDataRequestDescriptor, + { + data: {}, + dataId: joinDataRequestId, + dataRequestMeta: {}, + dataRequestMetaAtStart: undefined, + dataRequestToken: undefined, + }, + ], + } as unknown as VectorLayerDescriptor, + source: mockSource, + }); + expect(layer.isLayerLoading(1)).toBe(false); }); - expect(layer.isLayerLoading(1)).toBe(false); }); }); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx index 099edd9b9e8a3..fa0e91258f8d2 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx @@ -75,6 +75,10 @@ export class MvtVectorLayer extends AbstractVectorLayer { } isLayerLoading(zoom: number) { + if (!this.isVisible() || !this.showAtZoomLevel(zoom)) { + return false; + } + const isSourceLoading = super.isLayerLoading(zoom); return isSourceLoading ? true : this._isLoadingJoins(); } From 5e661d0b1f9c1f1b416caa50d5d1c81547411aac Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 10 Nov 2023 09:36:39 -0600 Subject: [PATCH 44/51] [docs/ci] Update list of available CI related labels (#170907) --- dev_docs/tutorials/ci.mdx | 70 +++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/dev_docs/tutorials/ci.mdx b/dev_docs/tutorials/ci.mdx index a332d7e616e6c..2234143c32664 100644 --- a/dev_docs/tutorials/ci.mdx +++ b/dev_docs/tutorials/ci.mdx @@ -3,7 +3,7 @@ id: kibDevTutorialCI slug: /kibana-dev-docs/tutorials/ci title: CI description: CI -date: 2022-02-03 +date: 2023-11-08 tags: ['kibana', 'onboarding', 'dev', 'ci'] --- @@ -29,28 +29,76 @@ Build documentation from the root `docs` folder. ### Labels -Labels can be added to a pull request to run conditional pipelines. +Labels can be added to a pull request to run conditional pipelines. Build artifacts will be available on the "Artifacts" tab of the "Build Kibana Distribution and Plugins" step. + +#### `ci:all-cypress-suites` + +Some Cypress test suites are only run when code changes are made in certain files, typically files with overlapping test coverage. Adding this label will cause all Cypress tests to run. + +#### `ci:build-all-platforms` + +Build Windows, macOS, and Linux archives. + +#### `ci:build-canvas-shareable-runtime` + +Build the Canvas shareable runtime and include it in the distribution. + +#### `ci:build-cdn-assets` + +Build an archive that can be used to serve Kibana's static assets. + +#### `ci:build-cloud-image` + +Build cloud Docker images that can be used for testing deployments on Elastic Cloud. + +#### `ci:build-os-packages` + +Build Docker images, and Debian and RPM packages. + +#### `ci:build-serverless-image` + +Build serverless Docker images that can be used for testing deployments on Elastic Cloud. + +#### `ci:build-storybooks` + +Build and upload storybooks. + +#### `ci:build-webpack-bundle-analyzer` + +Build and upload a bundle report generated by `webpack-bundle-analyzer`. #### `ci:cloud-deploy` -Create or update a deployment on Elastic Cloud. +Create or update a deployment on Elastic Cloud production. + +#### `ci:cloud-persist-deployment` + +Prevents an existing deployment from being shutdown due to inactivity. #### `ci:cloud-redeploy` Create a new deployment on Elastic Cloud. Previous deployments linked to a pull request will be shutdown and data will not be preserved. -#### `ci:build-all-platforms` +#### `ci:collect-apm` -Build Windows, macOS, and Linux archives. Artifacts will be available on the "Artifacts" tab of the "Build Kibana Distribution and Plugins" step. +Collect APM metrics, available for viewing on the Kibana CI APM cluster. -#### `ci:build-os-packages` +#### `ci:no-auto-commit` -Build Docker images, and Debian and RPM packages. Artifacts will be available on the "Artifacts" tab of the "Build Kibana Distribution and Plugins" step. +Skip auto-committing changed files. -#### `ci:build-cloud-image` +#### `ci:project-deploy-elasticsearch` -Build Docker images that can be used for testing deployments on Elastic Cloud in the CFT region (gcp-us-west2). Artifacts will be available on the "Artifacts" tab of the "Build Kibana Distribution and Plugins" step. +Create or update a serverless Elasticsearch project on Elastic Cloud QA. -#### `ci:all-cypress-suites` +#### `ci:project-deploy-observability` + +Create or update a serverless Observability project on Elastic Cloud QA. + +#### `ci:project-deploy-security` + +Create or update a serverless Security project on Elastic Cloud QA. + +#### `ci:project-persist-deployment` -By default, Cypress test suites are only run when code changes are made in certain files, typically files with overlapping test coverage. Adding this label will cause all Cypress tests to run. +Prevents an existing deployment from being shutdown due to inactivity. From dd2fda271187f718def78002516861736dc48cf7 Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Fri, 10 Nov 2023 11:01:36 -0500 Subject: [PATCH 45/51] [Fleet] Append space ID to security solution tag (#170789) ## Summary Fixes https://github.com/elastic/kibana/issues/166798 Appends the current space ID to the ID of the security solution tag. Note: If there are integrations suffering from the above bug (might be "stuck" in `installing` status, showing concurrent installation errors, etc), they should be reinstalled via the API in their corresponding space, e.g. ``` # In Kibana dev tools for the space in which the integration is installed POST kbn:/api/fleet/epm/packages/cisco_asa/2.27.1 { "force": true } ``` --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../epm/kibana/assets/tag_assets.test.ts | 149 ++++++++++++------ .../services/epm/kibana/assets/tag_assets.ts | 8 +- 2 files changed, 106 insertions(+), 51 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts index 113866017f24b..f3d59c9607a38 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts @@ -688,55 +688,108 @@ describe('tagKibanaAssets', () => { ); }); - it('should respect SecuritySolution tags', async () => { - savedObjectTagClient.get.mockRejectedValue(new Error('not found')); - savedObjectTagClient.create.mockImplementation(({ name }: { name: string }) => - Promise.resolve({ id: name.toLowerCase(), name }) - ); - const kibanaAssets = { - dashboard: [ - { id: 'dashboard1', type: 'dashboard' }, - { id: 'dashboard2', type: 'dashboard' }, - { id: 'search_id1', type: 'search' }, - { id: 'search_id2', type: 'search' }, - ], - } as any; - const assetTags = [ - { - text: 'Security Solution', - asset_types: ['dashboard'], - }, - ]; - await tagKibanaAssets({ - savedObjectTagAssignmentService, - savedObjectTagClient, - kibanaAssets, - pkgTitle: 'TestPackage', - pkgName: 'test-pkg', - spaceId: 'default', - importedAssets: [], - assetTags, + describe('Security Solution tag', () => { + it('creates tag in default space', async () => { + savedObjectTagClient.get.mockRejectedValue(new Error('not found')); + savedObjectTagClient.create.mockImplementation(({ name }: { name: string }) => + Promise.resolve({ id: name.toLowerCase(), name }) + ); + const kibanaAssets = { + dashboard: [ + { id: 'dashboard1', type: 'dashboard' }, + { id: 'dashboard2', type: 'dashboard' }, + { id: 'search_id1', type: 'search' }, + { id: 'search_id2', type: 'search' }, + ], + } as any; + const assetTags = [ + { + text: 'Security Solution', + asset_types: ['dashboard'], + }, + ]; + await tagKibanaAssets({ + savedObjectTagAssignmentService, + savedObjectTagClient, + kibanaAssets, + pkgTitle: 'TestPackage', + pkgName: 'test-pkg', + spaceId: 'default', + importedAssets: [], + assetTags, + }); + expect(savedObjectTagClient.create).toHaveBeenCalledWith( + managedTagPayloadArg1, + managedTagPayloadArg2 + ); + expect(savedObjectTagClient.create).toHaveBeenCalledWith( + { + color: '#4DD2CA', + description: '', + name: 'TestPackage', + }, + { id: 'fleet-pkg-test-pkg-default', overwrite: true, refresh: false } + ); + expect(savedObjectTagClient.create).toHaveBeenCalledWith( + { + color: expect.any(String), + description: 'Tag defined in package-spec', + name: 'Security Solution', + }, + { id: 'security-solution-default', overwrite: true, refresh: false } + ); + }); + + it('creates tag in non-default space', async () => { + savedObjectTagClient.get.mockRejectedValue(new Error('not found')); + savedObjectTagClient.create.mockImplementation(({ name }: { name: string }) => + Promise.resolve({ id: name.toLowerCase(), name }) + ); + const kibanaAssets = { + dashboard: [ + { id: 'dashboard1', type: 'dashboard' }, + { id: 'dashboard2', type: 'dashboard' }, + { id: 'search_id1', type: 'search' }, + { id: 'search_id2', type: 'search' }, + ], + } as any; + const assetTags = [ + { + text: 'Security Solution', + asset_types: ['dashboard'], + }, + ]; + await tagKibanaAssets({ + savedObjectTagAssignmentService, + savedObjectTagClient, + kibanaAssets, + pkgTitle: 'TestPackage', + pkgName: 'test-pkg', + spaceId: 'my-secondary-space', + importedAssets: [], + assetTags, + }); + expect(savedObjectTagClient.create).toHaveBeenCalledWith(managedTagPayloadArg1, { + ...managedTagPayloadArg2, + id: 'fleet-managed-my-secondary-space', + }); + expect(savedObjectTagClient.create).toHaveBeenCalledWith( + { + color: expect.any(String), + description: '', + name: 'TestPackage', + }, + { id: 'fleet-pkg-test-pkg-my-secondary-space', overwrite: true, refresh: false } + ); + expect(savedObjectTagClient.create).toHaveBeenCalledWith( + { + color: expect.anything(), + description: 'Tag defined in package-spec', + name: 'Security Solution', + }, + { id: 'security-solution-my-secondary-space', overwrite: true, refresh: false } + ); }); - expect(savedObjectTagClient.create).toHaveBeenCalledWith( - managedTagPayloadArg1, - managedTagPayloadArg2 - ); - expect(savedObjectTagClient.create).toHaveBeenCalledWith( - { - color: '#4DD2CA', - description: '', - name: 'TestPackage', - }, - { id: 'fleet-pkg-test-pkg-default', overwrite: true, refresh: false } - ); - expect(savedObjectTagClient.create).toHaveBeenCalledWith( - { - color: expect.any(String), - description: 'Tag defined in package-spec', - name: 'Security Solution', - }, - { id: 'security-solution-default', overwrite: true, refresh: false } - ); }); it('should only call savedObjectTagClient.create for basic tags if there are no assetTags to assign', async () => { diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts index 86d39a5582607..5e7d4477bbbd3 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts @@ -37,7 +37,7 @@ const PACKAGE_TAG_COLOR = '#4DD2CA'; const MANAGED_TAG_NAME = 'Managed'; const LEGACY_MANAGED_TAG_ID = 'managed'; const SECURITY_SOLUTION_TAG_NAME = 'Security Solution'; -const SECURITY_SOLUTION_TAG_ID = 'security-solution-default'; +const SECURITY_SOLUTION_TAG_ID_BASE = 'security-solution'; // the tag service only accepts 6-digits hex colors const TAG_COLORS = [ @@ -65,8 +65,10 @@ const getLegacyPackageTagId = (pkgName: string) => pkgName; In that case return id `security-solution-default` */ export const getPackageSpecTagId = (spaceId: string, pkgName: string, tagName: string) => { - if (tagName.toLowerCase() === SECURITY_SOLUTION_TAG_NAME.toLowerCase()) - return SECURITY_SOLUTION_TAG_ID; + if (tagName.toLowerCase() === SECURITY_SOLUTION_TAG_NAME.toLowerCase()) { + return `${SECURITY_SOLUTION_TAG_ID_BASE}-${spaceId}`; + } + // UUID v5 needs a namespace (uuid.DNS) to generate a predictable uuid const uniqueId = uuidv5(`${tagName.toLowerCase()}`, uuidv5.DNS); return `fleet-shared-tag-${pkgName}-${uniqueId}-${spaceId}`; From cd909f03b1d71da93041a0b5c184243aa6506dea Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Fri, 10 Nov 2023 11:08:09 -0500 Subject: [PATCH 46/51] [Fleet] Fix inability to upgrade agents from 8.10.4 -> 8.11 (#170974) ## Summary Closes https://github.com/elastic/kibana/issues/169825 This PR adds logic to Fleet's `/api/agents/available_versions` endpoint that will ensure we periodically try to fetch from the live product versions API at https://www.elastic.co/api/product_versions to make sure we have eventual consistency in the list of available agent versions. Currently, Kibana relies entirely on a static file generated at build time from the above API. If the API isn't up-to-date with the latest agent version (e.g. kibana completed its build before agent), then that build of Kibana will never "see" the corresponding build of agent. This API endpoint is cached for two hours to prevent overfetching from this external API, and from constantly going out to disk to read from the agent versions file. ## To do - [x] Update unit tests - [x] Consider airgapped environments ## On airgapped environments In airgapped environments, we're going to try and fetch from the `product_versions` API and that request is going to fail. What we've seen happen in some environments is that these requests do not "fail fast" and instead wait until a network timeout is reached. I'd love to avoid that timeout case and somehow detect airgapped environments and avoid calling this API at all. However, we don't have a great deterministic way to know if someone is in an airgapped environment. The best guess I think we can make is by checking whether `xpack.fleet.registryUrl` is set to something other than `https://epr.elastic.co`. Curious if anyone has thoughts on this. ## Screenshots ![image](https://github.com/elastic/kibana/assets/6766512/0906817c-0098-4b67-8791-d06730f450f6) ![image](https://github.com/elastic/kibana/assets/6766512/59e7c132-f568-470f-b48d-53761ddc2fde) ![image](https://github.com/elastic/kibana/assets/6766512/986372df-a90f-48c3-ae24-c3012e8f7730) ## To test 1. Set up Fleet Server + ES + Kibana 2. Spin up a Fleet Server running Agent v8.11.0 3. Enroll an agent running v8.10.4 (I used multipass) 4. Verify the agent can be upgraded from the UI --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/server/routes/agent/handlers.ts | 3 +- .../fleet/server/services/agents/crud.test.ts | 6 + .../server/services/agents/versions.test.ts | 110 ++++++++++++++- .../fleet/server/services/agents/versions.ts | 125 +++++++++++++----- 4 files changed, 203 insertions(+), 41 deletions(-) diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.ts index 2f344b0f3fb15..81a01de6b5fde 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.ts @@ -354,8 +354,9 @@ function isStringArray(arr: unknown | string[]): arr is string[] { export const getAvailableVersionsHandler: RequestHandler = async (context, request, response) => { try { - const availableVersions = await AgentService.getAvailableVersions({}); + const availableVersions = await AgentService.getAvailableVersions(); const body: GetAvailableVersionsResponse = { items: availableVersions }; + return response.ok({ body }); } catch (error) { return defaultFleetErrorHandler({ error, response }); diff --git a/x-pack/plugins/fleet/server/services/agents/crud.test.ts b/x-pack/plugins/fleet/server/services/agents/crud.test.ts index 47bb8028fffcd..e542881fe13f3 100644 --- a/x-pack/plugins/fleet/server/services/agents/crud.test.ts +++ b/x-pack/plugins/fleet/server/services/agents/crud.test.ts @@ -9,7 +9,9 @@ import type { ElasticsearchClient } from '@kbn/core/server'; import { elasticsearchServiceMock, savedObjectsClientMock } from '@kbn/core/server/mocks'; import { AGENTS_INDEX } from '../../constants'; +import { createAppContextStartContractMock } from '../../mocks'; import type { Agent } from '../../types'; +import { appContextService } from '../app_context'; import { auditLoggingService } from '../audit_logging'; @@ -30,6 +32,7 @@ const mockedAuditLoggingService = auditLoggingService as jest.Mocked { const soClientMock = savedObjectsClientMock.create(); + let mockContract: ReturnType; let esClientMock: ElasticsearchClient; let searchMock: jest.Mock; @@ -41,6 +44,9 @@ describe('Agents CRUD test', () => { openPointInTime: jest.fn().mockResolvedValue({ id: '1' }), closePointInTime: jest.fn(), } as unknown as ElasticsearchClient; + + mockContract = createAppContextStartContractMock(); + appContextService.start(mockContract); }); function getEsResponse(ids: string[], total: number) { diff --git a/x-pack/plugins/fleet/server/services/agents/versions.test.ts b/x-pack/plugins/fleet/server/services/agents/versions.test.ts index 92e30141c006a..513fba910705d 100644 --- a/x-pack/plugins/fleet/server/services/agents/versions.test.ts +++ b/x-pack/plugins/fleet/server/services/agents/versions.test.ts @@ -7,6 +7,8 @@ import { readFile } from 'fs/promises'; +import fetch from 'node-fetch'; + let mockKibanaVersion = '300.0.0'; let mockConfig = {}; jest.mock('../app_context', () => { @@ -21,16 +23,30 @@ jest.mock('../app_context', () => { }); jest.mock('fs/promises'); +jest.mock('node-fetch'); const mockedReadFile = readFile as jest.MockedFunction; +const mockedFetch = fetch as jest.MockedFunction; + +const emptyResponse = { + status: 200, + text: jest.fn().mockResolvedValue(JSON.stringify({})), +} as any; + import { getAvailableVersions } from './versions'; describe('getAvailableVersions', () => { + beforeEach(() => { + mockedReadFile.mockReset(); + mockedFetch.mockReset(); + }); + it('should return available version and filter version < 7.17', async () => { mockKibanaVersion = '300.0.0'; mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + mockedFetch.mockResolvedValueOnce(emptyResponse); - const res = await getAvailableVersions({ cached: false, includeCurrentVersion: true }); + const res = await getAvailableVersions({ includeCurrentVersion: true, ignoreCache: true }); expect(res).toEqual(['300.0.0', '8.1.0', '8.0.0', '7.17.0']); }); @@ -38,8 +54,9 @@ describe('getAvailableVersions', () => { it('should not strip -SNAPSHOT from kibana version', async () => { mockKibanaVersion = '300.0.0-SNAPSHOT'; mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + mockedFetch.mockResolvedValueOnce(emptyResponse); - const res = await getAvailableVersions({ cached: false, includeCurrentVersion: true }); + const res = await getAvailableVersions({ includeCurrentVersion: true, ignoreCache: true }); expect(res).toEqual(['300.0.0-SNAPSHOT', '8.1.0', '8.0.0', '7.17.0']); }); @@ -51,8 +68,9 @@ describe('getAvailableVersions', () => { }, }; mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + mockedFetch.mockResolvedValueOnce(emptyResponse); - const res = await getAvailableVersions({ cached: false }); + const res = await getAvailableVersions({ ignoreCache: true }); expect(res).toEqual(['8.1.0', '8.0.0', '7.17.0']); }); @@ -60,8 +78,9 @@ describe('getAvailableVersions', () => { it('should not include the current version if includeCurrentVersion = false', async () => { mockKibanaVersion = '300.0.0-SNAPSHOT'; mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + mockedFetch.mockResolvedValueOnce(emptyResponse); - const res = await getAvailableVersions({ cached: false, includeCurrentVersion: false }); + const res = await getAvailableVersions({ includeCurrentVersion: false, ignoreCache: true }); expect(res).toEqual(['8.1.0', '8.0.0', '7.17.0']); }); @@ -74,9 +93,90 @@ describe('getAvailableVersions', () => { }, }; mockedReadFile.mockRejectedValue({ code: 'ENOENT' }); + mockedFetch.mockResolvedValueOnce(emptyResponse); - const res = await getAvailableVersions({ cached: false }); + const res = await getAvailableVersions({ ignoreCache: true }); expect(res).toEqual(['300.0.0']); }); + + it('should include versions returned from product_versions API', async () => { + mockKibanaVersion = '300.0.0'; + mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + mockedFetch.mockResolvedValueOnce({ + status: 200, + text: jest.fn().mockResolvedValue( + JSON.stringify([ + [ + { + title: 'Elastic Agent 8.1.0', + version_number: '8.1.0', + }, + { + title: 'Elastic Agent 8.10.0', + version_number: '8.10.0', + }, + { + title: 'Elastic Agent 8.9.2', + version_number: '8.9.2', + }, + , + ], + ]) + ), + } as any); + + const res = await getAvailableVersions({ ignoreCache: true }); + + // Should sort, uniquify and filter out versions < 7.17 + expect(res).toEqual(['8.10.0', '8.9.2', '8.1.0', '8.0.0', '7.17.0']); + }); + + it('should cache results', async () => { + mockKibanaVersion = '300.0.0'; + mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + mockedFetch.mockResolvedValueOnce({ + status: 200, + text: jest.fn().mockResolvedValue( + JSON.stringify([ + [ + { + title: 'Elastic Agent 8.1.0', + version_number: '8.1.0', + }, + { + title: 'Elastic Agent 8.10.0', + version_number: '8.10.0', + }, + { + title: 'Elastic Agent 8.9.2', + version_number: '8.9.2', + }, + , + ], + ]) + ), + } as any); + + await getAvailableVersions(); + + mockedFetch.mockResolvedValueOnce({ + status: 200, + text: jest.fn().mockResolvedValue( + JSON.stringify([ + [ + { + title: 'Elastic Agent 300.0.0', + version_number: '300.0.0', + }, + ], + ]) + ), + } as any); + + const res2 = await getAvailableVersions(); + + expect(mockedFetch).toBeCalledTimes(1); + expect(res2).not.toContain('300.0.0'); + }); }); diff --git a/x-pack/plugins/fleet/server/services/agents/versions.ts b/x-pack/plugins/fleet/server/services/agents/versions.ts index 7a1b82bb72359..8f31d3f12b344 100644 --- a/x-pack/plugins/fleet/server/services/agents/versions.ts +++ b/x-pack/plugins/fleet/server/services/agents/versions.ts @@ -8,18 +8,27 @@ import { readFile } from 'fs/promises'; import Path from 'path'; -import { REPO_ROOT } from '@kbn/repo-info'; +import fetch from 'node-fetch'; +import pRetry from 'p-retry'; import { uniq } from 'lodash'; import semverGte from 'semver/functions/gte'; import semverGt from 'semver/functions/gt'; import semverCoerce from 'semver/functions/coerce'; +import { REPO_ROOT } from '@kbn/repo-info'; + import { appContextService } from '..'; const MINIMUM_SUPPORTED_VERSION = '7.17.0'; const AGENT_VERSION_BUILD_FILE = 'x-pack/plugins/fleet/target/agent_versions_list.json'; -let availableVersions: string[] | undefined; +// Endpoint maintained by the web-team and hosted on the elastic website +const PRODUCT_VERSIONS_URL = 'https://www.elastic.co/api/product_versions'; + +// Cache available versions in memory for 1 hour +const CACHE_DURATION = 1000 * 60 * 60; +let CACHED_AVAILABLE_VERSIONS: string[] | undefined; +let LAST_FETCHED: number | undefined; export const getLatestAvailableVersion = async ( includeCurrentVersion?: boolean @@ -30,54 +39,100 @@ export const getLatestAvailableVersion = async ( }; export const getAvailableVersions = async ({ - cached = true, includeCurrentVersion, + ignoreCache = false, // This is only here to allow us to ignore the cache in tests }: { - cached?: boolean; includeCurrentVersion?: boolean; -}): Promise => { - // Use cached value to avoid reading from disk each time - if (cached && availableVersions) { - return availableVersions; + ignoreCache?: boolean; +} = {}): Promise => { + const logger = appContextService.getLogger(); + + if (LAST_FETCHED && !ignoreCache) { + const msSinceLastFetched = Date.now() - (LAST_FETCHED || 0); + + if (msSinceLastFetched < CACHE_DURATION && CACHED_AVAILABLE_VERSIONS !== undefined) { + logger.debug(`Cache is valid, returning cached available versions`); + + return CACHED_AVAILABLE_VERSIONS; + } + + logger.debug('Cache has expired, fetching available versions from disk + API'); } - // Read a static file generated at build time const config = appContextService.getConfig(); - let versionsToDisplay: string[] = []; - const kibanaVersion = appContextService.getKibanaVersion(); + let availableVersions: string[] = []; + + // First, grab available versions from the static file that's placed on disk at build time try { const file = await readFile(Path.join(REPO_ROOT, AGENT_VERSION_BUILD_FILE), 'utf-8'); - - // Exclude versions older than MINIMUM_SUPPORTED_VERSION and pre-release versions (SNAPSHOT, rc..) - // De-dup and sort in descending order const data: string[] = JSON.parse(file); - const versions = data - .map((item: any) => semverCoerce(item)?.version || '') - .filter((v: any) => semverGte(v, MINIMUM_SUPPORTED_VERSION)) - .sort((a: any, b: any) => (semverGt(a, b) ? -1 : 1)); - versionsToDisplay = uniq(versions) as string[]; + availableVersions = [...availableVersions, ...data]; + } catch (error) { + // If we can't read from the file, the error is non-blocking. We'll try to source data from the + // product versions API later. + logger.debug(`Error reading file ${AGENT_VERSION_BUILD_FILE}: ${error.message}`); + } + + // Next, fetch from the product versions API. This API call is aggressively cached, so we won't + // fetch from the live API more than `TIME_BETWEEN_FETCHES` milliseconds. + const apiVersions = await fetchAgentVersionsFromApi(); + + // Coerce each version to a semver object and compare to our `MINIMUM_SUPPORTED_VERSION` - we + // only want support versions in the final result. We'll also sort by newest version first. + availableVersions = uniq([...availableVersions, ...apiVersions]) + .map((item: any) => semverCoerce(item)?.version || '') + .filter((v: any) => semverGte(v, MINIMUM_SUPPORTED_VERSION)) + .sort((a: any, b: any) => (semverGt(a, b) ? -1 : 1)); + + // If the current stack version isn't included in the list of available versions, add it + // at the front of the array + const hasCurrentVersion = availableVersions.some((v) => v === kibanaVersion); + if (includeCurrentVersion && !hasCurrentVersion) { + availableVersions = [kibanaVersion, ...availableVersions]; + } - const appendCurrentVersion = includeCurrentVersion; + // Allow upgrading to the current stack version if this override flag is provided via `kibana.yml`. + // This is useful for development purposes. + if (availableVersions.length === 0 && !config?.internal?.onlyAllowAgentUpgradeToKnownVersions) { + availableVersions = [kibanaVersion]; + } - if (appendCurrentVersion) { - // Add current version if not already present - const hasCurrentVersion = versionsToDisplay.some((v) => v === kibanaVersion); + // Don't prime the cache in tests + if (!ignoreCache) { + CACHED_AVAILABLE_VERSIONS = availableVersions; + LAST_FETCHED = Date.now(); + } - versionsToDisplay = !hasCurrentVersion - ? [kibanaVersion].concat(versionsToDisplay) - : versionsToDisplay; - } + return availableVersions; +}; - availableVersions = versionsToDisplay; +async function fetchAgentVersionsFromApi() { + const logger = appContextService.getLogger(); - return availableVersions; - } catch (e) { - if (e.code === 'ENOENT') { - return config?.internal?.onlyAllowAgentUpgradeToKnownVersions ? [] : [kibanaVersion]; - } - throw e; + const options = { + headers: { + 'Content-Type': 'application/json', + }, + }; + + const response = await pRetry(() => fetch(PRODUCT_VERSIONS_URL, options), { retries: 1 }); + const rawBody = await response.text(); + + // We need to handle non-200 responses gracefully here to support airgapped environments where + // Kibana doesn't have internet access to query this API + if (response.status >= 400) { + logger.debug(`Status code ${response.status} received from versions API: ${rawBody}`); + return []; } -}; + + const jsonBody = JSON.parse(rawBody); + + const versions: string[] = (jsonBody.length ? jsonBody[0] : []) + .filter((item: any) => item?.title?.includes('Elastic Agent')) + .map((item: any) => item?.version_number); + + return versions; +} From 870cb9f483fa9eaf0303d478f4c2395ee0b3067a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Fri, 10 Nov 2023 17:16:57 +0100 Subject: [PATCH 47/51] [Index Management] Add ingest pipelines link to the index details page (#170906) ## Summary Fixes https://github.com/elastic/kibana/issues/165107 This PR adds a function to the extensions service in Index Management to register additional content that is rendered in the bottom right corner under the mappings docs link. This PR also adds a panel with the link to the ingest pipelines search docs for the serverless search project. ### Screenshots Screenshot 2023-11-08 at 21 51 28 ### Checklist - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/index_management/README.md | 5 +- .../index_details_page.test.tsx | 22 ++++ .../details_page/details_page_content.tsx | 2 +- .../details_page/details_page_mappings.tsx | 106 ++-------------- .../details_page_mappings_content.tsx | 119 ++++++++++++++++++ .../plugins/index_management/public/index.ts | 2 +- .../plugins/index_management/public/plugin.ts | 6 +- .../services/extensions_service.mock.ts | 1 + .../public/services/extensions_service.ts | 33 ++++- .../index_management/public/services/index.ts | 2 +- .../plugins/index_management/public/types.ts | 4 + x-pack/plugins/serverless_search/kibana.jsonc | 4 +- .../components/index_mappings_docs_link.tsx | 68 ++++++++++ .../serverless_search/public/plugin.ts | 4 +- .../plugins/serverless_search/public/types.ts | 2 + .../plugins/serverless_search/tsconfig.json | 1 + 16 files changed, 272 insertions(+), 109 deletions(-) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx diff --git a/x-pack/plugins/index_management/README.md b/x-pack/plugins/index_management/README.md index 8673447fc577c..867ccbd74335c 100644 --- a/x-pack/plugins/index_management/README.md +++ b/x-pack/plugins/index_management/README.md @@ -34,14 +34,15 @@ interface IndexDetailsTab { An example of adding an ILM tab can be found in [this file](https://github.com/elastic/kibana/blob/main/x-pack/plugins/index_lifecycle_management/public/extend_index_management/components/index_lifecycle_summary.tsx#L250). -- `setIndexOverviewContent(content: IndexOverviewContent)`: replaces the default content in the overview tab (code block describing adding documents to the index) with the custom content. The custom content has the following interface: +- `setIndexOverviewContent(content: IndexContent)`: replaces the default content in the overview tab (code block describing adding documents to the index) with the custom content. The custom content has the following interface: ```ts -interface IndexOverviewContent { +interface IndexContent { renderContent: (args: { index: Index; getUrlForApp: ApplicationStart['getUrlForApp']; }) => ReturnType; ``` +- `setIndexMappingsContent(content: IndexContent)`: adds content to the mappings tab of the index details page. The content is displayed in the right bottom corner, below the mappings docs link. ## Indices tab diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index afdfa15c917aa..24938682ac519 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -501,6 +501,28 @@ describe('', () => { expect(httpSetup.get).toHaveBeenCalledTimes(numberOfRequests + 1); }); }); + + it('renders the content set via the extensions service', async () => { + const mappingsContent = 'test mappings extension'; + await act(async () => { + testBed = await setup({ + httpSetup, + dependencies: { + services: { + extensionsService: { + _indexMappingsContent: { + renderContent: () => mappingsContent, + }, + }, + }, + }, + }); + }); + testBed.component.update(); + await testBed.actions.clickIndexDetailsTab(IndexDetailsSection.Mappings); + const content = testBed.actions.getActiveTabContent(); + expect(content).toContain(mappingsContent); + }); }); describe('Settings tab', () => { diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx index 0360df733c945..adeadee6132c0 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx @@ -50,7 +50,7 @@ const defaultTabs: IndexDetailsTab[] = [ name: ( ), - renderTabContent: ({ index }) => , + renderTabContent: ({ index }) => , order: 20, }, { diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx index a83eebd395b1e..c6f74207c92d7 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings.tsx @@ -6,27 +6,18 @@ */ import React, { FunctionComponent, useEffect } from 'react'; -import { - EuiButton, - EuiCodeBlock, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiLink, - EuiPageTemplate, - EuiPanel, - EuiSpacer, - EuiText, - EuiTitle, -} from '@elastic/eui'; -import { css } from '@emotion/react'; +import { EuiButton, EuiPageTemplate, EuiSpacer, EuiText } from '@elastic/eui'; + import { FormattedMessage } from '@kbn/i18n-react'; import { SectionLoading } from '@kbn/es-ui-shared-plugin/public'; -import { useLoadIndexMappings, documentationService } from '../../../../services'; + +import { DetailsPageMappingsContent } from './details_page_mappings_content'; +import { Index } from '../../../../../../common'; +import { useLoadIndexMappings } from '../../../../services'; import { breadcrumbService, IndexManagementBreadcrumb } from '../../../../services/breadcrumbs'; -export const DetailsPageMappings: FunctionComponent<{ indexName: string }> = ({ indexName }) => { - const { isLoading, data, error, resendRequest } = useLoadIndexMappings(indexName); +export const DetailsPageMappings: FunctionComponent<{ index: Index }> = ({ index }) => { + const { isLoading, data, error, resendRequest } = useLoadIndexMappings(index.name); useEffect(() => { breadcrumbService.setBreadcrumbs(IndexManagementBreadcrumb.indexDetailsMappings); @@ -63,7 +54,7 @@ export const DetailsPageMappings: FunctionComponent<{ indexName: string }> = ({ id="xpack.idxMgmt.indexDetails.mappings.errorDescription" defaultMessage="We encountered an error loading mappings for index {indexName}. Make sure that the index name in the URL is correct and try again." values={{ - indexName, + indexName: index.name, }} /> @@ -86,82 +77,5 @@ export const DetailsPageMappings: FunctionComponent<{ indexName: string }> = ({ ); } - return ( - // using "rowReverse" to keep docs links on the top of the mappings code block on smaller screen - - - - - - - - - -

- -

-
- - - - -

- -

-
- - - - - - - - - - - {JSON.stringify(data, null, 2)} - - - - - ); + return ; }; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx new file mode 100644 index 0000000000000..40544bb18e1ff --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx @@ -0,0 +1,119 @@ +/* + * 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 React, { FunctionComponent } from 'react'; +import { + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiPanel, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; + +import { Index } from '../../../../../../common'; +import { documentationService } from '../../../../services'; +import { useAppContext } from '../../../../app_context'; + +export const DetailsPageMappingsContent: FunctionComponent<{ index: Index; data: any }> = ({ + index, + data, +}) => { + const { + services: { extensionsService }, + core: { getUrlForApp }, + } = useAppContext(); + return ( + // using "rowReverse" to keep docs links on the top of the mappings code block on smaller screen + + + + + + + + + +

+ +

+
+
+
+ + +

+ +

+
+ + + + +
+ {extensionsService.indexMappingsContent && ( + <> + + {extensionsService.indexMappingsContent.renderContent({ index, getUrlForApp })} + + )} +
+ + + + + {JSON.stringify(data, null, 2)} + + + +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/index.ts b/x-pack/plugins/index_management/public/index.ts index b8cde1fdf36e7..8fb836ba7ffd9 100644 --- a/x-pack/plugins/index_management/public/index.ts +++ b/x-pack/plugins/index_management/public/index.ts @@ -14,7 +14,7 @@ export const plugin = (ctx: PluginInitializerContext) => { return new IndexMgmtUIPlugin(ctx); }; -export type { IndexManagementPluginSetup } from './types'; +export type { IndexManagementPluginSetup, IndexManagementPluginStart } from './types'; export { getIndexListUri, getTemplateDetailsLink } from './application/services/routing'; diff --git a/x-pack/plugins/index_management/public/plugin.ts b/x-pack/plugins/index_management/public/plugin.ts index 87b4ff5be220c..f4038a4e2677f 100644 --- a/x-pack/plugins/index_management/public/plugin.ts +++ b/x-pack/plugins/index_management/public/plugin.ts @@ -81,6 +81,10 @@ export class IndexMgmtUIPlugin { }; } - public start() {} + public start() { + return { + extensionsService: this.extensionsService.setup(), + }; + } public stop() {} } diff --git a/x-pack/plugins/index_management/public/services/extensions_service.mock.ts b/x-pack/plugins/index_management/public/services/extensions_service.mock.ts index 3c0886b0fe4a3..8f4968ad35e41 100644 --- a/x-pack/plugins/index_management/public/services/extensions_service.mock.ts +++ b/x-pack/plugins/index_management/public/services/extensions_service.mock.ts @@ -18,6 +18,7 @@ const createServiceMock = (): ExtensionsSetupMock => ({ addToggle: jest.fn(), addIndexDetailsTab: jest.fn(), setIndexOverviewContent: jest.fn(), + setIndexMappingsContent: jest.fn(), }); const createMock = () => { diff --git a/x-pack/plugins/index_management/public/services/extensions_service.ts b/x-pack/plugins/index_management/public/services/extensions_service.ts index 94211b32dbd70..1eb68e9a0b746 100644 --- a/x-pack/plugins/index_management/public/services/extensions_service.ts +++ b/x-pack/plugins/index_management/public/services/extensions_service.ts @@ -12,7 +12,7 @@ import { EuiBadgeProps } from '@elastic/eui'; import type { IndexDetailsTab } from '../../common/constants'; import { Index } from '..'; -export interface IndexOverviewContent { +export interface IndexContent { renderContent: (args: { index: Index; getUrlForApp: ApplicationStart['getUrlForApp']; @@ -28,13 +28,22 @@ export interface IndexBadge { } export interface ExtensionsSetup { + // adds an option to the "manage index" menu addAction(action: any): void; + // adds a banner to the indices list addBanner(banner: any): void; + // adds a filter to the indices list addFilter(filter: any): void; + // adds a badge to the index name addBadge(badge: IndexBadge): void; + // adds a toggle to the indices list addToggle(toggle: any): void; + // adds a tab to the index details page addIndexDetailsTab(tab: IndexDetailsTab): void; - setIndexOverviewContent(content: IndexOverviewContent): void; + // sets content to render instead of the code block on the overview tab of the index page + setIndexOverviewContent(content: IndexContent): void; + // sets content to render below the docs link on the mappings tab of the index page + setIndexMappingsContent(content: IndexContent): void; } export class ExtensionsService { @@ -55,7 +64,8 @@ export class ExtensionsService { ]; private _toggles: any[] = []; private _indexDetailsTabs: IndexDetailsTab[] = []; - private _indexOverviewContent: IndexOverviewContent | null = null; + private _indexOverviewContent: IndexContent | null = null; + private _indexMappingsContent: IndexContent | null = null; private service?: ExtensionsSetup; public setup(): ExtensionsSetup { @@ -66,7 +76,8 @@ export class ExtensionsService { addFilter: this.addFilter.bind(this), addToggle: this.addToggle.bind(this), addIndexDetailsTab: this.addIndexDetailsTab.bind(this), - setIndexOverviewContent: this.setIndexOverviewMainContent.bind(this), + setIndexOverviewContent: this.setIndexOverviewContent.bind(this), + setIndexMappingsContent: this.setIndexMappingsContent.bind(this), }; return this.service; @@ -96,7 +107,7 @@ export class ExtensionsService { this._indexDetailsTabs.push(tab); } - private setIndexOverviewMainContent(content: IndexOverviewContent) { + private setIndexOverviewContent(content: IndexContent) { if (this._indexOverviewContent) { throw new Error(`The content for index overview has already been set.`); } else { @@ -104,6 +115,14 @@ export class ExtensionsService { } } + private setIndexMappingsContent(content: IndexContent) { + if (this._indexMappingsContent) { + throw new Error(`The content for index mappings has already been set.`); + } else { + this._indexMappingsContent = content; + } + } + public get actions() { return this._actions; } @@ -131,4 +150,8 @@ export class ExtensionsService { public get indexOverviewContent() { return this._indexOverviewContent; } + + public get indexMappingsContent() { + return this._indexMappingsContent; + } } diff --git a/x-pack/plugins/index_management/public/services/index.ts b/x-pack/plugins/index_management/public/services/index.ts index 8f4ddbeffba35..bca35e09c9776 100644 --- a/x-pack/plugins/index_management/public/services/index.ts +++ b/x-pack/plugins/index_management/public/services/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -export type { ExtensionsSetup } from './extensions_service'; +export type { ExtensionsSetup, IndexContent } from './extensions_service'; export { ExtensionsService } from './extensions_service'; export type { PublicApiServiceSetup } from './public_api_service'; diff --git a/x-pack/plugins/index_management/public/types.ts b/x-pack/plugins/index_management/public/types.ts index 57ddf10c767fd..d00e6ba4d5ac7 100644 --- a/x-pack/plugins/index_management/public/types.ts +++ b/x-pack/plugins/index_management/public/types.ts @@ -16,6 +16,10 @@ export interface IndexManagementPluginSetup { extensionsService: ExtensionsSetup; } +export interface IndexManagementPluginStart { + extensionsService: ExtensionsSetup; +} + export interface SetupDependencies { fleet?: unknown; usageCollection: UsageCollectionSetup; diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index 2ae8f0dbff987..0ac92bc197468 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -25,7 +25,9 @@ "share", "visualizations" ], - "optionalPlugins": [], + "optionalPlugins": [ + "indexManagement", + ], "requiredBundles": [ "kibanaReact" ] diff --git a/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx b/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx new file mode 100644 index 0000000000000..fc1699beffa8f --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx @@ -0,0 +1,68 @@ +/* + * 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 React, { FunctionComponent } from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiPanel, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { CoreStart } from '@kbn/core/public'; +import { IndexContent } from '@kbn/index-management-plugin/public/services'; + +const IndexMappingsDocsLink: FunctionComponent<{ docLinks: CoreStart['docLinks'] }> = ({ + docLinks, +}) => { + return ( + + + + + + + +

+ +

+
+
+
+ + +

+ +

+
+ + + + +
+ ); +}; + +export const createIndexMappingsDocsLinkContent = (core: CoreStart): IndexContent => { + return { + renderContent: () => , + }; +}; diff --git a/x-pack/plugins/serverless_search/public/plugin.ts b/x-pack/plugins/serverless_search/public/plugin.ts index 6f1cb6465106c..4203925650385 100644 --- a/x-pack/plugins/serverless_search/public/plugin.ts +++ b/x-pack/plugins/serverless_search/public/plugin.ts @@ -15,6 +15,7 @@ import { import { i18n } from '@kbn/i18n'; import { appIds } from '@kbn/management-cards-navigation'; import { AuthenticatedUser } from '@kbn/security-plugin/common'; +import { createIndexMappingsDocsLinkContent as createIndexMappingsContent } from './application/components/index_mappings_docs_link'; import { createServerlessSearchSideNavComponent as createComponent } from './layout/nav'; import { docLinks } from '../common/doc_links'; import { @@ -85,7 +86,7 @@ export class ServerlessSearchPlugin public start( core: CoreStart, - { serverless, management, cloud }: ServerlessSearchPluginStartDependencies + { serverless, management, cloud, indexManagement }: ServerlessSearchPluginStartDependencies ): ServerlessSearchPluginStart { serverless.setProjectHome('/app/elasticsearch'); serverless.setSideNavComponent(createComponent(core, { serverless, cloud })); @@ -94,6 +95,7 @@ export class ServerlessSearchPlugin enabled: true, hideLinksTo: [appIds.MAINTENANCE_WINDOWS], }); + indexManagement?.extensionsService.setIndexMappingsContent(createIndexMappingsContent(core)); return {}; } diff --git a/x-pack/plugins/serverless_search/public/types.ts b/x-pack/plugins/serverless_search/public/types.ts index 5b984289e2bd7..039353fa4e867 100644 --- a/x-pack/plugins/serverless_search/public/types.ts +++ b/x-pack/plugins/serverless_search/public/types.ts @@ -10,6 +10,7 @@ import { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public' import { SecurityPluginStart } from '@kbn/security-plugin/public'; import { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; import { SharePluginStart } from '@kbn/share-plugin/public'; +import { IndexManagementPluginStart } from '@kbn/index-management-plugin/public'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ServerlessSearchPluginSetup {} @@ -29,4 +30,5 @@ export interface ServerlessSearchPluginStartDependencies { security: SecurityPluginStart; serverless: ServerlessPluginStart; share: SharePluginStart; + indexManagement?: IndexManagementPluginStart; } diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index 1886f0ccb21b9..c07cff77aa19e 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -36,5 +36,6 @@ "@kbn/search-connectors", "@kbn/shared-ux-router", "@kbn/kibana-utils-plugin", + "@kbn/index-management-plugin", ] } From 8370020cd69b944a13d1c78bf6e15d016504d7b5 Mon Sep 17 00:00:00 2001 From: Davis McPhee Date: Fri, 10 Nov 2023 12:30:01 -0400 Subject: [PATCH 48/51] [Unified Data Table] Stop escaping column names when copying (#170997) ## Summary When support for copying column values was added to Discover in #132330, it was designed for copying into spreadsheets, so column names and values are escaped when copied. We used the same approach for the the "Copy name" button, but this functionality isn't specific to spreadsheets and is more likely used for copying into search bars, etc. This PR updates the copy name functionality to stop escaping field names. Resolves #170957. ### Checklist - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../utils/copy_value_to_clipboard.test.tsx | 2 +- .../src/utils/copy_value_to_clipboard.ts | 19 +++++-------------- .../group2/_data_grid_copy_to_clipboard.ts | 2 +- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx index 7ff5c9b3f19b6..f49a7ef95ed6d 100644 --- a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx +++ b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.test.tsx @@ -93,7 +93,7 @@ describe('copyValueToClipboard', () => { columnDisplayName: 'text_message', }); - expect(result).toBe('"text_message"'); + expect(result).toBe('text_message'); expect(execCommandMock).toHaveBeenCalledWith('copy'); expect(servicesMock.toastNotifications.addInfo).toHaveBeenCalledWith({ title: 'Copied to clipboard', diff --git a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts index 2e9620b42728b..2fc0606624a0b 100644 --- a/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts +++ b/packages/kbn-unified-data-table/src/utils/copy_value_to_clipboard.ts @@ -131,9 +131,7 @@ export const copyColumnNameToClipboard = ({ columnDisplayName: string; toastNotifications: ToastsStart; }): string | null => { - const nameFormattedResult = convertNameToString(columnDisplayName); - const textToCopy = nameFormattedResult.formattedString; - const copied = copyToClipboard(textToCopy); + const copied = copyToClipboard(columnDisplayName); if (!copied) { toastNotifications.addWarning({ @@ -147,16 +145,9 @@ export const copyColumnNameToClipboard = ({ defaultMessage: 'Copied to clipboard', }); - if (nameFormattedResult.withFormula) { - toastNotifications.addWarning({ - title: toastTitle, - text: WARNING_FOR_FORMULAS, - }); - } else { - toastNotifications.addInfo({ - title: toastTitle, - }); - } + toastNotifications.addInfo({ + title: toastTitle, + }); - return textToCopy; + return columnDisplayName; }; diff --git a/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts b/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts index 06fe279dbd534..27d847f9c49ce 100644 --- a/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts +++ b/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts @@ -79,7 +79,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.clickCopyColumnName('@timestamp'); if (canReadClipboard) { const copiedTimestampName = await browser.getClipboardValue(); - expect(copiedTimestampName).to.be('"\'@timestamp"'); + expect(copiedTimestampName).to.be('@timestamp'); } expect(await toasts.getToastCount()).to.be(1); From 2c90ba9725605089d480a960bad22ec4bfc96974 Mon Sep 17 00:00:00 2001 From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Fri, 10 Nov 2023 17:34:59 +0100 Subject: [PATCH 49/51] File hashing (#171015) ## Summary Closes https://github.com/elastic/kibana/issues/167737 In this PR: - Adds ability to specify a list of hashes to compute per file kind definition. You specify `hashes: ["sha256"]` and the hash will be computed and stored automatically on `.upload()` call. - Enables SHA256 hash computation for the default Kibana file kind, used for images on the Dashboard app. ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- src/plugins/files/common/types.ts | 7 ++++ src/plugins/files/server/file/file.ts | 27 ++++---------- .../file_client/create_es_file_client.ts | 1 + .../files/server/file_client/file_client.ts | 37 +++++++++++++++++-- .../integration_tests/es_file_client.test.ts | 20 ++++++++++ src/plugins/files/server/plugin.ts | 1 + 6 files changed, 70 insertions(+), 23 deletions(-) diff --git a/src/plugins/files/common/types.ts b/src/plugins/files/common/types.ts index 8b6059bdb5637..e2efdb3bdea33 100644 --- a/src/plugins/files/common/types.ts +++ b/src/plugins/files/common/types.ts @@ -20,6 +20,7 @@ import type { } from '@kbn/shared-ux-file-types'; import type { UploadOptions } from '../server/blob_storage_service'; import type { ES_FIXED_SIZE_INDEX_BLOB_STORE } from './constants'; +import type { SupportedFileHashAlgorithm } from '../server/saved_objects/file'; export type { FileKindBase, @@ -94,6 +95,12 @@ export interface FileKind extends FileKindBase { */ share?: HttpEndpointDefinition; }; + + /** + * A list of hashes to compute for this file kind. The hashes will be computed + * during the file upload process and stored in the file metadata. + */ + hashes?: SupportedFileHashAlgorithm[]; } /** Definition for an endpoint that the File's service will generate */ diff --git a/src/plugins/files/server/file/file.ts b/src/plugins/files/server/file/file.ts index eeec150cfc78c..495d233fd421b 100644 --- a/src/plugins/files/server/file/file.ts +++ b/src/plugins/files/server/file/file.ts @@ -19,7 +19,6 @@ import { Observable, lastValueFrom, } from 'rxjs'; -import { isFileHashTransform } from '../file_client/stream_transforms/file_hash_transform/file_hash_transform'; import { UploadOptions } from '../blob_storage_service'; import type { FileShareJSON, FileShareJSONWithToken } from '../../common/types'; import type { File as IFile, UpdatableFileMetadata, FileJSON } from '../../common'; @@ -72,10 +71,7 @@ export class File implements IFile { return this; } - private upload( - content: Readable, - options?: Partial> - ): Observable<{ size: number }> { + private upload(content: Readable, options?: Partial>) { return defer(() => this.fileClient.upload(this.metadata, content, options)); } @@ -104,26 +100,17 @@ export class File implements IFile { ) ) ), - mergeMap(({ size }) => { + mergeMap(({ size, hashes }) => { const updatedStateAction: Action & { action: 'uploaded' } = { action: 'uploaded', payload: { size }, }; - if (options && options.transforms) { - options.transforms.some((transform) => { - if (isFileHashTransform(transform)) { - const fileHash = transform.getFileHash(); - - updatedStateAction.payload.hash = { - [fileHash.algorithm]: fileHash.value, - }; - - return true; - } - - return false; - }); + if (hashes && hashes.length) { + updatedStateAction.payload.hash = {}; + for (const { algorithm, value } of hashes) { + updatedStateAction.payload.hash[algorithm] = value; + } } return this.updateFileState(updatedStateAction); diff --git a/src/plugins/files/server/file_client/create_es_file_client.ts b/src/plugins/files/server/file_client/create_es_file_client.ts index 755071d66328c..f9ada86768c2f 100644 --- a/src/plugins/files/server/file_client/create_es_file_client.ts +++ b/src/plugins/files/server/file_client/create_es_file_client.ts @@ -70,6 +70,7 @@ export function createEsFileClient(arg: CreateEsFileClientArgs): FileClient { id: NO_FILE_KIND, http: {}, maxSizeBytes, + hashes: ['md5', 'sha1', 'sha256', 'sha512'], }, new EsIndexFilesMetadataClient(metadataIndex, elasticsearchClient, logger, indexIsAlias), new ElasticsearchBlobStorageClient( diff --git a/src/plugins/files/server/file_client/file_client.ts b/src/plugins/files/server/file_client/file_client.ts index 3bce97f6bcade..26dbc90a44b90 100644 --- a/src/plugins/files/server/file_client/file_client.ts +++ b/src/plugins/files/server/file_client/file_client.ts @@ -40,6 +40,9 @@ import { withReportPerformanceMetric, FILE_DOWNLOAD_PERFORMANCE_EVENT_NAME, } from '../performance'; +import { createFileHashTransform } from './stream_transforms/file_hash_transform'; +import { isFileHashTransform } from './stream_transforms/file_hash_transform/file_hash_transform'; +import { SupportedFileHashAlgorithm } from '../saved_objects/file'; export type UploadOptions = Omit; @@ -216,8 +219,8 @@ export class FileClientImpl implements FileClient { file: FileJSON, rs: Readable, options?: UploadOptions - ): ReturnType => { - const { maxSizeBytes } = this.fileKindDescriptor; + ): Promise => { + const { maxSizeBytes, hashes } = this.fileKindDescriptor; const { transforms = [], ...blobOptions } = options || {}; let maxFileSize: number = typeof maxSizeBytes === 'number' ? maxSizeBytes : fourMiB; @@ -231,11 +234,30 @@ export class FileClientImpl implements FileClient { transforms.push(enforceMaxByteSizeTransform(maxFileSize)); - return this.blobStorageClient.upload(rs, { + if (hashes && hashes.length) { + for (const hash of hashes) { + transforms.push(createFileHashTransform(hash)); + } + } + + const uploadResult = await this.blobStorageClient.upload(rs, { ...blobOptions, transforms, id: file.id, }); + + const result: UploadResult = { ...uploadResult, hashes: [] }; + + if (transforms && transforms.length) { + for (const transform of transforms) { + if (isFileHashTransform(transform)) { + const fileHash = transform.getFileHash(); + result.hashes.push(fileHash); + } + } + } + + return result; }; public download: BlobStorageClient['download'] = async (args) => { @@ -300,3 +322,12 @@ export class FileClientImpl implements FileClient { return this.internalFileShareService.list(args); }; } + +export interface UploadResult { + id: string; + size: number; + hashes: Array<{ + algorithm: SupportedFileHashAlgorithm; + value: string; + }>; +} diff --git a/src/plugins/files/server/file_client/integration_tests/es_file_client.test.ts b/src/plugins/files/server/file_client/integration_tests/es_file_client.test.ts index cbe80422e388b..d4c6d268fa7dc 100644 --- a/src/plugins/files/server/file_client/integration_tests/es_file_client.test.ts +++ b/src/plugins/files/server/file_client/integration_tests/es_file_client.test.ts @@ -97,6 +97,26 @@ describe('ES-index-backed file client', () => { await deleteFile({ id: file.id, hasContent: true }); }); + test('computes file hashes', async () => { + const file = await fileClient.create({ + id: '123', + metadata: { + name: 'cool name', + }, + }); + await file.uploadContent(Readable.from([Buffer.from('test')])); + + expect(file.toJSON().hash).toStrictEqual({ + md5: '098f6bcd4621d373cade4e832627b4f6', + sha1: 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3', + sha256: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + sha512: + 'ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff', + }); + + await deleteFile({ id: file.id, hasContent: true }); + }); + test('searches across files', async () => { const { id: id1 } = await fileClient.create({ id: '123', diff --git a/src/plugins/files/server/plugin.ts b/src/plugins/files/server/plugin.ts index ba63e08b2ed21..9e608d8f38a59 100755 --- a/src/plugins/files/server/plugin.ts +++ b/src/plugins/files/server/plugin.ts @@ -139,6 +139,7 @@ export class FilesPlugin implements Plugin Date: Fri, 10 Nov 2023 17:47:35 +0100 Subject: [PATCH 50/51] Enable custom threshold and inventory rules in Serverless (#170351) Closes #170327 Relates to https://github.com/elastic/kibana/issues/168034 ## Summary This PR enables the custom threshold and inventory rules in Serverless. |Custom threshold rule|Inventory rule| |---|---| |![image](https://github.com/elastic/kibana/assets/12370520/35468ded-d936-4bb1-b16b-0bcfe987e0f1)|![image](https://github.com/elastic/kibana/assets/12370520/1d1a65e0-78f5-4550-a620-9342b28ec5a9)| Related PR: [Add the query delay mechanism to the inventory rule type and change consumer to Observability](https://github.com/elastic/kibana/pull/170628) --- x-pack/plugins/infra/server/plugin.ts | 4 ++-- x-pack/plugins/observability/server/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/infra/server/plugin.ts b/x-pack/plugins/infra/server/plugin.ts index 6a2734b399199..afcbe69c01f5c 100644 --- a/x-pack/plugins/infra/server/plugin.ts +++ b/x-pack/plugins/infra/server/plugin.ts @@ -98,7 +98,7 @@ export const config: PluginConfigDescriptor = { }), inventoryThresholdAlertRuleEnabled: offeringBasedSchema({ traditional: schema.boolean({ defaultValue: true }), - serverless: schema.boolean({ defaultValue: false }), + serverless: schema.boolean({ defaultValue: true }), }), metricThresholdAlertRuleEnabled: offeringBasedSchema({ traditional: schema.boolean({ defaultValue: true }), @@ -110,7 +110,7 @@ export const config: PluginConfigDescriptor = { }), alertsAndRulesDropdownEnabled: offeringBasedSchema({ traditional: schema.boolean({ defaultValue: true }), - serverless: schema.boolean({ defaultValue: false }), + serverless: schema.boolean({ defaultValue: true }), }), }), }), diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts index 96231115e3fa2..2153d00abdbc6 100644 --- a/x-pack/plugins/observability/server/index.ts +++ b/x-pack/plugins/observability/server/index.ts @@ -48,7 +48,7 @@ const configSchema = schema.object({ }), thresholdRule: schema.object({ enabled: offeringBasedSchema({ - serverless: schema.boolean({ defaultValue: false }), + serverless: schema.boolean({ defaultValue: true }), traditional: schema.boolean({ defaultValue: true }), }), }), From 41cacd1e0c5c3f480eaad84e9d914731c448bb02 Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Fri, 10 Nov 2023 12:01:34 -0500 Subject: [PATCH 51/51] [Security Solution] Fixes create/edit rule form subtechnique selection bug (#170465) --- .../components/rules/mitre/subtechnique_fields.tsx | 9 ++++----- .../components/rules/mitre/technique_fields.tsx | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/mitre/subtechnique_fields.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/mitre/subtechnique_fields.tsx index efc542f9757a1..7645bc2c2c579 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/mitre/subtechnique_fields.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/mitre/subtechnique_fields.tsx @@ -13,7 +13,6 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; -import { camelCase } from 'lodash/fp'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; @@ -110,9 +109,9 @@ export const MitreAttackSubtechniqueFields: React.FC = ({ }, [field, onFieldChange, techniqueIndex, technique, threatIndex]); const updateSubtechnique = useCallback( - (index: number, value: string) => { + (index: number, optionId: string) => { const threats = [...(field.value as Threats)]; - const { id, reference, name } = subtechniquesOptions.find((t) => t.value === value) || { + const { id, reference, name } = subtechniquesOptions.find((t) => t.id === optionId) ?? { id: '', name: '', reference: '', @@ -170,7 +169,7 @@ export const MitreAttackSubtechniqueFields: React.FC = ({ : []), ...options.map((option) => ({ inputDisplay: <>{option.label}, - value: option.value, + value: option.id, disabled, })), ]} @@ -178,7 +177,7 @@ export const MitreAttackSubtechniqueFields: React.FC = ({ aria-label="" onChange={updateSubtechnique.bind(null, index)} fullWidth={true} - valueOfSelected={camelCase(subtechnique.name)} + valueOfSelected={subtechnique.id} data-test-subj="mitreAttackSubtechnique" disabled={disabled} placeholder={i18n.SUBTECHNIQUE_PLACEHOLDER} diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/mitre/technique_fields.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/mitre/technique_fields.tsx index 0215204a98cbd..bb677801ecaa9 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/mitre/technique_fields.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/mitre/technique_fields.tsx @@ -13,7 +13,7 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; -import { kebabCase, camelCase } from 'lodash/fp'; +import { kebabCase } from 'lodash/fp'; import React, { useCallback, useEffect, useState } from 'react'; import styled, { css } from 'styled-components'; @@ -105,9 +105,9 @@ export const MitreAttackTechniqueFields: React.FC = ({ }, [field, threatIndex, onFieldChange]); const updateTechnique = useCallback( - (index: number, value: string) => { + (index: number, optionId: string) => { const threats = [...(field.value as Threats)]; - const { id, reference, name } = techniquesOptions.find((t) => t.value === value) || { + const { id, reference, name } = techniquesOptions.find((t) => t.id === optionId) ?? { id: '', name: '', reference: '', @@ -153,7 +153,7 @@ export const MitreAttackTechniqueFields: React.FC = ({ : []), ...options.map((option) => ({ inputDisplay: <>{option.label}, - value: option.value, + value: option.id, disabled, })), ]} @@ -161,7 +161,7 @@ export const MitreAttackTechniqueFields: React.FC = ({ aria-label="" onChange={updateTechnique.bind(null, index)} fullWidth={true} - valueOfSelected={camelCase(technique.name)} + valueOfSelected={technique.id} data-test-subj="mitreAttackTechnique" disabled={disabled} placeholder={i18n.TECHNIQUE_PLACEHOLDER}