From 957e1342ef9ac5b9496f3c03816b4b383c30220b Mon Sep 17 00:00:00 2001 From: Kaan Yalti Date: Wed, 29 May 2024 01:47:45 -0700 Subject: [PATCH 01/95] Feat/179915 suport data tagging (#183563) ## Summary This PR updates kibana backend so that users can add global data tags to agent policy inputs Relates: #179915 ### 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 - [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 - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] 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) ### Manual Testing - start elasticsearch and kibana - navigate to stack management and create an api key - download agent - create agent policy with system integration - update the agent to add data tags ``` curl --location --request PUT 'http://localhost:5601/api/fleet/agent_policies/:policyId' \ --header 'Content-Type: application/json' \ --header 'Authorization: ApiKey ' \ --header 'Elastic-Api-Version: 2023-10-31' \ --header 'kbn-xsrf: true' \ --data '{ "name": "asdfasdf", "namespace": "default", "global_data_tags": [ { "name": "newtag", "value": "testing" } ] }' ``` - deploy a standalone agent - go to the discovery tab and search for the tag name and validate that the values are populated. (note: seeing a value may take some time, 2~3 min) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../current_fields.json | 1 + .../current_mappings.json | 4 + .../check_registered_types.test.ts | 2 +- x-pack/plugins/fleet/common/constants/epm.ts | 32 ++++ .../plugins/fleet/common/openapi/bundled.json | 34 +++++ .../plugins/fleet/common/openapi/bundled.yaml | 22 +++ .../components/schemas/agent_policy.yaml | 9 ++ .../schemas/agent_policy_create_request.yaml | 9 ++ .../fleet/common/types/models/agent_policy.ts | 16 ++ .../fleet/server/saved_objects/index.ts | 11 ++ .../agent_policies/full_agent_policy.ts | 3 +- .../package_policies_to_agent_inputs.test.ts | 139 ++++++++++++++++++ .../package_policies_to_agent_inputs.ts | 32 +++- .../fleet/server/services/agent_policy.ts | 1 + .../server/types/models/agent_policy.test.ts | 95 ++++++++++++ .../fleet/server/types/models/agent_policy.ts | 49 ++++++ .../fleet/server/types/so_attributes.ts | 1 + .../apis/agent_policy/agent_policy.ts | 94 +++++++++++- 18 files changed, 548 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/fleet/server/types/models/agent_policy.test.ts diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 703730a262281..e743f325ff441 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -500,6 +500,7 @@ "description", "download_source_id", "fleet_server_host_id", + "global_data_tags", "inactivity_timeout", "is_default", "is_default_fleet_server", diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 94f2148280f08..3e38e78694dad 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -1678,6 +1678,10 @@ "fleet_server_host_id": { "type": "keyword" }, + "global_data_tags": { + "index": false, + "type": "flattened" + }, "inactivity_timeout": { "type": "integer" }, 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 1de50f0547b35..be06461d0015d 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 @@ -109,7 +109,7 @@ describe('checking migration metadata changes on all registered SO types', () => "infra-custom-dashboards": "1a5994f2e05bb8a1609825ddbf5012f77c5c67f3", "infrastructure-monitoring-log-view": "5f86709d3c27aed7a8379153b08ee5d3d90d77f5", "infrastructure-ui-source": "113182d6895764378dfe7fa9fa027244f3a457c4", - "ingest-agent-policies": "803dc27e106440c41e8f3c3d8ee8bbb0821bcde2", + "ingest-agent-policies": "90625b4a5ded9d4867358fcccc14a57c0454fcee", "ingest-download-sources": "279a68147e62e4d8858c09ad1cf03bd5551ce58d", "ingest-outputs": "daafff49255ab700e07491376fe89f04fc998b91", "ingest-package-policies": "44c682a6bf23993c665f0a60a427f3c120a0a10d", diff --git a/x-pack/plugins/fleet/common/constants/epm.ts b/x-pack/plugins/fleet/common/constants/epm.ts index 562f099fdd3ca..e10485affa87f 100644 --- a/x-pack/plugins/fleet/common/constants/epm.ts +++ b/x-pack/plugins/fleet/common/constants/epm.ts @@ -25,6 +25,38 @@ export const FLEET_CLOUD_SECURITY_POSTURE_KSPM_POLICY_TEMPLATE = 'kspm'; export const FLEET_CLOUD_SECURITY_POSTURE_CSPM_POLICY_TEMPLATE = 'cspm'; export const FLEET_CLOUD_SECURITY_POSTURE_CNVM_POLICY_TEMPLATE = 'vuln_mgmt'; export const FLEET_CLOUD_DEFEND_PACKAGE = 'cloud_defend'; +export const FLEET_PF_HOST_AGENT_PACKAGE = 'pf-host-agent'; +export const FLEET_PF_ELASTIC_SYMBOLIZER_PACKAGE = 'pf-elastic-symbolizer'; +export const FLEET_PF_ELASTIC_COLLECTOR_PACKAGE = 'pf-elastic-collector'; +export const FLEET_CLOUD_BEAT_PACKAGE = 'cloudbeat'; +export const FLEET_CLOUD_BEAT_CIS_K8S_PACKAGE = `${FLEET_CLOUD_BEAT_PACKAGE}/cis_k8s`; +export const FLEET_CLOUD_BEAT_CIS_EKS_PACKAGE = `${FLEET_CLOUD_BEAT_PACKAGE}/cis_eks`; +export const FLEET_CLOUD_BEAT_CIS_AWS_PACKAGE = `${FLEET_CLOUD_BEAT_PACKAGE}/cis_aws`; +export const FLEET_CLOUD_BEAT_CIS_GCP_PACKAGE = `${FLEET_CLOUD_BEAT_PACKAGE}/cis_gcp`; +export const FLEET_CLOUD_BEAT_CIS_AZURE_PACKAGE = `${FLEET_CLOUD_BEAT_PACKAGE}/cis_azure`; +export const FLEET_CLOUD_BEAT_VULN_MGMT_AWS_PACKAGE = `${FLEET_CLOUD_BEAT_PACKAGE}/vuln_mgmt_aws`; + +export const GLOBAL_DATA_TAG_EXCLUDED_INPUTS = new Set([ + FLEET_APM_PACKAGE, + FLEET_PF_HOST_AGENT_PACKAGE, + FLEET_PF_ELASTIC_SYMBOLIZER_PACKAGE, + FLEET_PF_ELASTIC_COLLECTOR_PACKAGE, + /* The package names and input types are not the same. For example package + * name for fleet server is "fleet_server" whereas the input type is "fleet-server". + * This is the same case for cloud defend. That's why we are replacing the + * underscores with dashes for the two of them. Global data tag functionality + * relies on input types. + */ + FLEET_SERVER_PACKAGE.replace(/_/g, '-'), + FLEET_CLOUD_DEFEND_PACKAGE.replace(/_/g, '-'), + FLEET_CLOUD_BEAT_PACKAGE, + FLEET_CLOUD_BEAT_CIS_K8S_PACKAGE, + FLEET_CLOUD_BEAT_CIS_EKS_PACKAGE, + FLEET_CLOUD_BEAT_CIS_AWS_PACKAGE, + FLEET_CLOUD_BEAT_CIS_GCP_PACKAGE, + FLEET_CLOUD_BEAT_CIS_AZURE_PACKAGE, + FLEET_CLOUD_BEAT_VULN_MGMT_AWS_PACKAGE, +]); export const PACKAGE_TEMPLATE_SUFFIX = '@package'; export const USER_SETTINGS_TEMPLATE_SUFFIX = '@custom'; diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 5cbc85dd12ce1..709692b82c6ac 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -7660,6 +7660,23 @@ "supports_agentless": { "type": "boolean", "description": "Indicates whether the agent policy supports agentless integrations. Only allowed in a serverless environment." + }, + "global_data_tags": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "description": "User defined data tags that are added to all of the inputs. The values can be strings or numbers." + } } }, "required": [ @@ -7741,6 +7758,23 @@ "force": { "type": "boolean", "description": "Force agent policy creation even if packages are not verified." + }, + "global_data_tags": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "description": "User defined data tags that are added to all of the inputs. The values can be strings or numbers." + } } }, "required": [ diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index f0f5bf761ada8..93ed244d05805 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -4933,6 +4933,17 @@ components: description: >- Indicates whether the agent policy supports agentless integrations. Only allowed in a serverless environment. + global_data_tags: + type: array + items: + type: object + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. required: - id - status @@ -4990,6 +5001,17 @@ components: force: type: boolean description: Force agent policy creation even if packages are not verified. + global_data_tags: + type: array + items: + type: object + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. required: - name - namespace diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml index 5f8a2f578132e..02fd5c2800a48 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml @@ -78,6 +78,15 @@ properties: supports_agentless: type: boolean description: Indicates whether the agent policy supports agentless integrations. Only allowed in a serverless environment. + global_data_tags: + type: array + items: + type: object + additionalProperties: + oneOf: + - type: string + - type: number + description: User defined data tags that are added to all of the inputs. The values can be strings or numbers. required: - id - status diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_create_request.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_create_request.yaml index d2b69e37672e8..1d39b911b3007 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_create_request.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_create_request.yaml @@ -49,6 +49,15 @@ properties: force: type: boolean description: Force agent policy creation even if packages are not verified. + global_data_tags: + type: array + items: + type: object + additionalProperties: + oneOf: + - type: string + - type: number + description: User defined data tags that are added to all of the inputs. The values can be strings or numbers. required: - name - namespace diff --git a/x-pack/plugins/fleet/common/types/models/agent_policy.ts b/x-pack/plugins/fleet/common/types/models/agent_policy.ts index 9bae6421050de..7243c54007fd9 100644 --- a/x-pack/plugins/fleet/common/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/agent_policy.ts @@ -42,6 +42,12 @@ export interface NewAgentPolicy { advanced_settings?: { [key: string]: any } | null; keep_monitoring_alive?: boolean | null; supports_agentless?: boolean | null; + global_data_tags?: GlobalDataTag[]; +} + +export interface GlobalDataTag { + name: string; + value: string | number; } // SO definition for this type is declared in server/types/interfaces @@ -80,9 +86,19 @@ export interface FullAgentPolicyInput { [key: string]: unknown; }; streams?: FullAgentPolicyInputStream[]; + processors?: FullAgentPolicyAddFields[]; [key: string]: any; } +export interface FullAgentPolicyAddFields { + add_fields: { + target: string; + fields: { + [key: string]: string | number; + }; + }; +} + export type FullAgentPolicyOutputPermissions = Record; export type FullAgentPolicyOutput = Pick & { diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index 8e058a3a3ff8f..bb8eaba04a6c7 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -167,6 +167,7 @@ export const getSavedObjectTypes = ( keep_monitoring_alive: { type: 'boolean' }, advanced_settings: { type: 'flattened', index: false }, supports_agentless: { type: 'boolean' }, + global_data_tags: { type: 'flattened', index: false }, }, }, migrations: { @@ -197,6 +198,16 @@ export const getSavedObjectTypes = ( }, ], }, + '3': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + global_data_tags: { type: 'flattened', index: false }, + }, + }, + ], + }, }, }, [OUTPUT_SAVED_OBJECT_TYPE]: { diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts index bec47eea524c4..bcc6956711b64 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts @@ -118,7 +118,8 @@ export async function getFullAgentPolicy( agentPolicy.package_policies as PackagePolicy[], packageInfoCache, getOutputIdForAgentPolicy(dataOutput), - agentPolicy.namespace + agentPolicy.namespace, + agentPolicy.global_data_tags ); const features = (agentPolicy.agent_features || []).reduce((acc, { name, ...featureConfig }) => { acc[name] = featureConfig; diff --git a/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.test.ts b/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.test.ts index 23998b7f7cdd1..eb94fc7a1c67b 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.test.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { GLOBAL_DATA_TAG_EXCLUDED_INPUTS } from '../../../common/constants/epm'; + import type { PackagePolicy, PackagePolicyInput } from '../../types'; import { storedPackagePoliciesToAgentInputs } from './package_policies_to_agent_inputs'; @@ -737,4 +739,141 @@ describe('Fleet - storedPackagePoliciesToAgentInputs', () => { }, ]); }); + + it('returns agent inputs with add fields process if global data tags are defined', async () => { + const excludedInputs: PackagePolicyInput[] = []; + const expectedExcluded = []; + + for (const input of GLOBAL_DATA_TAG_EXCLUDED_INPUTS) { + excludedInputs.push({ + type: input, + enabled: true, + vars: { + inputVar: { value: 'input-value' }, + inputVar2: { value: undefined }, + inputVar3: { + type: 'yaml', + value: 'testField: test', + }, + inputVar4: { value: '' }, + }, + streams: [], + }); + + expectedExcluded.push({ + data_stream: { + namespace: 'default', + }, + id: `${input}-some-uuid`, + meta: { + package: { + name: 'mock_package', + version: '0.0.0', + }, + }, + name: 'mock_package-policy', + package_policy_id: 'some-uuid', + revision: 1, + type: input, + use_output: 'default', + }); + } + + expect( + await storedPackagePoliciesToAgentInputs( + [ + { + ...mockPackagePolicy, + package: { + name: 'mock_package', + title: 'Mock package', + version: '0.0.0', + }, + inputs: [ + ...excludedInputs, + { + ...mockInput, + compiled_input: { + inputVar: 'input-value', + }, + streams: [], + }, + { + ...mockInput2, + compiled_input: { + inputVar: 'input-value', + }, + streams: [], + }, + ], + }, + ], + packageInfoCache, + undefined, + undefined, + [ + { name: 'testName', value: 'testValue' }, + { name: 'testName2', value: 'testValue2' }, + ] + ) + ).toEqual([ + ...expectedExcluded, + { + id: 'test-logs-some-uuid', + name: 'mock_package-policy', + package_policy_id: 'some-uuid', + processors: [ + { + add_fields: { + fields: { + testName: 'testValue', + testName2: 'testValue2', + }, + target: '', + }, + }, + ], + revision: 1, + type: 'test-logs', + data_stream: { namespace: 'default' }, + use_output: 'default', + meta: { + package: { + name: 'mock_package', + version: '0.0.0', + }, + }, + inputVar: 'input-value', + }, + { + id: 'test-metrics-some-template-some-uuid', + data_stream: { + namespace: 'default', + }, + inputVar: 'input-value', + meta: { + package: { + name: 'mock_package', + version: '0.0.0', + }, + }, + name: 'mock_package-policy', + package_policy_id: 'some-uuid', + processors: [ + { + add_fields: { + target: '', + fields: { + testName: 'testValue', + testName2: 'testValue2', + }, + }, + }, + ], + revision: 1, + type: 'test-metrics', + use_output: 'default', + }, + ]); + }); }); diff --git a/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts b/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts index 3783f0035bf80..0a1643f293e58 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_inputs.ts @@ -7,6 +7,7 @@ import { merge } from 'lodash'; import deepMerge from 'deepmerge'; +import type { FullAgentPolicyAddFields, GlobalDataTag } from '../../../common/types'; import { isPackageLimited } from '../../../common/services'; import type { PackagePolicy, @@ -17,6 +18,7 @@ import type { } from '../../types'; import { DEFAULT_OUTPUT } from '../../constants'; import { pkgToPkgKey } from '../epm/registry'; +import { GLOBAL_DATA_TAG_EXCLUDED_INPUTS } from '../../../common/constants/epm'; const isPolicyEnabled = (packagePolicy: PackagePolicy) => { return packagePolicy.enabled && packagePolicy.inputs && packagePolicy.inputs.length; @@ -26,7 +28,8 @@ export const storedPackagePolicyToAgentInputs = ( packagePolicy: PackagePolicy, packageInfo?: PackageInfo, outputId: string = DEFAULT_OUTPUT.name, - agentPolicyNamespace?: string + agentPolicyNamespace?: string, + addFields?: FullAgentPolicyAddFields ): FullAgentPolicyInput[] => { const fullInputs: FullAgentPolicyInput[] = []; @@ -64,6 +67,10 @@ export const storedPackagePolicyToAgentInputs = ( ...getFullInputStreams(input), }; + if (addFields && !GLOBAL_DATA_TAG_EXCLUDED_INPUTS.has(fullInput.type)) { + fullInput.processors = [addFields]; + } + // deeply merge the input.config values with the full policy input merge( fullInput, @@ -134,10 +141,13 @@ export const storedPackagePoliciesToAgentInputs = async ( packagePolicies: PackagePolicy[], packageInfoCache: Map, outputId: string = DEFAULT_OUTPUT.name, - agentPolicyNamespace?: string + agentPolicyNamespace?: string, + globalDataTags?: GlobalDataTag[] ): Promise => { const fullInputs: FullAgentPolicyInput[] = []; + const addFields = globalDataTags ? globalDataTagsToAddFields(globalDataTags) : undefined; + for (const packagePolicy of packagePolicies) { if (!isPolicyEnabled(packagePolicy)) { continue; @@ -152,10 +162,26 @@ export const storedPackagePoliciesToAgentInputs = async ( packagePolicy, packageInfo, outputId, - agentPolicyNamespace + agentPolicyNamespace, + addFields ) ); } return fullInputs; }; + +const globalDataTagsToAddFields = (tags: GlobalDataTag[]): FullAgentPolicyAddFields => { + const fields: { [key: string]: string | number } = {}; + + tags.forEach((tag) => { + fields[tag.name] = tag.value; + }); + + return { + add_fields: { + target: '', + fields, + }, + }; +}; diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 635948a5ca4e3..3e564d0fe8536 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -664,6 +664,7 @@ class AgentPolicyService { 'download_source_id', 'fleet_server_host_id', 'supports_agentless', + 'global_data_tags', ]), ...newAgentPolicyProps, }, diff --git a/x-pack/plugins/fleet/server/types/models/agent_policy.test.ts b/x-pack/plugins/fleet/server/types/models/agent_policy.test.ts new file mode 100644 index 0000000000000..2dea7144df4f5 --- /dev/null +++ b/x-pack/plugins/fleet/server/types/models/agent_policy.test.ts @@ -0,0 +1,95 @@ +/* + * 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 { GlobalDataTag } from '../../../common/types'; + +import { AgentPolicyBaseSchema } from './agent_policy'; + +describe('AgentPolicyBaseSchema', () => { + describe('global_data_tags validations', () => { + it('should throw an error if provided with duplicate tag names', () => { + const tags: GlobalDataTag[] = [ + { + name: 'testName', + value: 'testValue', + }, + { + name: 'testName', + value: 'testValue2', + }, + { + name: 'anotherName', + value: 'value', + }, + { + name: 'anotherName', + value: 'value2', + }, + ]; + + expect(() => { + AgentPolicyBaseSchema.global_data_tags.validate(tags); + }).toThrow( + `Found duplicate tag names: ['testName', 'anotherName'], duplicate tag names are not allowed.` + ); + }); + + it('should throw an error if provided with tag names with spaces in it', () => { + const tags: GlobalDataTag[] = [ + { + name: ' testName', + value: 'testValue', + }, + { + name: 'test Name', + value: 'testValue2', + }, + ]; + + expect(() => { + AgentPolicyBaseSchema.global_data_tags.validate(tags); + }).toThrow( + `Found tag names with spaces: [' testName', 'test Name'], tag names with spaces are not allowed.` + ); + }); + + it('should throw an error showing all validation errors', () => { + const tags: GlobalDataTag[] = [ + { + name: ' testName', + value: 'testValue', + }, + { + name: 'testName ', + value: 'testValue2', + }, + ]; + + expect(() => { + AgentPolicyBaseSchema.global_data_tags.validate(tags); + }).toThrow( + `Found duplicate tag names: ['testName'], duplicate tag names are not allowed. Found tag names with spaces: [' testName', 'testName '], tag names with spaces are not allowed.` + ); + }); + + it('should not throw an error if provided with valid global data tags', () => { + const tags: GlobalDataTag[] = [ + { + name: 'testName', + value: 'testValue', + }, + { + name: 'anotherName', + value: 'anotherValue', + }, + ]; + + expect(() => { + AgentPolicyBaseSchema.global_data_tags.validate(tags); + }).not.toThrow(); + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/types/models/agent_policy.ts b/x-pack/plugins/fleet/server/types/models/agent_policy.ts index ed2a50854c58b..43928b3737e21 100644 --- a/x-pack/plugins/fleet/server/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/models/agent_policy.ts @@ -7,6 +7,8 @@ import { schema } from '@kbn/config-schema'; +import type { GlobalDataTag } from '../../../common/types'; + import { agentPolicyStatuses, dataTypes } from '../../../common/constants'; import { isValidNamespace } from '../../../common/services'; import { getSettingsAPISchema } from '../../services/form_settings'; @@ -84,8 +86,55 @@ export const AgentPolicyBaseSchema = { ), ...getSettingsAPISchema('AGENT_POLICY_ADVANCED_SETTINGS'), supports_agentless: schema.maybe(schema.boolean({ defaultValue: false })), + global_data_tags: schema.maybe( + schema.arrayOf( + schema.object({ + name: schema.string(), + value: schema.oneOf([schema.string(), schema.number()]), + }), + { + validate: validateGlobalDataTagInput, + } + ) + ), }; +function validateGlobalDataTagInput(tags: GlobalDataTag[]): string | undefined { + const seen = new Set([]); + const duplicates: string[] = []; + const namesWithSpaces: string[] = []; + const errors: string[] = []; + + for (const tag of tags) { + if (/\s/.test(tag.name)) { + namesWithSpaces.push(`'${tag.name}'`); + } + + if (!seen.has(tag.name.trim())) { + seen.add(tag.name.trim()); + } else { + duplicates.push(`'${tag.name.trim()}'`); + } + } + + if (duplicates.length !== 0) { + errors.push( + `Found duplicate tag names: [${duplicates.join(', ')}], duplicate tag names are not allowed.` + ); + } + if (namesWithSpaces.length !== 0) { + errors.push( + `Found tag names with spaces: [${namesWithSpaces.join( + ', ' + )}], tag names with spaces are not allowed.` + ); + } + + if (errors.length !== 0) { + return errors.join(' '); + } +} + export const NewAgentPolicySchema = schema.object({ ...AgentPolicyBaseSchema, force: schema.maybe(schema.boolean()), diff --git a/x-pack/plugins/fleet/server/types/so_attributes.ts b/x-pack/plugins/fleet/server/types/so_attributes.ts index 8db683ba136de..ac084733b81d7 100644 --- a/x-pack/plugins/fleet/server/types/so_attributes.ts +++ b/x-pack/plugins/fleet/server/types/so_attributes.ts @@ -64,6 +64,7 @@ export interface AgentPolicySOAttributes { package_policies?: PackagePolicy[]; agents?: number; overrides?: any | null; + global_data_tags?: Array<{ name: string; value: string | number }>; } export interface AgentSOAttributes { diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts index 3d13f43531f3f..625f8a444f608 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts @@ -437,6 +437,40 @@ export default function (providerContext: FtrProviderContext) { expect(policy.package_policies[0].name).be('system-457'); }); + + it('should create policy with global data tags given valid tags', async () => { + const { + body: { item: createdPolicy }, + } = await supertest + .post(`/api/fleet/agent_policies?sys_monitoring=true`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'global data tag test', + namespace: 'default', + global_data_tags: [ + { name: 'testName', value: 'testValue' }, + { name: 'testName2', value: 123 }, + ], + }) + .expect(200); + + let res = await supertest.get(`/api/fleet/agent_policies/${createdPolicy.id}`).expect(200); + expect(res.body.item.global_data_tags).to.eql([ + { name: 'testName', value: 'testValue' }, + { name: 'testName2', value: 123 }, + ]); + + res = await supertest.get(`/api/fleet/agent_policies/${createdPolicy.id}/full`).expect(200); + for (const input of res.body.item.inputs) { + expect(input.processors).not.to.equal(undefined); + expect(input.processors.length).to.equal(1); + const addFields = input.processors[0].add_fields; + expect(addFields).to.eql({ + fields: { testName: 'testValue', testName2: 123 }, + target: '', + }); + } + }); }); describe('POST /api/fleet/agent_policies/{agentPolicyId}/copy', () => { @@ -838,6 +872,33 @@ export default function (providerContext: FtrProviderContext) { }) .expect(409); }); + + it('should copy global data tags', async () => { + const { + body: { item: policyWithGlobalDataTags }, + } = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Global Data Tag Test', + namespace: 'default', + global_data_tags: [{ name: 'testName', value: 'testValue' }], + }) + .expect(200); + + const { + body: { item: newPolicy }, + } = await supertest + .post(`/api/fleet/agent_policies/${policyWithGlobalDataTags.id}/copy`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Global Data Tag Test Copy', + description: 'Test', + }) + .expect(200); + + expect(newPolicy.global_data_tags).to.eql([{ name: 'testName', value: 'testValue' }]); + }); }); describe('PUT /api/fleet/agent_policies/{agentPolicyId}', () => { @@ -1032,7 +1093,6 @@ export default function (providerContext: FtrProviderContext) { ); expect(installedPackages.length).to.be(0); - agentPolicyId = originalPolicy.id; const { body: { item: updatedPolicy }, @@ -1159,6 +1219,38 @@ export default function (providerContext: FtrProviderContext) { }) .expect(400); }); + + it('should overwrite global data tags if provided with valid input', async () => { + const { + body: { item: originalPolicy }, + } = await supertest + .post(`/api/fleet/agent_policies?sys_monitoring=true`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'TEST', + namespace: 'default', + global_data_tags: [ + { name: 'testName', value: 'testValue' }, + { name: 'testName2', value: 123 }, + ], + }) + .expect(200); + createdPolicyIds.push(originalPolicy.id as string); + + const { + body: { item: updatedPolicy }, + } = await supertest + .put(`/api/fleet/agent_policies/${originalPolicy.id}`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: originalPolicy.name, + namespace: 'default', + global_data_tags: [{ name: 'newTag', value: 'newValue' }], + }) + .expect(200); + + expect(updatedPolicy.global_data_tags).to.eql([{ name: 'newTag', value: 'newValue' }]); + }); }); describe('POST /api/fleet/agent_policies/delete', () => { From b3f64b6f10a3a55146a5e4ed1a3e193998c2dc97 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 29 May 2024 10:48:31 +0200 Subject: [PATCH 02/95] [ES|QL] Remove version from _query requests (#184289) ### Summary Removes the versioning from the _query api requests. This ES PR removes the version from the _query requests https://github.com/elastic/elasticsearch/pull/108919 and got backported at 8.14 too. We need to also remove it from our side too to be in sync with ES changes. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-es-types/src/search.ts | 1 - packages/kbn-esql-utils/constants.ts | 4 ---- packages/kbn-esql-utils/index.ts | 2 +- packages/kbn-esql-utils/src/utils/run_query.ts | 4 ---- .../kbn-generate-csv/src/generate_csv_esql.test.ts | 6 ++---- packages/kbn-generate-csv/src/generate_csv_esql.ts | 2 -- packages/kbn-generate-csv/tsconfig.json | 1 - src/plugins/data/common/search/expressions/esql.ts | 2 -- .../esql_async_search_strategy.test.ts | 12 +----------- src/plugins/data/tsconfig.json | 1 - test/api_integration/apis/esql/errors.ts | 2 -- test/api_integration/apis/search/bsearch.ts | 3 --- test/tsconfig.json | 1 - .../hooks/esql/use_esql_overall_stats_data.ts | 5 +---- .../esql_requests/get_boolean_field_stats.ts | 3 +-- .../esql_requests/get_count_and_cardinality.ts | 3 +-- .../esql_requests/get_date_field_stats.ts | 3 +-- .../esql_requests/get_keyword_fields.ts | 3 +-- .../esql_requests/get_numeric_field_stats.ts | 3 +-- .../classes/sources/esql_source/esql_source.tsx | 7 +------ .../server/functions/query/esql_docs/esql-api.txt | 4 ---- .../server/functions/query/index.ts | 2 -- .../server/functions/query/validate_esql_query.ts | 2 -- .../rule_types/esql/build_esql_search_request.ts | 2 -- .../rule_types/es_query/lib/fetch_esql_query.test.ts | 2 -- .../rule_types/es_query/lib/fetch_esql_query.ts | 2 -- x-pack/test/api_integration/apis/maps/bsearch.ts | 3 --- x-pack/test/tsconfig.json | 1 - 28 files changed, 11 insertions(+), 75 deletions(-) diff --git a/packages/kbn-es-types/src/search.ts b/packages/kbn-es-types/src/search.ts index 34d0e59dde1ed..9802be6d13cb5 100644 --- a/packages/kbn-es-types/src/search.ts +++ b/packages/kbn-es-types/src/search.ts @@ -688,7 +688,6 @@ export interface ESQLSearchParams { // https://github.com/elastic/elasticsearch/pull/102767 // time_zone?: string; query: string; - version: string; filter?: unknown; locale?: string; dropNullColumns?: boolean; diff --git a/packages/kbn-esql-utils/constants.ts b/packages/kbn-esql-utils/constants.ts index a50f03ebea1e2..eae1004e6da7d 100644 --- a/packages/kbn-esql-utils/constants.ts +++ b/packages/kbn-esql-utils/constants.ts @@ -5,8 +5,4 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - -// we are expecting to retrieve this from an API instead -// https://github.com/elastic/elasticsearch/issues/107069 -export const ESQL_LATEST_VERSION = '2024.04.01'; export const ENABLE_ESQL = 'enableESQL'; diff --git a/packages/kbn-esql-utils/index.ts b/packages/kbn-esql-utils/index.ts index 306d187f1ef07..e23b81e0ea7f2 100644 --- a/packages/kbn-esql-utils/index.ts +++ b/packages/kbn-esql-utils/index.ts @@ -23,4 +23,4 @@ export { TextBasedLanguages, } from './src'; -export { ESQL_LATEST_VERSION, ENABLE_ESQL } from './constants'; +export { ENABLE_ESQL } from './constants'; diff --git a/packages/kbn-esql-utils/src/utils/run_query.ts b/packages/kbn-esql-utils/src/utils/run_query.ts index 099109b34a1d4..0de03d778507d 100644 --- a/packages/kbn-esql-utils/src/utils/run_query.ts +++ b/packages/kbn-esql-utils/src/utils/run_query.ts @@ -11,7 +11,6 @@ import type { ISearchGeneric } from '@kbn/search-types'; import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; import type { ESQLColumn, ESQLSearchReponse, ESQLSearchParams } from '@kbn/es-types'; import { lastValueFrom } from 'rxjs'; -import { ESQL_LATEST_VERSION } from '../../constants'; export function formatESQLColumns(columns: ESQLColumn[]): DatatableColumn[] { return columns.map(({ name, type }) => { @@ -41,7 +40,6 @@ export async function getESQLQueryColumnsRaw({ { params: { query: `${esqlQuery} | limit 0`, - version: ESQL_LATEST_VERSION, }, }, { @@ -76,7 +74,6 @@ export async function getESQLQueryColumns({ try { const rawColumns = await getESQLQueryColumnsRaw({ esqlQuery, search, signal }); const columns = formatESQLColumns(rawColumns) ?? []; - return columns; } catch (error) { throw new Error( @@ -112,7 +109,6 @@ export async function getESQLResults({ params: { ...(filter ? { filter } : {}), query: esqlQuery, - version: ESQL_LATEST_VERSION, ...(dropNullColumns ? { dropNullColumns: true } : {}), }, }, diff --git a/packages/kbn-generate-csv/src/generate_csv_esql.test.ts b/packages/kbn-generate-csv/src/generate_csv_esql.test.ts index 4035dce01ce82..a59f86328a528 100644 --- a/packages/kbn-generate-csv/src/generate_csv_esql.test.ts +++ b/packages/kbn-generate-csv/src/generate_csv_esql.test.ts @@ -22,7 +22,6 @@ import type { IKibanaSearchResponse } from '@kbn/search-types'; import { IScopedSearchClient } from '@kbn/data-plugin/server'; import { dataPluginMock } from '@kbn/data-plugin/server/mocks'; import { CancellationToken } from '@kbn/reporting-common'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import type { ReportingConfigType } from '@kbn/reporting-server'; import type { ESQLSearchReponse as ESQLSearchResponse } from '@kbn/es-types'; import { @@ -312,7 +311,7 @@ describe('CsvESQLGenerator', () => { ); expect(mockDataClientSearchFn).toBeCalledWith( - { params: { filter: undefined, locale: 'en', query: '', version: ESQL_LATEST_VERSION } }, + { params: { filter: undefined, locale: 'en', query: '' } }, { strategy: 'esql', transport: { @@ -390,7 +389,7 @@ describe('CsvESQLGenerator', () => { ); expect(mockDataClientSearchFn).toBeCalledWith( - { params: { filter: undefined, locale: 'en', query: '', version: ESQL_LATEST_VERSION } }, + { params: { filter: undefined, locale: 'en', query: '' } }, { strategy: 'esql', transport: { @@ -486,7 +485,6 @@ describe('CsvESQLGenerator', () => { }, locale: 'en', query: '', - version: ESQL_LATEST_VERSION, }, }, { diff --git a/packages/kbn-generate-csv/src/generate_csv_esql.ts b/packages/kbn-generate-csv/src/generate_csv_esql.ts index 91b63f88046af..da9b2f7aaf0c1 100644 --- a/packages/kbn-generate-csv/src/generate_csv_esql.ts +++ b/packages/kbn-generate-csv/src/generate_csv_esql.ts @@ -8,7 +8,6 @@ import { lastValueFrom } from 'rxjs'; import type { Writable } from 'stream'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { errors as esErrors } from '@elastic/elasticsearch'; import type { IScopedClusterClient, IUiSettingsClient, Logger } from '@kbn/core/server'; import type { IKibanaSearchResponse, IKibanaSearchRequest } from '@kbn/search-types'; @@ -95,7 +94,6 @@ export class CsvESQLGenerator { // we will need to add it back in once it is supported again. // https://github.com/elastic/elasticsearch/pull/102767 // timezone - version: ESQL_LATEST_VERSION, }, }; diff --git a/packages/kbn-generate-csv/tsconfig.json b/packages/kbn-generate-csv/tsconfig.json index b3b8e89f077d1..b57990c20eb4a 100644 --- a/packages/kbn-generate-csv/tsconfig.json +++ b/packages/kbn-generate-csv/tsconfig.json @@ -28,7 +28,6 @@ "@kbn/reporting-export-types-csv-common", "@kbn/es-query", "@kbn/es-types", - "@kbn/esql-utils", "@kbn/data-views-plugin", "@kbn/search-types", ] diff --git a/src/plugins/data/common/search/expressions/esql.ts b/src/plugins/data/common/search/expressions/esql.ts index a4d546f349f37..a14d56dfbaebb 100644 --- a/src/plugins/data/common/search/expressions/esql.ts +++ b/src/plugins/data/common/search/expressions/esql.ts @@ -19,7 +19,6 @@ import { catchError, map, switchMap, tap } from 'rxjs'; import { buildEsQuery } from '@kbn/es-query'; import type { ISearchGeneric } from '@kbn/search-types'; import type { ESQLSearchReponse, ESQLSearchParams } from '@kbn/es-types'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { getEsQueryConfig } from '../../es_query'; import { getTime } from '../../query'; import { ESQL_ASYNC_SEARCH_STRATEGY, KibanaContext, ESQL_TABLE_TYPE } from '..'; @@ -148,7 +147,6 @@ export const getEsqlFn = ({ getStartDependencies }: EsqlFnArguments) => { query, // time_zone: timezone, locale, - version: ESQL_LATEST_VERSION, }; if (input) { const esQueryConfigs = getEsQueryConfig( diff --git a/src/plugins/data/server/search/strategies/esql_async_search/esql_async_search_strategy.test.ts b/src/plugins/data/server/search/strategies/esql_async_search/esql_async_search_strategy.test.ts index b1e36954e0b67..b88683157db03 100644 --- a/src/plugins/data/server/search/strategies/esql_async_search/esql_async_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/esql_async_search/esql_async_search_strategy.test.ts @@ -8,7 +8,6 @@ import { firstValueFrom } from 'rxjs'; import { KbnServerError } from '@kbn/kibana-utils-plugin/server'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { KbnSearchError } from '../../report_search_error'; import { errors } from '@elastic/elasticsearch'; import indexNotFoundException from '../../../../common/search/test_data/index_not_found_exception.json'; @@ -67,7 +66,6 @@ describe('ES|QL async search strategy', () => { const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; await esSearch .search( @@ -91,7 +89,6 @@ describe('ES|QL async search strategy', () => { const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); @@ -111,7 +108,6 @@ describe('ES|QL async search strategy', () => { query: 'from logs* | limit 10', wait_for_completion_timeout: '10s', keep_alive: '5m', - version: ESQL_LATEST_VERSION, }; const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); @@ -127,7 +123,7 @@ describe('ES|QL async search strategy', () => { it('sets transport options on POST requests', async () => { const transportOptions = { maxRetries: 1 }; mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); - const params = { query: 'from logs', version: ESQL_LATEST_VERSION }; + const params = { query: 'from logs' }; const esSearch = esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); await firstValueFrom( @@ -144,7 +140,6 @@ describe('ES|QL async search strategy', () => { wait_for_completion_timeout: '100ms', keep_on_completion: false, query: 'from logs', - version: ESQL_LATEST_VERSION, }, }), expect.objectContaining({ maxRetries: 1, meta: true, signal: undefined }) @@ -155,7 +150,6 @@ describe('ES|QL async search strategy', () => { mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; const esSearch = esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); @@ -181,7 +175,6 @@ describe('ES|QL async search strategy', () => { const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); @@ -204,7 +197,6 @@ describe('ES|QL async search strategy', () => { const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); const abortController = new AbortController(); @@ -238,7 +230,6 @@ describe('ES|QL async search strategy', () => { const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); @@ -262,7 +253,6 @@ describe('ES|QL async search strategy', () => { const params = { query: 'from logs* | limit 10', - version: ESQL_LATEST_VERSION, }; const esSearch = await esqlAsyncSearchStrategyProvider(mockSearchConfig, mockLogger); diff --git a/src/plugins/data/tsconfig.json b/src/plugins/data/tsconfig.json index 5a1b06d831486..ccf37a0eba89f 100644 --- a/src/plugins/data/tsconfig.json +++ b/src/plugins/data/tsconfig.json @@ -54,7 +54,6 @@ "@kbn/es-types", "@kbn/code-editor", "@kbn/core-test-helpers-model-versions", - "@kbn/esql-utils", "@kbn/react-kibana-mount", "@kbn/search-types" ], diff --git a/test/api_integration/apis/esql/errors.ts b/test/api_integration/apis/esql/errors.ts index 0d1eea1a16242..ec81e25e7d0f7 100644 --- a/test/api_integration/apis/esql/errors.ts +++ b/test/api_integration/apis/esql/errors.ts @@ -11,7 +11,6 @@ import Path from 'path'; import expect from '@kbn/expect'; import { MappingProperty } from '@elastic/elasticsearch/lib/api/types'; import { REPO_ROOT } from '@kbn/repo-info'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import uniqBy from 'lodash/uniqBy'; import { groupBy, mapValues } from 'lodash'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -127,7 +126,6 @@ export default function ({ getService }: FtrProviderContext) { path: '/_query', body: { query, - version: ESQL_LATEST_VERSION, }, }); return { resp, error: undefined }; diff --git a/test/api_integration/apis/search/bsearch.ts b/test/api_integration/apis/search/bsearch.ts index 440a70db9978a..96b4bbbf622cf 100644 --- a/test/api_integration/apis/search/bsearch.ts +++ b/test/api_integration/apis/search/bsearch.ts @@ -8,7 +8,6 @@ import expect from '@kbn/expect'; import request from 'superagent'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { inflateResponse } from '@kbn/bfetch-plugin/public/streaming'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { BFETCH_ROUTE_VERSION_LATEST } from '@kbn/bfetch-plugin/common'; @@ -414,7 +413,6 @@ export default function ({ getService }: FtrProviderContext) { request: { params: { query: 'from .kibana | limit 1', - version: ESQL_LATEST_VERSION, }, }, options: { @@ -443,7 +441,6 @@ export default function ({ getService }: FtrProviderContext) { request: { params: { query: 'fro .kibana | limit 1', - version: ESQL_LATEST_VERSION, }, }, options: { diff --git a/test/tsconfig.json b/test/tsconfig.json index 3c8ade99b7cc2..5028acbc0d830 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -72,7 +72,6 @@ "@kbn/links-plugin", "@kbn/ftr-common-functional-ui-services", "@kbn/monaco", - "@kbn/esql-utils", "@kbn/search-types", ] } diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts index 18002dab13cd8..06e7737a7d2f8 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/esql/use_esql_overall_stats_data.ts @@ -14,7 +14,7 @@ import { type UseCancellableSearch, useCancellableSearch } from '@kbn/ml-cancell import type { estypes } from '@elastic/elasticsearch'; import type { ISearchOptions } from '@kbn/search-types'; import type { TimeBucketsInterval } from '@kbn/ml-time-buckets'; -import { getESQLWithSafeLimit, ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils'; +import { getESQLWithSafeLimit, appendToESQLQuery } from '@kbn/esql-utils'; import { isDefined } from '@kbn/ml-is-defined'; import { OMIT_FIELDS } from '../../../../../common/constants'; import type { @@ -94,7 +94,6 @@ const getESQLDocumentCountStats = async ( params: { query: aggQuery, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }; try { @@ -140,7 +139,6 @@ const getESQLDocumentCountStats = async ( params: { query: appendToESQLQuery(esqlBaseQuery, ' | STATS _count_ = COUNT(*) | LIMIT 1'), ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }; try { @@ -270,7 +268,6 @@ export const useESQLOverallStatsData = ( // Doing this to match with the default limit query: esqlBaseQuery, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, dropNullColumns: true, }, }, diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts index 69e40a00dc9f4..80941e4ff37fd 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_boolean_field_stats.ts @@ -9,7 +9,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import pLimit from 'p-limit'; -import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils'; +import { appendToESQLQuery } from '@kbn/esql-utils'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; import { getSafeESQLName } from '../requests/esql_utils'; import { isFulfilled, isRejected } from '../../../common/util/promise_all_settled_utils'; @@ -49,7 +49,6 @@ export const getESQLBooleanFieldStats = async ({ params: { query, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }, }; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts index d68696abb3826..80d3f56c4b907 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts @@ -9,7 +9,7 @@ import pLimit from 'p-limit'; import { chunk } from 'lodash'; import { isDefined } from '@kbn/ml-is-defined'; import type { ESQLSearchReponse } from '@kbn/es-types'; -import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils'; +import { appendToESQLQuery } from '@kbn/esql-utils'; import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { i18n } from '@kbn/i18n'; @@ -109,7 +109,6 @@ const getESQLOverallStatsInChunk = async ({ params: { query, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts index 5366a2266af66..4b160d7c18fbb 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_date_field_stats.ts @@ -8,7 +8,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; -import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils'; +import { appendToESQLQuery } from '@kbn/esql-utils'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; import { getSafeESQLName } from '../requests/esql_utils'; import type { DateFieldStats, FieldStatsError } from '../../../../../common/types/field_stats'; @@ -42,7 +42,6 @@ export const getESQLDateFieldStats = async ({ params: { query, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }; try { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts index a6eed452c1a48..02f9370de7b80 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_keyword_fields.ts @@ -9,7 +9,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import pLimit from 'p-limit'; -import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils'; +import { appendToESQLQuery } from '@kbn/esql-utils'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; import { getSafeESQLName } from '../requests/esql_utils'; import { isFulfilled, isRejected } from '../../../common/util/promise_all_settled_utils'; @@ -47,7 +47,6 @@ export const getESQLKeywordFieldStats = async ({ params: { query, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }, }; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts index f9ee1d2c65007..c943ed042fe95 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_numeric_field_stats.ts @@ -8,7 +8,7 @@ import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; import { ESQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; -import { ESQL_LATEST_VERSION, appendToESQLQuery } from '@kbn/esql-utils'; +import { appendToESQLQuery } from '@kbn/esql-utils'; import { chunk } from 'lodash'; import pLimit from 'p-limit'; import type { Column } from '../../hooks/esql/use_esql_overall_stats_data'; @@ -71,7 +71,6 @@ const getESQLNumericFieldStatsInChunk = async ({ params: { query, ...(filter ? { filter } : {}), - version: ESQL_LATEST_VERSION, }, }; try { diff --git a/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx b/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx index af6a60f934e82..a40e8daf79d4a 100644 --- a/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx @@ -11,11 +11,7 @@ import { lastValueFrom } from 'rxjs'; import { tap } from 'rxjs'; import { v4 as uuidv4 } from 'uuid'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; -import { - getIndexPatternFromESQLQuery, - getLimitFromESQLQuery, - ESQL_LATEST_VERSION, -} from '@kbn/esql-utils'; +import { getIndexPatternFromESQLQuery, getLimitFromESQLQuery } from '@kbn/esql-utils'; import { buildEsQuery } from '@kbn/es-query'; import type { Filter, Query } from '@kbn/es-query'; import type { ESQLSearchParams, ESQLSearchReponse } from '@kbn/es-types'; @@ -157,7 +153,6 @@ export class ESQLSource const params: ESQLSearchParams = { query: this._descriptor.esql, dropNullColumns: true, - version: ESQL_LATEST_VERSION, }; const query: Query[] = []; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/esql_docs/esql-api.txt b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/esql_docs/esql-api.txt index f109d7368d862..30555ee481ca9 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/esql_docs/esql-api.txt +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/esql_docs/esql-api.txt @@ -11,7 +11,6 @@ FROM library | SORT year | LIMIT 5 """, - "version": "2024.04.01" ``` } @@ -49,9 +48,6 @@ For syntax, refer to Returning localized results. Passing parameters to a query. `query` (Required, string) ES|QL query to run. For syntax, refer to Syntax reference. -`version` -(Required, string) ES|QL language version. Can be sent in short or long form, e.g. -`2024.04.01` or `2024.04.01.🚀`. See Language versions for details. Response bodyedit `columns` (array of objects) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts index ab0964fdc6216..a049279f7c4e4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts @@ -11,7 +11,6 @@ import pLimit from 'p-limit'; import Path from 'path'; import { lastValueFrom, startWith } from 'rxjs'; import { promisify } from 'util'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { FunctionVisibility, MessageRole } from '@kbn/observability-ai-assistant-plugin/common'; import { VisualizeESQLUserIntention, @@ -127,7 +126,6 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra path: '_query', body: { query, - version: ESQL_LATEST_VERSION, }, })) as ESQLSearchReponse; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts index 7e86ddc49fe80..268b1f5fb5fa6 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts @@ -8,7 +8,6 @@ import { validateQuery } from '@kbn/esql-validation-autocomplete'; import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; import type { ElasticsearchClient } from '@kbn/core/server'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { ESQLSearchReponse } from '@kbn/es-types'; import { esFieldTypeToKibanaFieldType, type KBN_FIELD_TYPES } from '@kbn/field-types'; import { splitIntoCommands } from './correct_common_esql_mistakes'; @@ -57,7 +56,6 @@ export async function validateEsqlQuery({ path: '_query', body: { query: performantQuery, - version: ESQL_LATEST_VERSION, }, }) .then((res) => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/build_esql_search_request.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/build_esql_search_request.ts index 9b04127613d22..54ddd9b818c23 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/build_esql_search_request.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/build_esql_search_request.ts @@ -7,7 +7,6 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { Filter } from '@kbn/es-query'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import type { RuleFilterArray, TimestampOverride, @@ -57,7 +56,6 @@ export const buildEsqlSearchRequest = ({ // we limit size of the response to maxAlertNumber + 1 // ES|QL currently does not support pagination and returns 10,000 results query: `${query} | limit ${size + 1}`, - version: ESQL_LATEST_VERSION, filter: { bool: { filter: requestFilter, diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.test.ts index ce50dcb2edede..1d7096d20140e 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.test.ts @@ -67,7 +67,6 @@ describe('fetchEsqlQuery', () => { }, }, "query": "from test", - "version": "2024.04.01", } `); }); @@ -95,7 +94,6 @@ describe('fetchEsqlQuery', () => { }, }, "query": "from test | limit 100", - "version": "2024.04.01", } `); }); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts index 4b527f529874e..87ae2c1123547 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_esql_query.ts @@ -6,7 +6,6 @@ */ import { parseAggregationResults } from '@kbn/triggers-actions-ui-plugin/common'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { SharePluginStart } from '@kbn/share-plugin/server'; import { IScopedClusterClient, Logger } from '@kbn/core/server'; import { OnlyEsqlQueryRuleParams } from '../types'; @@ -91,7 +90,6 @@ export const getEsqlQuery = ( const query = { query: alertLimit ? `${params.esqlQuery.esql} | limit ${alertLimit}` : params.esqlQuery.esql, - version: ESQL_LATEST_VERSION, filter: { bool: { filter: rangeFilter, diff --git a/x-pack/test/api_integration/apis/maps/bsearch.ts b/x-pack/test/api_integration/apis/maps/bsearch.ts index f995f654eafa4..1813bcd0675c5 100644 --- a/x-pack/test/api_integration/apis/maps/bsearch.ts +++ b/x-pack/test/api_integration/apis/maps/bsearch.ts @@ -8,7 +8,6 @@ import request from 'superagent'; import { inflateResponse } from '@kbn/bfetch-plugin/public/streaming'; import expect from '@kbn/expect'; -import { ESQL_LATEST_VERSION } from '@kbn/esql-utils'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { BFETCH_ROUTE_VERSION_LATEST } from '@kbn/bfetch-plugin/common'; import type { FtrProviderContext } from '../../ftr_provider_context'; @@ -38,7 +37,6 @@ export default function ({ getService }: FtrProviderContext) { request: { params: { query: 'from logstash-* | keep geo.coordinates | limit 0', - version: ESQL_LATEST_VERSION, }, }, options: { @@ -74,7 +72,6 @@ export default function ({ getService }: FtrProviderContext) { dropNullColumns: true, query: 'from logstash-* | keep geo.coordinates, @timestamp | sort @timestamp | limit 1', - version: ESQL_LATEST_VERSION, }, }, options: { diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index e86c9b1039faf..d307c65c96742 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -171,7 +171,6 @@ "@kbn/aiops-log-rate-analysis", "@kbn/apm-data-view", "@kbn/core-saved-objects-api-server", - "@kbn/esql-utils", "@kbn/search-types", "@kbn/analytics-ftr-helpers-plugin", "@kbn/alerting-comparators", From 81191c9548060d745c132cd2b9e7bbe39a540489 Mon Sep 17 00:00:00 2001 From: Dmitrii Shevchenko Date: Wed, 29 May 2024 11:03:26 +0200 Subject: [PATCH 03/95] [Security Solution] Write the rule source field together with the immutable (#183895) **Resolves: https://github.com/elastic/kibana/issues/180141** ## Summary As part of our migration strategy to the new schema, we need to start writing the `rule_source` field together with the `immutable` field to prepare for data migration. We need to ensure that all our endpoints write the `rule_source` field before we start migrating detection rules so we do not end up in a situation when our data is migrated but rule CRUD endpoints continue writing the old format. With this PR, we start writing `rule_source` on every rule modification or creation. The `immutable` field is treated as the main field, and `rule_source` is always derived from it. --- .../logic/actions/duplicate_rule.test.ts | 3 +++ .../logic/actions/duplicate_rule.ts | 7 +++++- .../normalization/rule_converters.ts | 22 ++++++++++++++++++- .../alerts_compatibility.ts | 6 +++++ .../execution_logic/esql.ts | 3 +++ .../perform_bulk_action_ess.ts | 21 ++++++++++++++++++ .../create_rules.ts | 3 +++ .../export_rules.ts | 3 +++ .../utils/rules/get_complex_rule_output.ts | 3 +++ .../utils/rules/get_simple_rule_output.ts | 3 +++ .../cypress/objects/rule.ts | 2 ++ 11 files changed, 74 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts index c0cb5f903c3ea..6684b7980ff6c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.test.ts @@ -103,6 +103,9 @@ describe('duplicateRule', () => { name: expect.anything(), // covered in a separate test params: { ...rule.params, + ruleSource: { + type: 'internal', + }, ruleId: expect.anything(), // covered in a separate test }, tags: rule.tags, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.ts index 57931dca00c1e..dd22dac3adc77 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/actions/duplicate_rule.ts @@ -12,6 +12,7 @@ import type { SanitizedRule } from '@kbn/alerting-plugin/common'; import { SERVER_APP_ID } from '../../../../../../common/constants'; import type { InternalRuleCreate, RuleParams } from '../../../rule_schema'; import { transformToActionFrequency } from '../../normalization/rule_actions'; +import { convertImmutableToRuleSource } from '../../normalization/rule_converters'; const DUPLICATE_TITLE = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.cloneRule.duplicateTitle', @@ -35,6 +36,9 @@ export const duplicateRule = async ({ rule }: DuplicateRuleParams): Promise { + if (immutable) { + return { + type: 'external', + isCustomized: false, + }; + } + + return { + type: 'internal', + }; +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/alerts_compatibility.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/alerts_compatibility.ts index 7bde0e6f230ab..f08893fe4ded4 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/alerts_compatibility.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/alerts/basic_license_essentials_tier/ess_specific_index_logic/alerts_compatibility.ts @@ -345,6 +345,9 @@ export default ({ getService }: FtrProviderContext) => { version: 1, exceptions_list: [], immutable: false, + rule_source: { + type: 'internal', + }, type: 'query', language: 'kuery', index: ['.siem-signals-*'], @@ -508,6 +511,9 @@ export default ({ getService }: FtrProviderContext) => { version: 1, exceptions_list: [], immutable: false, + rule_source: { + type: 'internal', + }, type: 'query', language: 'kuery', index: ['.alerts-security.alerts-default'], diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts index c629f5056ef3a..75ae7652df962 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts @@ -104,6 +104,9 @@ export default ({ getService }: FtrProviderContext) => { version: 1, exceptions_list: [], immutable: false, + rule_source: { + type: 'internal', + }, related_integrations: [], required_fields: [], setup: '', diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts index 846fd9f7d4204..c1bdae1ed9061 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts @@ -25,6 +25,7 @@ import { checkInvestigationFieldSoValue, createLegacyRuleAction, createRuleThroughAlertingEndpoint, + getCustomQueryRuleParams, getLegacyActionSO, getRuleSavedObjectWithLegacyInvestigationFields, getRuleSavedObjectWithLegacyInvestigationFieldsEmptyArray, @@ -276,6 +277,26 @@ export default ({ getService }: FtrProviderContext): void => { }); }); + it('should set rule_source to "internal" when duplicating a rule', async () => { + await createRule(supertest, log, getCustomQueryRuleParams()); + + const { body } = await securitySolutionApi + .performBulkAction({ + body: { + query: '', + action: BulkActionTypeEnum.duplicate, + duplicate: { include_exceptions: false, include_expired_exceptions: false }, + }, + query: {}, + }) + .expect(200); + + // Check that the duplicated rule is returned with the correct rule_source + expect(body.attributes.results.created[0].rule_source).to.eql({ + type: 'internal', + }); + }); + describe('edit action', () => { describe('index patterns actions', () => { it('should return error if index patterns action is applied to ES|QL rule', async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/basic_license_essentials_tier/create_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/basic_license_essentials_tier/create_rules.ts index 925961c5a3720..2f5ffd07e7d00 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/basic_license_essentials_tier/create_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_creation/basic_license_essentials_tier/create_rules.ts @@ -132,6 +132,9 @@ export default ({ getService }: FtrProviderContext) => { false_positives: [], from: 'now-6m', immutable: false, + rule_source: { + type: 'internal', + }, interval: '5m', rule_id: 'rule-1', language: 'kuery', diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts index 788eb36dddcca..df35d2c439757 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_import_export/trial_license_complete_tier/export_rules.ts @@ -396,6 +396,9 @@ function expectToMatchRuleSchema(obj: RuleResponse): void { rule_id: expect.any(String), enabled: expect.any(Boolean), immutable: false, + rule_source: { + type: 'internal', + }, updated_at: expect.any(String), updated_by: expect.any(String), created_at: expect.any(String), diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_complex_rule_output.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_complex_rule_output.ts index ff75d5a065d97..1e09c66e2c24c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_complex_rule_output.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_complex_rule_output.ts @@ -41,6 +41,9 @@ export const getComplexRuleOutput = ( enabled, index: ['auditbeat-*', 'filebeat-*'], immutable: false, + rule_source: { + type: 'internal', + }, interval: '5m', output_index: '', meta: { diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output.ts index 0a9eec4906a14..fd985dfbbef1d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output.ts @@ -23,6 +23,9 @@ export const getMockSharedResponseSchema = ( false_positives: [], from: 'now-6m', immutable: false, + rule_source: { + type: 'internal', + }, interval: '5m', rule_id: ruleId, output_index: '', diff --git a/x-pack/test/security_solution_cypress/cypress/objects/rule.ts b/x-pack/test/security_solution_cypress/cypress/objects/rule.ts index fcbaaca3d1dde..dd0e63379054e 100644 --- a/x-pack/test/security_solution_cypress/cypress/objects/rule.ts +++ b/x-pack/test/security_solution_cypress/cypress/objects/rule.ts @@ -551,6 +551,7 @@ export const expectedExportedRule = (ruleResponse: Cypress.Response Date: Wed, 29 May 2024 12:19:49 +0300 Subject: [PATCH 04/95] fix: [Obs AI Ops > Anomaly Detection][KEYBOARD]: Anomalies table has a number of tooltips that cannot receive keyboard focus (#184198) Closes: https://github.com/elastic/observability-dev/issues/3397 ## Description The Obs Anomaly Detection Single Metric Viewer has an Anomalies table with at least three tooltips that cannot be reached by keyboard focus. Screenshot attached below. ### Steps to recreate 1. Open the [Obs Anomaly Detection](https://issue-serverless-alpbx-pr180406-c06b1b.kb.eu-west-1.aws.qa.elastic.cloud/app/ml/jobs) view 2. Create a new anomaly detection job 3. From the Anomaly Detection Jobs table, click the Single Metric Viewer icon 4. Tab through the page, to the Anomalies table underneath the chart 5. Keep tabbing through the table 6. Verify the tooltips in the Severity, Actual, and Typical columns do not become visible --- .../anomalies_table_columns.js | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js index 1f9eadff694f3..383007be5f185 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiButtonIcon, EuiLink, EuiScreenReaderOnly, EuiToolTip, EuiIcon } from '@elastic/eui'; +import { EuiButtonIcon, EuiLink, EuiScreenReaderOnly, EuiIconTip } from '@elastic/eui'; import React from 'react'; import { get } from 'lodash'; @@ -116,19 +116,22 @@ export function getColumns( field: 'severity', 'data-test-subj': 'mlAnomaliesListColumnSeverity', name: ( - + {i18n.translate('xpack.ml.anomaliesTable.severityColumnName', { + defaultMessage: 'Severity', })} - > - - {i18n.translate('xpack.ml.anomaliesTable.severityColumnName', { - defaultMessage: 'Severity', +   + - - + /> + ), render: (score, item) => ( @@ -196,18 +199,21 @@ export function getColumns( field: 'actualSort', 'data-test-subj': 'mlAnomaliesListColumnActual', name: ( - + {i18n.translate('xpack.ml.anomaliesTable.actualSortColumnName', { + defaultMessage: 'Actual', })} - > - - {i18n.translate('xpack.ml.anomaliesTable.actualSortColumnName', { - defaultMessage: 'Actual', +   + - - + /> + ), render: (actual, item) => { const fieldFormat = mlFieldFormatService.getFieldFormat( @@ -226,18 +232,21 @@ export function getColumns( field: 'typicalSort', 'data-test-subj': 'mlAnomaliesListColumnTypical', name: ( - + {i18n.translate('xpack.ml.anomaliesTable.typicalSortColumnName', { + defaultMessage: 'Typical', })} - > - - {i18n.translate('xpack.ml.anomaliesTable.typicalSortColumnName', { - defaultMessage: 'Typical', +   + - - + /> + ), render: (typical, item) => { const fieldFormat = mlFieldFormatService.getFieldFormat( From 690690ea21689ce34cdd6b85662e956096caa2d5 Mon Sep 17 00:00:00 2001 From: "Eyo O. Eyo" <7893459+eokoneyo@users.noreply.github.com> Date: Wed, 29 May 2024 11:46:23 +0200 Subject: [PATCH 05/95] Simplify workflow for dashboard copy creation in both view and edit interaction modes (#180938) ## Summary Closes https://github.com/elastic/kibana/issues/161047 - Removes the `save as` top nav menu button - Also renames nav menu item `clone` to `duplicate` and make it available in edit mode. - The save dashboard modal no longer displays and open to save the dashboard in context as new, given that we've chosen to explicitly create a copy of the dashboard in context when either of the the `duplicate` or `saveas` menu option is selected. - includes bug fix for an issue where clicking the dashboard modal scrolled the user to the content bottom, see https://github.com/elastic/kibana/pull/180938#issuecomment-2117586572 ## Before ### View mode Screenshot 2024-04-16 at 15 59 10 ### Edit mode Screenshot 2024-04-16 at 15 59 00 ## After #### Managed Dashboard https://github.com/elastic/kibana/assets/7893459/5072a501-8d16-4f25-9575-6f11fed6e580 #### View mode https://github.com/elastic/kibana/assets/7893459/610d0952-97f0-46b8-a0ea-1546a799d387 #### Edit mode https://github.com/elastic/kibana/assets/7893459/4f596c07-7bd1-4c5a-9131-0c78731cb113 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../dashboard_app/_dashboard_app_strings.ts | 14 +- .../top_nav/use_dashboard_menu_items.tsx | 89 ++-- .../component/settings/settings_flyout.tsx | 6 +- .../embeddable/api/index.ts | 2 +- .../api/lib/extract_title_and_count.test.ts | 18 +- .../api/lib/extract_title_and_count.ts | 2 +- .../__snapshots__/save_modal.test.js.snap | 53 ++- .../embeddable/api/overlays/save_modal.tsx | 186 ++++----- .../embeddable/api/run_save_functions.tsx | 382 +++++++++--------- .../embeddable/dashboard_container.tsx | 6 +- .../saved_object_save_modal.test.tsx.snap | 24 +- .../save_modal/saved_object_save_modal.tsx | 12 +- .../show_saved_object_save_modal.tsx | 63 +-- src/plugins/saved_objects/tsconfig.json | 1 - test/accessibility/apps/dashboard.ts | 4 +- .../dashboard/group1/embeddable_rendering.ts | 1 + .../dashboard/group2/dashboard_filter_bar.ts | 4 +- .../apps/dashboard/group3/bwc_shared_urls.ts | 1 + .../apps/dashboard/group3/dashboard_state.ts | 2 +- .../apps/dashboard/group4/dashboard_clone.ts | 2 +- .../dashboard/group4/dashboard_listing.ts | 5 +- .../apps/dashboard/group4/dashboard_save.ts | 196 +++++---- .../apps/dashboard/group4/dashboard_time.ts | 10 +- .../apps/dashboard/group5/legacy_urls.ts | 5 +- .../apps/dashboard/group6/view_edit.ts | 35 +- .../common/control_group_apply_button.ts | 5 +- .../controls/common/range_slider.ts | 5 +- .../controls/common/replace_controls.ts | 5 +- .../controls/common/time_slider.ts | 5 +- .../controls/options_list/index.ts | 1 + .../links/links_create_edit.ts | 5 +- .../embeddable/_saved_search_embeddable.ts | 3 +- .../functional/page_objects/dashboard_page.ts | 110 +++-- .../journeys_e2e/dashboard_listing_page.ts | 4 +- .../translations/translations/fr-FR.json | 8 +- .../translations/translations/ja-JP.json | 8 +- .../translations/translations/zh-CN.json | 8 +- .../apps/group1/dashboard_links.ts | 5 +- .../apps/dashboard/group1/created_by.ts | 1 + .../drilldowns/explore_data_panel_action.ts | 10 +- .../apps/discover/saved_search_embeddable.ts | 1 + .../group4/show_underlying_data_dashboard.ts | 2 + .../apps/managed_content/managed_content.ts | 2 +- ...index_data_visualizer_grid_in_dashboard.ts | 2 +- .../functional/tests/dashboard_integration.ts | 4 +- .../embeddable/_saved_search_embeddable.ts | 3 +- 46 files changed, 743 insertions(+), 577 deletions(-) diff --git a/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts b/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts index a513d725f1f31..c58fa0cf828df 100644 --- a/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts +++ b/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts @@ -189,11 +189,11 @@ export const topNavStrings = { defaultMessage: 'Quick save your dashboard without any prompts', }), }, - saveAs: { - label: i18n.translate('dashboard.topNave.saveAsButtonAriaLabel', { + editModeInteractiveSave: { + label: i18n.translate('dashboard.topNave.editModeInteractiveSaveButtonAriaLabel', { defaultMessage: 'save as', }), - description: i18n.translate('dashboard.topNave.saveAsConfigDescription', { + description: i18n.translate('dashboard.topNave.editModeInteractiveSaveConfigDescription', { defaultMessage: 'Save as a new dashboard', }), }, @@ -229,11 +229,11 @@ export const topNavStrings = { defaultMessage: 'Open dashboard settings', }), }, - clone: { - label: i18n.translate('dashboard.topNave.cloneButtonAriaLabel', { - defaultMessage: 'clone', + viewModeInteractiveSave: { + label: i18n.translate('dashboard.topNave.viewModeInteractiveSaveButtonAriaLabel', { + defaultMessage: 'duplicate', }), - description: i18n.translate('dashboard.topNave.cloneConfigDescription', { + description: i18n.translate('dashboard.topNave.viewModeInteractiveSaveConfigDescription', { defaultMessage: 'Create a copy of your dashboard', }), }, diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx index 9c5aedb76c147..85ebe38e8eecd 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx @@ -104,23 +104,11 @@ export const useDashboardMenuItems = ({ }, [dashboard]); /** - * Show the dashboard's save modal + * initiate interactive dashboard copy action */ - const saveDashboardAs = useCallback(() => { - dashboard.runSaveAs().then((result) => maybeRedirect(result)); - }, [maybeRedirect, dashboard]); - - /** - * Clone the dashboard - */ - const clone = useCallback(() => { - setIsSaveInProgress(true); - - dashboard.runClone().then((result) => { - setIsSaveInProgress(false); - maybeRedirect(result); - }); - }, [maybeRedirect, dashboard]); + const dashboardInteractiveSave = useCallback(() => { + dashboard.runInteractiveSave(viewMode).then((result) => maybeRedirect(result)); + }, [maybeRedirect, dashboard, viewMode]); /** * Show the dashboard's "Confirm reset changes" modal. If confirmed: @@ -197,15 +185,22 @@ export const useDashboardMenuItems = ({ run: () => quickSaveDashboard(), } as TopNavMenuData, - saveAs: { - description: topNavStrings.saveAs.description, + interactiveSave: { disableButton: disableTopNav, - id: 'save', emphasize: !Boolean(lastSavedId), - testId: 'dashboardSaveMenuItem', - iconType: Boolean(lastSavedId) ? undefined : 'save', - label: Boolean(lastSavedId) ? topNavStrings.saveAs.label : topNavStrings.quickSave.label, - run: () => saveDashboardAs(), + id: 'interactive-save', + testId: 'dashboardInteractiveSaveMenuItem', + run: dashboardInteractiveSave, + label: + viewMode === ViewMode.VIEW + ? topNavStrings.viewModeInteractiveSave.label + : Boolean(lastSavedId) + ? topNavStrings.editModeInteractiveSave.label + : topNavStrings.quickSave.label, + description: + viewMode === ViewMode.VIEW + ? topNavStrings.viewModeInteractiveSave.description + : topNavStrings.editModeInteractiveSave.description, } as TopNavMenuData, switchToViewMode: { @@ -230,31 +225,23 @@ export const useDashboardMenuItems = ({ testId: 'dashboardSettingsButton', disableButton: disableTopNav, run: () => dashboard.showSettings(), - } as TopNavMenuData, - - clone: { - ...topNavStrings.clone, - id: 'clone', - testId: 'dashboardClone', - disableButton: disableTopNav, - run: () => clone(), - } as TopNavMenuData, + }, }; }, [ - quickSaveDashboard, + disableTopNav, isSaveInProgress, hasRunMigrations, hasUnsavedChanges, - dashboardBackup, - saveDashboardAs, - setIsLabsShown, - disableTopNav, - resetChanges, - isLabsShown, lastSavedId, + dashboardInteractiveSave, + viewMode, showShare, dashboard, - clone, + setIsLabsShown, + isLabsShown, + dashboardBackup, + quickSaveDashboard, + resetChanges, ]); const resetChangesMenuItem = useMemo(() => { @@ -276,7 +263,7 @@ export const useDashboardMenuItems = ({ const viewModeTopNavConfig = useMemo(() => { const labsMenuItem = isLabsEnabled ? [menuItems.labs] : []; const shareMenuItem = share ? [menuItems.share] : []; - const cloneMenuItem = showWriteControls ? [menuItems.clone] : []; + const duplicateMenuItem = showWriteControls ? [menuItems.interactiveSave] : []; const editMenuItem = showWriteControls && !managed ? [menuItems.edit] : []; const mayberesetChangesMenuItem = showResetChange ? [resetChangesMenuItem] : []; @@ -284,7 +271,7 @@ export const useDashboardMenuItems = ({ ...labsMenuItem, menuItems.fullScreen, ...shareMenuItem, - ...cloneMenuItem, + ...duplicateMenuItem, ...mayberesetChangesMenuItem, ...editMenuItem, ]; @@ -304,7 +291,7 @@ export const useDashboardMenuItems = ({ const editModeItems: TopNavMenuData[] = []; if (lastSavedId) { - editModeItems.push(menuItems.saveAs, menuItems.switchToViewMode); + editModeItems.push(menuItems.interactiveSave, menuItems.switchToViewMode); if (showResetChange) { editModeItems.push(resetChangesMenuItem); @@ -312,22 +299,10 @@ export const useDashboardMenuItems = ({ editModeItems.push(menuItems.quickSave); } else { - editModeItems.push(menuItems.switchToViewMode, menuItems.saveAs); + editModeItems.push(menuItems.switchToViewMode, menuItems.interactiveSave); } return [...labsMenuItem, menuItems.settings, ...shareMenuItem, ...editModeItems]; - }, [ - isLabsEnabled, - menuItems.labs, - menuItems.share, - menuItems.settings, - menuItems.saveAs, - menuItems.switchToViewMode, - menuItems.quickSave, - share, - lastSavedId, - showResetChange, - resetChangesMenuItem, - ]); + }, [isLabsEnabled, menuItems, share, lastSavedId, showResetChange, resetChangesMenuItem]); return { viewModeTopNavConfig, editModeTopNavConfig }; }; diff --git a/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx b/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx index 51fd1e0e1ed9f..2a6a25a7f0385 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx @@ -323,7 +323,11 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { - + { ]); }); - it('defaults to the count to 1 and returns the original title when the provided title does not contain a valid count', () => { - expect(extractTitleAndCount('Test dashboard')).toEqual(['Test dashboard', 1]); - expect(extractTitleAndCount('Test dashboard 2')).toEqual(['Test dashboard 2', 1]); - expect(extractTitleAndCount('Test dashboard (-1)')).toEqual(['Test dashboard (-1)', 1]); - expect(extractTitleAndCount('Test dashboard (0)')).toEqual(['Test dashboard (0)', 1]); - expect(extractTitleAndCount('Test dashboard (3.0)')).toEqual(['Test dashboard (3.0)', 1]); - expect(extractTitleAndCount('Test dashboard (8.4)')).toEqual(['Test dashboard (8.4)', 1]); - expect(extractTitleAndCount('Test dashboard (foo3.0)')).toEqual(['Test dashboard (foo3.0)', 1]); - expect(extractTitleAndCount('Test dashboard (bar7)')).toEqual(['Test dashboard (bar7)', 1]); + it('defaults to the count to 0 and returns the original title when the provided title does not contain a valid count', () => { + expect(extractTitleAndCount('Test dashboard')).toEqual(['Test dashboard', 0]); + expect(extractTitleAndCount('Test dashboard 2')).toEqual(['Test dashboard 2', 0]); + expect(extractTitleAndCount('Test dashboard (-1)')).toEqual(['Test dashboard (-1)', 0]); + expect(extractTitleAndCount('Test dashboard (0)')).toEqual(['Test dashboard (0)', 0]); + expect(extractTitleAndCount('Test dashboard (3.0)')).toEqual(['Test dashboard (3.0)', 0]); + expect(extractTitleAndCount('Test dashboard (8.4)')).toEqual(['Test dashboard (8.4)', 0]); + expect(extractTitleAndCount('Test dashboard (foo3.0)')).toEqual(['Test dashboard (foo3.0)', 0]); + expect(extractTitleAndCount('Test dashboard (bar7)')).toEqual(['Test dashboard (bar7)', 0]); }); }); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/lib/extract_title_and_count.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/api/lib/extract_title_and_count.ts index 7100fab8af96d..6f1fac112c9c3 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/lib/extract_title_and_count.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/lib/extract_title_and_count.ts @@ -15,5 +15,5 @@ export const extractTitleAndCount = (title: string): [string, number] => { return [baseTitle, Number(count)]; } } - return [title, 1]; + return [title, 0]; }; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/__snapshots__/save_modal.test.js.snap b/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/__snapshots__/save_modal.test.js.snap index 05a8cc2964003..8b551d8afaf21 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/__snapshots__/save_modal.test.js.snap +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/__snapshots__/save_modal.test.js.snap @@ -14,27 +14,44 @@ exports[`renders DashboardSaveModal 1`] = ` display="row" hasChildLabel={true} hasEmptyLabelSpace={false} - helpText={ - - } labelType="label" > - + + + } + onChange={[Function]} /> - } - onChange={[Function]} - /> + + + + } + position="top" + /> + + } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx index 737b8eac640f4..456328f694215 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx @@ -7,20 +7,20 @@ */ import { i18n } from '@kbn/i18n'; -import React, { Fragment } from 'react'; +import React, { Fragment, useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiFormRow, EuiSwitch } from '@elastic/eui'; +import { EuiFormRow, EuiSwitch, EuiIconTip, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { SavedObjectSaveModal } from '@kbn/saved-objects-plugin/public'; import type { DashboardSaveOptions } from '../../../types'; import { pluginServices } from '../../../../services/plugin_services'; /** - * TODO: Portable Dashboard followup, convert this to a functional component & use redux for the state. + * TODO: Portable Dashboard followup, use redux for the state. * https://github.com/elastic/kibana/issues/147490 */ -interface Props { +interface DashboardSaveModalProps { onSave: ({ newTitle, newDescription, @@ -36,65 +36,57 @@ interface Props { tags?: string[]; timeRestore: boolean; showCopyOnSave: boolean; + showStoreTimeOnSave?: boolean; + customModalTitle?: string; } -interface State { - tags: string[]; - timeRestore: boolean; -} - -export class DashboardSaveModal extends React.Component { - state: State = { - timeRestore: this.props.timeRestore, - tags: this.props.tags ?? [], - }; - - constructor(props: Props) { - super(props); - } +type SaveDashboardHandler = (args: { + newTitle: string; + newDescription: string; + newCopyOnSave: boolean; + isTitleDuplicateConfirmed: boolean; + onTitleDuplicate: () => void; +}) => ReturnType; - saveDashboard = ({ - newTitle, - newDescription, - newCopyOnSave, - isTitleDuplicateConfirmed, - onTitleDuplicate, - }: { - newTitle: string; - newDescription: string; - newCopyOnSave: boolean; - isTitleDuplicateConfirmed: boolean; - onTitleDuplicate: () => void; - }) => { - this.props.onSave({ - newTitle, - newDescription, - newCopyOnSave, - newTimeRestore: this.state.timeRestore, - isTitleDuplicateConfirmed, - onTitleDuplicate, - newTags: this.state.tags, - }); - }; +export const DashboardSaveModal: React.FC = ({ + customModalTitle, + description, + onClose, + onSave, + showCopyOnSave, + showStoreTimeOnSave = true, + tags, + title, + timeRestore, +}) => { + const [selectedTags, setSelectedTags] = React.useState(tags ?? []); + const [persistSelectedTimeInterval, setPersistSelectedTimeInterval] = React.useState(timeRestore); - onTimeRestoreChange = (event: any) => { - this.setState({ - timeRestore: event.target.checked, - }); - }; + const saveDashboard = React.useCallback( + ({ newTitle, newDescription, newCopyOnSave, isTitleDuplicateConfirmed, onTitleDuplicate }) => { + onSave({ + newTitle, + newDescription, + newCopyOnSave, + newTimeRestore: persistSelectedTimeInterval, + isTitleDuplicateConfirmed, + onTitleDuplicate, + newTags: selectedTags, + }); + }, + [onSave, persistSelectedTimeInterval, selectedTags] + ); - renderDashboardSaveOptions() { + const renderDashboardSaveOptions = useCallback(() => { const { savedObjectsTagging: { components }, } = pluginServices.getServices(); const tagSelector = components ? ( { - this.setState({ - tags, - }); + initialSelection={selectedTags} + onTagsSelected={(selectedTagIds) => { + setSelectedTags(selectedTagIds); }} markOptional /> @@ -103,46 +95,56 @@ export class DashboardSaveModal extends React.Component { return ( {tagSelector} - - - } - > - - } - /> - + {showStoreTimeOnSave ? ( + + + + { + setPersistSelectedTimeInterval(event.target.checked); + }} + label={ + + } + /> + + + + } + position="top" + /> + + + + ) : null} ); - } + }, [persistSelectedTimeInterval, selectedTags, showStoreTimeOnSave]); - render() { - return ( - - ); - } -} + return ( + + ); +}; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx index 13e2d492fb568..c1ef52ec72e2c 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx @@ -9,12 +9,17 @@ import { Reference } from '@kbn/content-management-utils'; import type { PersistableControlGroupInput } from '@kbn/controls-plugin/common'; import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; -import { EmbeddableInput, isReferenceOrValueEmbeddable } from '@kbn/embeddable-plugin/public'; +import { + EmbeddableInput, + isReferenceOrValueEmbeddable, + ViewMode, +} from '@kbn/embeddable-plugin/public'; import { apiHasSerializableState, SerializedPanelState } from '@kbn/presentation-containers'; import { showSaveModal } from '@kbn/saved-objects-plugin/public'; import { cloneDeep } from 'lodash'; import React from 'react'; import { batch } from 'react-redux'; +import { i18n } from '@kbn/i18n'; import { DashboardContainerInput, DashboardPanelMap } from '../../../../common'; import { prefixReferencesFromPanel } from '../../../../common/dashboard_container/persistable_state/dashboard_container_references'; import { DASHBOARD_CONTENT_ID, SAVED_OBJECT_POST_TIME } from '../../../dashboard_constants'; @@ -63,124 +68,6 @@ const serializeAllPanelState = async ( return { panels, references }; }; -export function runSaveAs(this: DashboardContainer) { - const { - data: { - query: { - timefilter: { timefilter }, - }, - }, - savedObjectsTagging: { hasApi: hasSavedObjectsTagging }, - dashboardContentManagement: { checkForDuplicateDashboardTitle, saveDashboardState }, - } = pluginServices.getServices(); - - const { - explicitInput: currentState, - componentState: { lastSavedId, managed }, - } = this.getState(); - - return new Promise((resolve) => { - if (managed) resolve(undefined); - const onSave = async ({ - newTags, - newTitle, - newDescription, - newCopyOnSave, - newTimeRestore, - onTitleDuplicate, - isTitleDuplicateConfirmed, - }: DashboardSaveOptions): Promise => { - const saveOptions = { - confirmOverwrite: false, - isTitleDuplicateConfirmed, - onTitleDuplicate, - saveAsCopy: newCopyOnSave, - }; - const stateFromSaveModal: DashboardStateFromSaveModal = { - title: newTitle, - tags: [] as string[], - description: newDescription, - timeRestore: newTimeRestore, - timeRange: newTimeRestore ? timefilter.getTime() : undefined, - refreshInterval: newTimeRestore ? timefilter.getRefreshInterval() : undefined, - }; - if (hasSavedObjectsTagging && newTags) { - // remove `hasSavedObjectsTagging` once the savedObjectsTagging service is optional - stateFromSaveModal.tags = newTags; - } - if ( - !(await checkForDuplicateDashboardTitle({ - title: newTitle, - onTitleDuplicate, - lastSavedTitle: currentState.title, - copyOnSave: newCopyOnSave, - isTitleDuplicateConfirmed, - })) - ) { - // do not save if title is duplicate and is unconfirmed - return {}; - } - const { panels: nextPanels, references } = await serializeAllPanelState(this); - const dashboardStateToSave: DashboardContainerInput = { - ...currentState, - panels: nextPanels, - ...stateFromSaveModal, - }; - let stateToSave: SavedDashboardInput = dashboardStateToSave; - let persistableControlGroupInput: PersistableControlGroupInput | undefined; - if (this.controlGroup) { - persistableControlGroupInput = this.controlGroup.getPersistableInput(); - stateToSave = { ...stateToSave, controlGroupInput: persistableControlGroupInput }; - } - const beforeAddTime = window.performance.now(); - - const saveResult = await saveDashboardState({ - panelReferences: references, - currentState: stateToSave, - saveOptions, - lastSavedId, - }); - const addDuration = window.performance.now() - beforeAddTime; - reportPerformanceMetricEvent(pluginServices.getServices().analytics, { - eventName: SAVED_OBJECT_POST_TIME, - duration: addDuration, - meta: { - saved_object_type: DASHBOARD_CONTENT_ID, - }, - }); - - stateFromSaveModal.lastSavedId = saveResult.id; - if (saveResult.id) { - batch(() => { - this.dispatch.setStateFromSaveModal(stateFromSaveModal); - this.dispatch.setLastSavedInput(dashboardStateToSave); - if (this.controlGroup && persistableControlGroupInput) { - this.controlGroup.setSavedState(persistableControlGroupInput); - } - }); - } - this.savedObjectReferences = saveResult.references ?? []; - this.saveNotification$.next(); - resolve(saveResult); - return saveResult; - }; - - const dashboardSaveModal = ( - resolve(undefined)} - timeRestore={currentState.timeRestore} - description={currentState.description ?? ''} - showCopyOnSave={lastSavedId ? true : false} - onSave={onSave} - /> - ); - this.clearOverlays(); - showSaveModal(dashboardSaveModal); - }); -} - /** * Save the current state of this dashboard to a saved object without showing any save modal. */ @@ -222,86 +109,203 @@ export async function runQuickSave(this: DashboardContainer) { return saveResult; } -export async function runClone(this: DashboardContainer) { +/** + * @description exclusively for user directed dashboard save actions, also + * accounts for scenarios of cloning elastic managed dashboard into user managed dashboards + */ +export async function runInteractiveSave(this: DashboardContainer, interactionMode: ViewMode) { const { - dashboardContentManagement: { saveDashboardState, checkForDuplicateDashboardTitle }, + data: { + query: { + timefilter: { timefilter }, + }, + }, + savedObjectsTagging: { hasApi: hasSavedObjectsTagging }, + dashboardContentManagement: { checkForDuplicateDashboardTitle, saveDashboardState }, } = pluginServices.getServices(); - const { explicitInput: currentState } = this.getState(); + const { + explicitInput: currentState, + componentState: { lastSavedId, managed }, + } = this.getState(); + + return new Promise((resolve, reject) => { + if (interactionMode === ViewMode.EDIT && managed) { + resolve(undefined); + } - return new Promise(async (resolve, reject) => { - try { - const [baseTitle, baseCount] = extractTitleAndCount(currentState.title); - let copyCount = baseCount; - let newTitle = `${baseTitle} (${copyCount})`; - while ( - !(await checkForDuplicateDashboardTitle({ + const onSaveAttempt = async ({ + newTags, + newTitle, + newDescription, + newCopyOnSave, + newTimeRestore, + onTitleDuplicate, + isTitleDuplicateConfirmed, + }: DashboardSaveOptions): Promise => { + const saveOptions = { + confirmOverwrite: false, + isTitleDuplicateConfirmed, + onTitleDuplicate, + saveAsCopy: lastSavedId ? true : newCopyOnSave, + }; + + try { + if ( + !(await checkForDuplicateDashboardTitle({ + title: newTitle, + onTitleDuplicate, + lastSavedTitle: currentState.title, + copyOnSave: saveOptions.saveAsCopy, + isTitleDuplicateConfirmed, + })) + ) { + return {}; + } + + const stateFromSaveModal: DashboardStateFromSaveModal = { title: newTitle, - lastSavedTitle: currentState.title, - copyOnSave: true, - isTitleDuplicateConfirmed: false, - })) - ) { - copyCount++; - newTitle = `${baseTitle} (${copyCount})`; - } + tags: [] as string[], + description: newDescription, + timeRestore: newTimeRestore, + timeRange: newTimeRestore ? timefilter.getTime() : undefined, + refreshInterval: newTimeRestore ? timefilter.getRefreshInterval() : undefined, + }; + + if (hasSavedObjectsTagging && newTags) { + // remove `hasSavedObjectsTagging` once the savedObjectsTagging service is optional + stateFromSaveModal.tags = newTags; + } - let stateToSave: DashboardContainerInput & { - controlGroupInput?: PersistableControlGroupInput; - } = currentState; - if (this.controlGroup) { - stateToSave = { - ...stateToSave, - controlGroupInput: this.controlGroup.getPersistableInput(), + let dashboardStateToSave: DashboardContainerInput & { + controlGroupInput?: PersistableControlGroupInput; + } = { + ...currentState, + ...stateFromSaveModal, }; - } - const isManaged = this.getState().componentState.managed; - const newPanels = await (async () => { - if (!isManaged) return currentState.panels; - - // this is a managed dashboard - unlink all by reference embeddables on clone - const unlinkedPanels: DashboardPanelMap = {}; - for (const [panelId, panel] of Object.entries(currentState.panels)) { - const child = this.getChild(panelId); - if ( - child && - isReferenceOrValueEmbeddable(child) && - child.inputIsRefType(child.getInput() as EmbeddableInput) - ) { - const valueTypeInput = await child.getInputAsValueType(); - unlinkedPanels[panelId] = { - ...panel, - explicitInput: valueTypeInput, - }; - continue; - } - unlinkedPanels[panelId] = panel; + let persistableControlGroupInput: PersistableControlGroupInput | undefined; + if (this.controlGroup) { + persistableControlGroupInput = this.controlGroup.getPersistableInput(); + dashboardStateToSave = { + ...dashboardStateToSave, + controlGroupInput: persistableControlGroupInput, + }; } - return unlinkedPanels; - })(); - - const saveResult = await saveDashboardState({ - saveOptions: { - saveAsCopy: true, - }, - currentState: { - ...stateToSave, - panels: newPanels, - title: newTitle, - }, - }); - this.savedObjectReferences = saveResult.references ?? []; - resolve(saveResult); - return saveResult.id - ? { - id: saveResult.id, + + const { panels: nextPanels, references } = await serializeAllPanelState(this); + + const newPanels = await (async () => { + if (!managed) return nextPanels; + + // this is a managed dashboard - unlink all by reference embeddables on clone + const unlinkedPanels: DashboardPanelMap = {}; + for (const [panelId, panel] of Object.entries(nextPanels)) { + const child = this.getChild(panelId); + if ( + child && + isReferenceOrValueEmbeddable(child) && + child.inputIsRefType(child.getInput() as EmbeddableInput) + ) { + const valueTypeInput = await child.getInputAsValueType(); + unlinkedPanels[panelId] = { + ...panel, + explicitInput: valueTypeInput, + }; + continue; + } + unlinkedPanels[panelId] = panel; } - : { - error: saveResult.error, - }; - } catch (error) { - reject(error); + return unlinkedPanels; + })(); + + const beforeAddTime = window.performance.now(); + + const saveResult = await saveDashboardState({ + panelReferences: references, + saveOptions, + currentState: { + ...dashboardStateToSave, + panels: newPanels, + title: newTitle, + }, + lastSavedId, + }); + + const addDuration = window.performance.now() - beforeAddTime; + + reportPerformanceMetricEvent(pluginServices.getServices().analytics, { + eventName: SAVED_OBJECT_POST_TIME, + duration: addDuration, + meta: { + saved_object_type: DASHBOARD_CONTENT_ID, + }, + }); + + stateFromSaveModal.lastSavedId = saveResult.id; + + if (saveResult.id) { + batch(() => { + this.dispatch.setStateFromSaveModal(stateFromSaveModal); + this.dispatch.setLastSavedInput(dashboardStateToSave); + if (this.controlGroup && persistableControlGroupInput) { + this.controlGroup.setSavedState(persistableControlGroupInput); + } + }); + } + + this.savedObjectReferences = saveResult.references ?? []; + this.saveNotification$.next(); + + resolve(saveResult); + return saveResult; + } catch (error) { + reject(error); + return error; + } + }; + + let customModalTitle; + let newTitle = currentState.title; + + if (lastSavedId) { + const [baseTitle, baseCount] = extractTitleAndCount(currentState.title); + newTitle = `${baseTitle} (${baseCount + 1})`; + + switch (interactionMode) { + case ViewMode.EDIT: { + customModalTitle = i18n.translate('dashboard.topNav.editModeInteractiveSave.modalTitle', { + defaultMessage: 'Save as new dashboard', + }); + break; + } + case ViewMode.VIEW: { + customModalTitle = i18n.translate('dashboard.topNav.viewModeInteractiveSave.modalTitle', { + defaultMessage: 'Duplicate dashboard', + }); + break; + } + default: { + customModalTitle = undefined; + } + } } + + const dashboardDuplicateModal = ( + resolve(undefined)} + timeRestore={currentState.timeRestore} + showStoreTimeOnSave={!lastSavedId} + description={currentState.description ?? ''} + showCopyOnSave={false} + onSave={onSaveAttempt} + customModalTitle={customModalTitle} + /> + ); + + this.clearOverlays(); + showSaveModal(dashboardDuplicateModal); }); } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 258a80ed834eb..8d9c41be0094b 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -82,9 +82,8 @@ import { import { addFromLibrary, addOrUpdateEmbeddable, - runClone, runQuickSave, - runSaveAs, + runInteractiveSave, showSettings, } from './api'; import { duplicateDashboardPanel } from './api/duplicate_dashboard_panel'; @@ -455,8 +454,7 @@ export class DashboardContainer // Dashboard API // ------------------------------------------------------------------------------------------------------ - public runClone = runClone; - public runSaveAs = runSaveAs; + public runInteractiveSave = runInteractiveSave; public runQuickSave = runQuickSave; public showSettings = showSettings; diff --git a/src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap b/src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap index c32c8d6d40331..6c7c5fef20daf 100644 --- a/src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap +++ b/src/plugins/saved_objects/public/save_modal/__snapshots__/saved_object_save_modal.test.tsx.snap @@ -43,9 +43,13 @@ exports[`SavedObjectSaveModal should render matching snapshot 1`] = ` labelType="label" > { private warning = React.createRef(); private formId = generateId('form'); + private savedObjectTitleInputRef = React.createRef(); public readonly state = { title: this.props.title, @@ -89,6 +90,13 @@ export class SavedObjectSaveModal extends React.Component hasAttemptedSubmit: false, }; + public componentDidMount() { + setTimeout(() => { + // defer so input focus ref value has been populated + this.savedObjectTitleInputRef.current?.focus(); + }, 0); + } + public render() { const { isTitleDuplicateConfirmed, hasTitleDuplicate, title, hasAttemptedSubmit } = this.state; const duplicateWarningId = generateId(); @@ -111,7 +119,7 @@ export class SavedObjectSaveModal extends React.Component > /> } color="warning" - data-test-subj="titleDupicateWarnMsg" + data-test-subj="titleDuplicateWarnMsg" id={duplicateWarningId} >

diff --git a/src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx b/src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx index 5d04e5b10ed85..9013cec29997a 100644 --- a/src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx +++ b/src/plugins/saved_objects/public/save_modal/show_saved_object_save_modal.tsx @@ -7,9 +7,8 @@ */ import React, { FC, PropsWithChildren } from 'react'; -import ReactDOM from 'react-dom'; -import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { getAnalytics, getI18n, getTheme } from '../kibana_services'; /** @@ -34,34 +33,42 @@ export function showSaveModal( saveModal: React.ReactElement, Wrapper?: FC> ) { - const container = document.createElement('div'); - const closeModal = () => { - ReactDOM.unmountComponentAtNode(container); - document.body.removeChild(container); - saveModal.props.onClose?.(); - }; + // initialize variable that will hold reference for unmount + // eslint-disable-next-line prefer-const + let unmount: ReturnType>; - const onSave = saveModal.props.onSave; + const mount = toMountPoint( + React.createElement(function createSavedObjectModal() { + const closeModal = () => { + unmount(); + // revert control back to caller after cleaning up modal + setTimeout(() => { + saveModal.props.onClose?.(); + }, 0); + }; - const onSaveConfirmed: MinimalSaveModalProps['onSave'] = async (...args) => { - const response = await onSave(...args); - // close modal if we either hit an error or the saved object got an id - if (Boolean(isSuccess(response) ? response.id : response.error)) { - closeModal(); - } - return response; - }; - document.body.appendChild(container); - const element = React.cloneElement(saveModal, { - onSave: onSaveConfirmed, - onClose: closeModal, - }); + const onSave = saveModal.props.onSave; - const I18nContext = getI18n().Context; - ReactDOM.render( - - {Wrapper ? {element} : element} - , - container + const onSaveConfirmed: MinimalSaveModalProps['onSave'] = async (...args) => { + const response = await onSave(...args); + // close modal if we either hit an error or the saved object got an id + if (Boolean(isSuccess(response) ? response.id : response.error)) { + closeModal(); + } + return response; + }; + + const augmentedElement = React.cloneElement(saveModal, { + onSave: onSaveConfirmed, + onClose: closeModal, + }); + + return React.createElement(Wrapper ?? React.Fragment, { + children: augmentedElement, + }); + }), + { analytics: getAnalytics(), theme: getTheme(), i18n: getI18n() } ); + + unmount = mount(document.createElement('div')); } diff --git a/src/plugins/saved_objects/tsconfig.json b/src/plugins/saved_objects/tsconfig.json index 39557cef8c5b1..4119011216816 100644 --- a/src/plugins/saved_objects/tsconfig.json +++ b/src/plugins/saved_objects/tsconfig.json @@ -13,7 +13,6 @@ "@kbn/i18n-react", "@kbn/utility-types", "@kbn/ui-theme", - "@kbn/react-kibana-context-render", "@kbn/react-kibana-mount", ], "exclude": [ diff --git a/test/accessibility/apps/dashboard.ts b/test/accessibility/apps/dashboard.ts index 32d198c7d5e02..268bf06bc4b17 100644 --- a/test/accessibility/apps/dashboard.ts +++ b/test/accessibility/apps/dashboard.ts @@ -57,7 +57,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('save the dashboard', async () => { - await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.dashboard.saveDashboard(dashboardName, { saveAsNew: false }); await a11y.testAppSnapshot(); }); @@ -128,7 +128,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('Make a clone of the dashboard', async () => { - await PageObjects.dashboard.clickClone(); + await PageObjects.dashboard.duplicateDashboard(); await a11y.testAppSnapshot(); }); diff --git a/test/functional/apps/dashboard/group1/embeddable_rendering.ts b/test/functional/apps/dashboard/group1/embeddable_rendering.ts index 45408a8846c17..3ebef1fda00cc 100644 --- a/test/functional/apps/dashboard/group1/embeddable_rendering.ts +++ b/test/functional/apps/dashboard/group1/embeddable_rendering.ts @@ -154,6 +154,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.waitForRenderComplete(); await PageObjects.dashboard.saveDashboard('embeddable rendering test', { + saveAsNew: true, storeTimeWithDashboard: true, }); }); diff --git a/test/functional/apps/dashboard/group2/dashboard_filter_bar.ts b/test/functional/apps/dashboard/group2/dashboard_filter_bar.ts index 276a3f29e8fd5..c580d69fa0453 100644 --- a/test/functional/apps/dashboard/group2/dashboard_filter_bar.ts +++ b/test/functional/apps/dashboard/group2/dashboard_filter_bar.ts @@ -167,9 +167,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const filterKey = 'bytes'; await filterBar.toggleFilterPinned(filterKey); await PageObjects.dashboard.switchToEditMode(); - await PageObjects.dashboard.saveDashboard('saved with pinned filters', { - saveAsNew: true, - }); + await PageObjects.dashboard.saveDashboard('saved with pinned filters'); expect(await filterBar.isFilterPinned(filterKey)).to.be(true); await pieChart.expectPieSliceCount(1); }); diff --git a/test/functional/apps/dashboard/group3/bwc_shared_urls.ts b/test/functional/apps/dashboard/group3/bwc_shared_urls.ts index 8f89ed302c67c..fece4367abf04 100644 --- a/test/functional/apps/dashboard/group3/bwc_shared_urls.ts +++ b/test/functional/apps/dashboard/group3/bwc_shared_urls.ts @@ -103,6 +103,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('loads a saved dashboard', async function () { await PageObjects.dashboard.saveDashboard('saved with colors', { + saveAsNew: true, storeTimeWithDashboard: true, }); diff --git a/test/functional/apps/dashboard/group3/dashboard_state.ts b/test/functional/apps/dashboard/group3/dashboard_state.ts index 423adf781835c..df80d35ce2a64 100644 --- a/test/functional/apps/dashboard/group3/dashboard_state.ts +++ b/test/functional/apps/dashboard/group3/dashboard_state.ts @@ -102,7 +102,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const overwriteColor = '#d36086'; await PageObjects.visChart.selectNewLegendColorChoice(overwriteColor); - await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.dashboard.saveDashboard(dashboardName, { saveAsNew: false }); await PageObjects.dashboard.gotoDashboardLandingPage(); await PageObjects.dashboard.loadSavedDashboard(dashboardName); diff --git a/test/functional/apps/dashboard/group4/dashboard_clone.ts b/test/functional/apps/dashboard/group4/dashboard_clone.ts index c62c1a4195900..438f01061dda8 100644 --- a/test/functional/apps/dashboard/group4/dashboard_clone.ts +++ b/test/functional/apps/dashboard/group4/dashboard_clone.ts @@ -30,7 +30,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); await PageObjects.dashboard.saveDashboard(dashboardName); - await PageObjects.dashboard.clickClone(); + await PageObjects.dashboard.duplicateDashboard(); await PageObjects.dashboard.gotoDashboardLandingPage(); await listingTable.searchAndExpectItemsCount('dashboard', clonedDashboardName, 1); }); diff --git a/test/functional/apps/dashboard/group4/dashboard_listing.ts b/test/functional/apps/dashboard/group4/dashboard_listing.ts index ed8cc60cb5884..36e99d0e5c8c1 100644 --- a/test/functional/apps/dashboard/group4/dashboard_listing.ts +++ b/test/functional/apps/dashboard/group4/dashboard_listing.ts @@ -164,7 +164,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('stays on listing page if title matches two dashboards', async function () { await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.saveDashboard('two words', { needsConfirm: true }); + await PageObjects.dashboard.saveDashboard('two words', { + saveAsNew: true, + needsConfirm: true, + }); await PageObjects.dashboard.gotoDashboardLandingPage(); const currentUrl = await browser.getCurrentUrl(); const newUrl = currentUrl + '&title=two%20words'; diff --git a/test/functional/apps/dashboard/group4/dashboard_save.ts b/test/functional/apps/dashboard/group4/dashboard_save.ts index 4bbf697974953..9b7bcc77406c9 100644 --- a/test/functional/apps/dashboard/group4/dashboard_save.ts +++ b/test/functional/apps/dashboard/group4/dashboard_save.ts @@ -25,126 +25,144 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.initTests(); }); - it('warns on duplicate name for new dashboard', async function () { - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.saveDashboard(dashboardName); + describe('create new', () => { + it('warns on duplicate name for new dashboard', async function () { + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.saveDashboard(dashboardName); + + await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: false }); + + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.enterDashboardSaveModalApplyUpdatesAndClickSave(dashboardName, { + waitDialogIsClosed: false, + }); + await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: true }); + }); - await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: false }); + it('does not save on reject confirmation', async function () { + await PageObjects.dashboard.cancelSave(); + await PageObjects.dashboard.gotoDashboardLandingPage(); - await PageObjects.dashboard.gotoDashboardLandingPage(); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.enterDashboardTitleAndClickSave(dashboardName, { - waitDialogIsClosed: false, + await listingTable.searchAndExpectItemsCount('dashboard', dashboardName, 1); }); - await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: true }); - }); - it('does not save on reject confirmation', async function () { - await PageObjects.dashboard.cancelSave(); - await PageObjects.dashboard.gotoDashboardLandingPage(); + it('Saves on confirm duplicate title warning', async function () { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.enterDashboardSaveModalApplyUpdatesAndClickSave(dashboardName, { + waitDialogIsClosed: false, + }); - await listingTable.searchAndExpectItemsCount('dashboard', dashboardName, 1); - }); + await PageObjects.dashboard.ensureDuplicateTitleCallout(); + await PageObjects.dashboard.clickSave(); - it('Saves on confirm duplicate title warning', async function () { - await PageObjects.dashboard.gotoDashboardLandingPage(); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.enterDashboardTitleAndClickSave(dashboardName, { - waitDialogIsClosed: false, - }); + // This is important since saving a new dashboard will cause a refresh of the page. We have to + // wait till it finishes reloading or it might reload the url after simulating the + // dashboard landing page click. + await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.ensureDuplicateTitleCallout(); - await PageObjects.dashboard.clickSave(); + // after saving a new dashboard, the app state must be removed + await await PageObjects.dashboard.expectAppStateRemovedFromURL(); - // This is important since saving a new dashboard will cause a refresh of the page. We have to - // wait till it finishes reloading or it might reload the url after simulating the - // dashboard landing page click. - await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.gotoDashboardLandingPage(); - // after saving a new dashboard, the app state must be removed - await await PageObjects.dashboard.expectAppStateRemovedFromURL(); + await listingTable.searchAndExpectItemsCount('dashboard', dashboardName, 2); + }); - await PageObjects.dashboard.gotoDashboardLandingPage(); + it('Saves new Dashboard using the Enter key', async function () { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.enterDashboardTitleAndPressEnter(dashboardNameEnterKey); - await listingTable.searchAndExpectItemsCount('dashboard', dashboardName, 2); - }); + // This is important since saving a new dashboard will cause a refresh of the page. We have to + // wait till it finishes reloading or it might reload the url after simulating the + // dashboard landing page click. + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.gotoDashboardLandingPage(); - it('Does not warn when you save an existing dashboard with the title it already has, and that title is a duplicate', async function () { - await listingTable.clickItemLink('dashboard', dashboardName); - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.dashboard.switchToEditMode(); - await PageObjects.dashboard.saveDashboard(dashboardName); - - await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: false }); + await listingTable.searchAndExpectItemsCount('dashboard', dashboardNameEnterKey, 1); + }); }); - it('Warns you when you Save as New Dashboard, and the title is a duplicate', async function () { - await PageObjects.dashboard.switchToEditMode(); - await PageObjects.dashboard.enterDashboardTitleAndClickSave(dashboardName, { - saveAsNew: true, + describe('quick save', () => { + it('Does not show quick save menu item on a new dashboard', async function () { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.expectMissingQuickSaveOption(); }); - await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: true }); + it('Does not show dashboard save modal when on quick save', async function () { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.saveDashboard('test quick save'); - await PageObjects.dashboard.cancelSave(); - }); + await PageObjects.dashboard.switchToEditMode(); + await PageObjects.dashboard.expectExistsQuickSaveOption(); + await dashboardAddPanel.clickMarkdownQuickButton(); + await PageObjects.visualize.saveVisualizationAndReturn(); + await PageObjects.dashboard.waitForRenderComplete(); + await PageObjects.dashboard.clickQuickSave(); - it('Does not warn when only the prefix matches', async function () { - await PageObjects.dashboard.saveDashboard(dashboardName.split(' ')[0]); + await testSubjects.existOrFail('saveDashboardSuccess'); + }); - await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: false }); + it('Stays in edit mode after performing a quick save', async function () { + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('dashboardQuickSaveMenuItem'); + }); }); - it('Warns when case is different', async function () { - await PageObjects.dashboard.switchToEditMode(); - await PageObjects.dashboard.enterDashboardTitleAndClickSave(dashboardName.toUpperCase(), { - waitDialogIsClosed: false, + describe('duplication (edit mode)', () => { + it('Warns you when you Save as New Dashboard, and the title is a duplicate', async function () { + await PageObjects.dashboard.switchToEditMode(); + await PageObjects.dashboard.enterDashboardSaveModalApplyUpdatesAndClickSave(dashboardName, { + waitDialogIsClosed: false, + }); + + await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: true }); + + await PageObjects.dashboard.cancelSave(); }); - await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: true }); + it('Does not warn when only the prefix matches', async function () { + await PageObjects.dashboard.saveDashboard(dashboardName.split(' ')[0]); - await PageObjects.dashboard.cancelSave(); - }); + await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: false }); + }); - it('Saves new Dashboard using the Enter key', async function () { - await PageObjects.dashboard.gotoDashboardLandingPage(); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.enterDashboardTitleAndPressEnter(dashboardNameEnterKey); + it('Warns when case is different', async function () { + await PageObjects.dashboard.switchToEditMode(); + await PageObjects.dashboard.enterDashboardSaveModalApplyUpdatesAndClickSave( + dashboardName.toUpperCase(), + { + waitDialogIsClosed: false, + } + ); - // This is important since saving a new dashboard will cause a refresh of the page. We have to - // wait till it finishes reloading or it might reload the url after simulating the - // dashboard landing page click. - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.expectDuplicateTitleWarningDisplayed({ displayed: true }); - await listingTable.searchAndExpectItemsCount('dashboard', dashboardNameEnterKey, 1); + await PageObjects.dashboard.cancelSave(); + }); }); - it('Does not show quick save menu item on a new dashboard', async function () { - await PageObjects.dashboard.gotoDashboardLandingPage(); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.expectMissingQuickSaveOption(); - }); + describe('flyout settings', () => { + const dashboardNameFlyout = 'Dashboard Save Test with Flyout'; - it('Does not show dashboard save modal when on quick save', async function () { - await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); - await PageObjects.dashboard.gotoDashboardLandingPage(); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.dashboard.saveDashboard('test quick save'); - - await PageObjects.dashboard.switchToEditMode(); - await PageObjects.dashboard.expectExistsQuickSaveOption(); - await dashboardAddPanel.clickMarkdownQuickButton(); - await PageObjects.visualize.saveVisualizationAndReturn(); - await PageObjects.dashboard.waitForRenderComplete(); - await PageObjects.dashboard.clickQuickSave(); - - await testSubjects.existOrFail('saveDashboardSuccess'); - }); + it('Does not warn when you save an existing dashboard with the title it already has', async function () { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.enterDashboardTitleAndPressEnter(dashboardNameFlyout); - it('Stays in edit mode after performing a quick save', async function () { - await PageObjects.header.waitUntilLoadingHasFinished(); - await testSubjects.existOrFail('dashboardQuickSaveMenuItem'); + // This is important since saving a new dashboard will cause a refresh of the page. We have to + // wait till it finishes reloading or it might reload the url after simulating the + // dashboard landing page click. + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.dashboard.switchToEditMode(); + await PageObjects.dashboard.modifyExistingDashboardDetails(dashboardNameFlyout); + }); }); }); } diff --git a/test/functional/apps/dashboard/group4/dashboard_time.ts b/test/functional/apps/dashboard/group4/dashboard_time.ts index 2b35c5e78f331..eb689353bde41 100644 --- a/test/functional/apps/dashboard/group4/dashboard_time.ts +++ b/test/functional/apps/dashboard/group4/dashboard_time.ts @@ -33,7 +33,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.addVisualizations([ PageObjects.dashboard.getTestVisualizationNames()[0], ]); - await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: false }); + await PageObjects.dashboard.saveDashboard(dashboardName, { + storeTimeWithDashboard: false, + saveAsNew: true, + }); }); it('Does not set the time picker on open', async () => { @@ -51,7 +54,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('is saved with time', async function () { await PageObjects.dashboard.switchToEditMode(); await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true }); + await PageObjects.dashboard.saveDashboard(dashboardName, { + storeTimeWithDashboard: true, + saveAsNew: false, + }); }); it('sets time on open', async function () { diff --git a/test/functional/apps/dashboard/group5/legacy_urls.ts b/test/functional/apps/dashboard/group5/legacy_urls.ts index 03dabfe87ba2f..0d09ba7a7ca79 100644 --- a/test/functional/apps/dashboard/group5/legacy_urls.ts +++ b/test/functional/apps/dashboard/group5/legacy_urls.ts @@ -41,7 +41,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.navigateToApp(); await PageObjects.dashboard.clickNewDashboard(); await dashboardAddPanel.addVisualization('Rendering-Test:-animal-sounds-pie'); - await PageObjects.dashboard.saveDashboard('legacyTest', { waitDialogIsClosed: true }); + await PageObjects.dashboard.saveDashboard('legacyTest', { + waitDialogIsClosed: true, + saveAsNew: true, + }); await PageObjects.header.waitUntilLoadingHasFinished(); const currentUrl = await browser.getCurrentUrl(); await log.debug(`Current url is ${currentUrl}`); diff --git a/test/functional/apps/dashboard/group6/view_edit.ts b/test/functional/apps/dashboard/group6/view_edit.ts index 1d4f2482cc9c0..93748e07e2536 100644 --- a/test/functional/apps/dashboard/group6/view_edit.ts +++ b/test/functional/apps/dashboard/group6/view_edit.ts @@ -63,12 +63,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(isInViewMode).to.be(false); }); + describe('save as new', () => { + it('keeps duplicated dashboard in edit mode', async () => { + await PageObjects.dashboard.gotoDashboardEditMode(dashboardName); + await PageObjects.dashboard.duplicateDashboard('edit'); + const isViewMode = await PageObjects.dashboard.getIsInViewMode(); + expect(isViewMode).to.equal(false); + }); + }); + describe('save', function () { - it('auto exits out of edit mode', async function () { + it('keeps dashboard in edit mode', async function () { await PageObjects.dashboard.gotoDashboardEditMode(dashboardName); - await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.dashboard.saveDashboard(dashboardName, { + storeTimeWithDashboard: true, + saveAsNew: false, + }); const isViewMode = await PageObjects.dashboard.getIsInViewMode(); - expect(isViewMode).to.equal(true); + expect(isViewMode).to.equal(false); }); }); @@ -85,6 +97,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true, + saveAsNew: false, }); await PageObjects.timePicker.setAbsoluteRange( @@ -170,7 +183,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Sep 19, 2013 @ 06:31:44.000', 'Sep 19, 2013 @ 06:31:44.000' ); - await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.dashboard.saveDashboard(dashboardName, { saveAsNew: false }); await PageObjects.dashboard.switchToEditMode(); await PageObjects.timePicker.setAbsoluteRange( 'Sep 19, 2015 @ 06:31:44.000', @@ -180,6 +193,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.common.clickCancelOnModal(); await PageObjects.dashboard.saveDashboard(dashboardName, { + saveAsNew: false, storeTimeWithDashboard: true, }); @@ -197,8 +211,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('when time changed is stored with dashboard', async function () { await PageObjects.dashboard.gotoDashboardEditMode(dashboardName); await PageObjects.timePicker.setDefaultDataRange(); - await PageObjects.dashboard.saveDashboard(dashboardName); - await PageObjects.dashboard.switchToEditMode(); + await PageObjects.dashboard.saveDashboard(dashboardName, { saveAsNew: false }); await PageObjects.timePicker.setAbsoluteRange( 'Sep 19, 2013 @ 06:31:44.000', 'Sep 19, 2013 @ 06:31:44.000' @@ -208,7 +221,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.clickCancelOutOfEditMode(false); await PageObjects.common.clickCancelOnModal(); - await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true }); + await PageObjects.dashboard.saveDashboard(dashboardName, { + storeTimeWithDashboard: true, + saveAsNew: false, + }); await PageObjects.dashboard.loadSavedDashboard(dashboardName); @@ -222,7 +238,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Does not show lose changes warning', function () { it('when time changed is not stored with dashboard', async function () { await PageObjects.dashboard.gotoDashboardEditMode(dashboardName); - await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: false }); + await PageObjects.dashboard.saveDashboard(dashboardName, { + storeTimeWithDashboard: false, + saveAsNew: false, + }); await PageObjects.timePicker.setAbsoluteRange( 'Oct 19, 2014 @ 06:31:44.000', 'Dec 19, 2014 @ 06:31:44.000' diff --git a/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts b/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts index 40e75ac70ff09..9f5862c5fbbcd 100644 --- a/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts +++ b/test/functional/apps/dashboard_elements/controls/common/control_group_apply_button.ts @@ -37,7 +37,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardAddPanel.addVisualization('Rendering-Test:-animal-sounds-pie'); // save the dashboard before adding controls - await dashboard.saveDashboard('Test Control Group Apply Button', { exitFromEditMode: false }); + await dashboard.saveDashboard('Test Control Group Apply Button', { + exitFromEditMode: false, + saveAsNew: true, + }); await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); await dashboard.expectMissingUnsavedChangesBadge(); diff --git a/test/functional/apps/dashboard_elements/controls/common/range_slider.ts b/test/functional/apps/dashboard_elements/controls/common/range_slider.ts index 8819f143a3dc7..06e67b9d8df91 100644 --- a/test/functional/apps/dashboard_elements/controls/common/range_slider.ts +++ b/test/functional/apps/dashboard_elements/controls/common/range_slider.ts @@ -57,7 +57,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboard.preserveCrossAppState(); await dashboard.gotoDashboardLandingPage(); await dashboard.clickNewDashboard(); - await dashboard.saveDashboard(DASHBOARD_NAME, { exitFromEditMode: false }); + await dashboard.saveDashboard(DASHBOARD_NAME, { + exitFromEditMode: false, + saveAsNew: true, + }); }); after(async () => { diff --git a/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts b/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts index 974f5e942d42a..e29b53c95d4d0 100644 --- a/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts +++ b/test/functional/apps/dashboard_elements/controls/common/replace_controls.ts @@ -56,7 +56,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboard.gotoDashboardLandingPage(); await dashboard.clickNewDashboard(); await timePicker.setDefaultDataRange(); - await dashboard.saveDashboard(DASHBOARD_NAME, { exitFromEditMode: false }); + await dashboard.saveDashboard(DASHBOARD_NAME, { + exitFromEditMode: false, + saveAsNew: true, + }); }); after(async () => { diff --git a/test/functional/apps/dashboard_elements/controls/common/time_slider.ts b/test/functional/apps/dashboard_elements/controls/common/time_slider.ts index c860af183d64e..32f6e39e6b3c2 100644 --- a/test/functional/apps/dashboard_elements/controls/common/time_slider.ts +++ b/test/functional/apps/dashboard_elements/controls/common/time_slider.ts @@ -62,7 +62,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'Oct 22, 2018 @ 00:00:00.000', 'Dec 3, 2018 @ 00:00:00.000' ); - await dashboard.saveDashboard('test time slider control', { exitFromEditMode: false }); + await dashboard.saveDashboard('test time slider control', { + exitFromEditMode: false, + saveAsNew: true, + }); }); it('can create a new time slider control from a blank state', async () => { diff --git a/test/functional/apps/dashboard_elements/controls/options_list/index.ts b/test/functional/apps/dashboard_elements/controls/options_list/index.ts index 966dbd91b7705..5f589129ed279 100644 --- a/test/functional/apps/dashboard_elements/controls/options_list/index.ts +++ b/test/functional/apps/dashboard_elements/controls/options_list/index.ts @@ -35,6 +35,7 @@ export default function ({ loadTestFile, getService, getPageObjects }: FtrProvid await timePicker.setDefaultDataRange(); await elasticChart.setNewChartUiDebugFlag(); await dashboard.saveDashboard(OPTIONS_LIST_DASHBOARD_NAME, { + saveAsNew: true, exitFromEditMode: false, storeTimeWithDashboard: true, }); diff --git a/test/functional/apps/dashboard_elements/links/links_create_edit.ts b/test/functional/apps/dashboard_elements/links/links_create_edit.ts index ac68b2c00be8c..97e78ca2fb0a4 100644 --- a/test/functional/apps/dashboard_elements/links/links_create_edit.ts +++ b/test/functional/apps/dashboard_elements/links/links_create_edit.ts @@ -44,7 +44,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboard.preserveCrossAppState(); await dashboard.gotoDashboardLandingPage(); await dashboard.clickNewDashboard(); - await dashboard.saveDashboard(DASHBOARD_NAME, { exitFromEditMode: false }); + await dashboard.saveDashboard(DASHBOARD_NAME, { + exitFromEditMode: false, + saveAsNew: true, + }); await dashboard.loadSavedDashboard(DASHBOARD_NAME); await dashboard.switchToEditMode(); }); diff --git a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts index b370141f69728..befce148bdf81 100644 --- a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts +++ b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts @@ -68,6 +68,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.checkCurrentRowsPerPageToBe(100); await PageObjects.dashboard.saveDashboard(dashboardName, { + saveAsNew: true, waitDialogIsClosed: true, exitFromEditMode: false, }); @@ -78,7 +79,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.changeRowsPerPageTo(10); - await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.dashboard.saveDashboard(dashboardName, { saveAsNew: false }); await refreshDashboardPage(); await dataGrid.checkCurrentRowsPerPageToBe(10); diff --git a/test/functional/page_objects/dashboard_page.ts b/test/functional/page_objects/dashboard_page.ts index 66ce19c3d6d4f..408054a5c6114 100644 --- a/test/functional/page_objects/dashboard_page.ts +++ b/test/functional/page_objects/dashboard_page.ts @@ -229,9 +229,20 @@ export class DashboardPageObject extends FtrService { await this.expectExistsDashboardLandingPage(); } - public async clickClone() { - this.log.debug('Clicking clone'); - await this.testSubjects.click('dashboardClone'); + public async duplicateDashboard(dashboardNameOverride?: string) { + this.log.debug('Clicking duplicate'); + + await this.testSubjects.click('dashboardInteractiveSaveMenuItem'); + + if (dashboardNameOverride) { + this.log.debug('entering dashboard duplicate override title'); + await this.testSubjects.setValue('savedObjectTitle', dashboardNameOverride); + } + + await this.clickSave(); + + // Confirm that the Dashboard has actually been saved + await this.testSubjects.existOrFail('saveDashboardSuccess'); } /** @@ -240,9 +251,9 @@ export class DashboardPageObject extends FtrService { */ public async expectDuplicateTitleWarningDisplayed({ displayed = true }) { if (displayed) { - await this.testSubjects.existOrFail('titleDupicateWarnMsg'); + await this.testSubjects.existOrFail('titleDuplicateWarnMsg'); } else { - await this.testSubjects.missingOrFail('titleDupicateWarnMsg'); + await this.testSubjects.missingOrFail('titleDuplicateWarnMsg'); } } @@ -460,19 +471,62 @@ export class DashboardPageObject extends FtrService { } /** - * Save the current dashboard with the specified name and options and + * @description opens the dashboard settings flyout to modify an existing dashboard + */ + public async modifyExistingDashboardDetails( + dashboard: string, + saveOptions: Pick = {} + ) { + await this.openSettingsFlyout(); + + await this.retry.try(async () => { + this.log.debug('entering new title'); + await this.testSubjects.setValue('dashboardTitleInput', dashboard); + + if (saveOptions.storeTimeWithDashboard !== undefined) { + await this.setStoreTimeWithDashboard(saveOptions.storeTimeWithDashboard); + } + + if (saveOptions.tags) { + const tagsComboBox = await this.testSubjects.find('comboBoxInput'); + for (const tagName of saveOptions.tags) { + await this.comboBox.setElement(tagsComboBox, tagName); + } + } + + this.log.debug('DashboardPage.applyCustomization'); + await this.testSubjects.click('applyCustomizeDashboardButton'); + + if (saveOptions.needsConfirm) { + await this.ensureDuplicateTitleCallout(); + await this.testSubjects.click('applyCustomizeDashboardButton'); + } + + this.log.debug('isCustomizeDashboardLoadingIndicatorVisible'); + return await this.testSubjects.exists('dashboardUnsavedChangesBadge', { timeout: 1500 }); + }); + } + + /** + * @description Save the current dashboard with the specified name and options and * verify that the save was successful, close the toast and return the * toast message - * - * @param dashboardName {String} - * @param saveOptions {{storeTimeWithDashboard: boolean, saveAsNew: boolean, needsConfirm: false, waitDialogIsClosed: boolean }} */ public async saveDashboard( dashboardName: string, - saveOptions: SaveDashboardOptions = { waitDialogIsClosed: true, exitFromEditMode: true } + saveOptions: SaveDashboardOptions = { + waitDialogIsClosed: true, + exitFromEditMode: true, + saveAsNew: true, + } ) { await this.retry.try(async () => { - await this.enterDashboardTitleAndClickSave(dashboardName, saveOptions); + if (saveOptions.saveAsNew) { + await this.enterDashboardSaveModalApplyUpdatesAndClickSave(dashboardName, saveOptions); + } else { + await this.modifyExistingDashboardDetails(dashboardName, saveOptions); + await this.clickQuickSave(); + } if (saveOptions.needsConfirm) { await this.ensureDuplicateTitleCallout(); @@ -482,9 +536,14 @@ export class DashboardPageObject extends FtrService { // Confirm that the Dashboard has actually been saved await this.testSubjects.existOrFail('saveDashboardSuccess'); }); - const message = await this.toasts.getTitleAndDismiss(); - await this.header.waitUntilLoadingHasFinished(); - await this.common.waitForSaveModalToClose(); + + let message; + + if (saveOptions.saveAsNew) { + message = await this.toasts.getTitleAndDismiss(); + await this.header.waitUntilLoadingHasFinished(); + await this.common.waitForSaveModalToClose(); + } const isInViewMode = await this.testSubjects.exists('dashboardEditMode'); if (saveOptions.exitFromEditMode && !isInViewMode) { @@ -506,20 +565,20 @@ export class DashboardPageObject extends FtrService { } /** - * - * @param dashboardTitle {String} - * @param saveOptions {{storeTimeWithDashboard: boolean, saveAsNew: boolean, waitDialogIsClosed: boolean}} + * @description populates the duplicate dashboard modal */ - public async enterDashboardTitleAndClickSave( + public async enterDashboardSaveModalApplyUpdatesAndClickSave( dashboardTitle: string, - saveOptions: SaveDashboardOptions = { waitDialogIsClosed: true } + saveOptions: Omit = { waitDialogIsClosed: true } ) { const isSaveModalOpen = await this.testSubjects.exists('savedObjectSaveModal', { timeout: 2000, }); + if (!isSaveModalOpen) { - await this.testSubjects.click('dashboardSaveMenuItem'); + await this.testSubjects.click('dashboardInteractiveSaveMenuItem'); } + const modalDialog = await this.testSubjects.find('savedObjectSaveModal'); this.log.debug('entering new title'); @@ -529,11 +588,6 @@ export class DashboardPageObject extends FtrService { await this.setStoreTimeWithDashboard(saveOptions.storeTimeWithDashboard); } - const saveAsNewCheckboxExists = await this.testSubjects.exists('saveAsNewCheckbox'); - if (saveAsNewCheckboxExists) { - await this.setSaveAsNewCheckBox(Boolean(saveOptions.saveAsNew)); - } - if (saveOptions.tags) { await this.selectDashboardTags(saveOptions.tags); } @@ -545,7 +599,7 @@ export class DashboardPageObject extends FtrService { } public async ensureDuplicateTitleCallout() { - await this.testSubjects.existOrFail('titleDupicateWarnMsg'); + await this.testSubjects.existOrFail('titleDuplicateWarnMsg'); } public async selectDashboardTags(tagNames: string[]) { @@ -560,7 +614,7 @@ export class DashboardPageObject extends FtrService { * @param dashboardTitle {String} */ public async enterDashboardTitleAndPressEnter(dashboardTitle: string) { - await this.testSubjects.click('dashboardSaveMenuItem'); + await this.testSubjects.click('dashboardInteractiveSaveMenuItem'); const modalDialog = await this.testSubjects.find('savedObjectSaveModal'); this.log.debug('entering new title'); @@ -745,7 +799,7 @@ export class DashboardPageObject extends FtrService { } public async expectMissingSaveOption() { - await this.testSubjects.missingOrFail('dashboardSaveMenuItem'); + await this.testSubjects.missingOrFail('dashboardInteractiveSaveMenuItem'); } public async expectMissingQuickSaveOption() { diff --git a/x-pack/performance/journeys_e2e/dashboard_listing_page.ts b/x-pack/performance/journeys_e2e/dashboard_listing_page.ts index bad94790b2805..34e9d8a34927a 100644 --- a/x-pack/performance/journeys_e2e/dashboard_listing_page.ts +++ b/x-pack/performance/journeys_e2e/dashboard_listing_page.ts @@ -36,9 +36,9 @@ export const journey = new Journey({ await kibanaPage.waitForListViewTable(); await deletedDashboard.waitFor({ state: 'detached' }); }) - .step('Add dashboard', async ({ page, inputDelays }) => { + .step('Add dashboard', async ({ page, inputDelays }) => { await page.click(subj('newItemButton')); - await page.click(subj('dashboardSaveMenuItem')); + await page.click(subj('dashboardInteractiveSaveMenuItem')); await page.type(subj('savedObjectTitle'), `foobar dashboard ${uuidv4()}`, { delay: inputDelays.TYPING, }); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f68a59f484638..8c5b395bdd3f3 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -1313,16 +1313,16 @@ "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowHelpText": "Le filtre temporel est défini sur l’option sélectionnée chaque fois que ce tableau de bord est chargé.", "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowLabel": "Enregistrer la plage temporelle avec le tableau de bord", "dashboard.topNave.cancelButtonAriaLabel": "Basculer en mode Affichage", - "dashboard.topNave.cloneButtonAriaLabel": "cloner", - "dashboard.topNave.cloneConfigDescription": "Créer une copie du tableau de bord", + "dashboard.topNave.viewModeInteractiveSaveButtonAriaLabel": "cloner", + "dashboard.topNave.viewModeInteractiveSaveConfigDescription": "Créer une copie du tableau de bord", "dashboard.topNave.editButtonAriaLabel": "modifier", "dashboard.topNave.editConfigDescription": "Basculer en mode Édition", "dashboard.topNave.fullScreenButtonAriaLabel": "plein écran", "dashboard.topNave.fullScreenConfigDescription": "Mode Plein écran", "dashboard.topNave.resetChangesButtonAriaLabel": "Réinitialiser", "dashboard.topNave.resetChangesConfigDescription": "Réinitialiser les modifications apportées au tableau de bord", - "dashboard.topNave.saveAsButtonAriaLabel": "enregistrer sous", - "dashboard.topNave.saveAsConfigDescription": "Enregistrer en tant que nouveau tableau de bord", + "dashboard.topNave.editModeInteractiveSaveButtonAriaLabel": "enregistrer sous", + "dashboard.topNave.editModeInteractiveSaveConfigDescription": "Enregistrer en tant que nouveau tableau de bord", "dashboard.topNave.saveButtonAriaLabel": "enregistrer", "dashboard.topNave.saveConfigDescription": "Enregistrer le tableau de bord sans invite de confirmation", "dashboard.topNave.settingsButtonAriaLabel": "les paramètres d'index suivants déclassés ?", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index e7d393cd5595c..48a3eefcb30ec 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -1313,16 +1313,16 @@ "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowHelpText": "有効化すると、ダッシュボードが読み込まれるごとに現在選択された時刻の時間フィルターが変更されます。", "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowLabel": "ダッシュボードに時刻を保存", "dashboard.topNave.cancelButtonAriaLabel": "表示モードに切り替える", - "dashboard.topNave.cloneButtonAriaLabel": "クローンを作成", - "dashboard.topNave.cloneConfigDescription": "ダッシュボードのコピーを作成します", + "dashboard.topNave.viewModeInteractiveSaveButtonAriaLabel": "クローンを作成", + "dashboard.topNave.viewModeInteractiveSaveConfigDescription": "ダッシュボードのコピーを作成します", "dashboard.topNave.editButtonAriaLabel": "編集", "dashboard.topNave.editConfigDescription": "編集モードに切り替えます", "dashboard.topNave.fullScreenButtonAriaLabel": "全画面", "dashboard.topNave.fullScreenConfigDescription": "全画面モード", "dashboard.topNave.resetChangesButtonAriaLabel": "リセット", "dashboard.topNave.resetChangesConfigDescription": "ダッシュボードの変更をリセット", - "dashboard.topNave.saveAsButtonAriaLabel": "名前を付けて保存", - "dashboard.topNave.saveAsConfigDescription": "新しいダッシュボードとして保存", + "dashboard.topNave.editModeInteractiveSaveButtonAriaLabel": "名前を付けて保存", + "dashboard.topNave.editModeInteractiveSaveConfigDescription": "新しいダッシュボードとして保存", "dashboard.topNave.saveButtonAriaLabel": "保存", "dashboard.topNave.saveConfigDescription": "プロンプトを表示せずにダッシュボードをクイック保存", "dashboard.topNave.settingsButtonAriaLabel": "設定", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 10435bf1bdfc8..abaaacf435a14 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -1315,16 +1315,16 @@ "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowHelpText": "每次加载此仪表板时,都会将时间筛选更改为当前选定的时间。", "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowLabel": "将时间随仪表板保存", "dashboard.topNave.cancelButtonAriaLabel": "切换到查看模式", - "dashboard.topNave.cloneButtonAriaLabel": "克隆", - "dashboard.topNave.cloneConfigDescription": "创建仪表板的副本", + "dashboard.topNave.viewModeInteractiveSaveButtonAriaLabel": "克隆", + "dashboard.topNave.viewModeInteractiveSaveConfigDescription": "创建仪表板的副本", "dashboard.topNave.editButtonAriaLabel": "编辑", "dashboard.topNave.editConfigDescription": "切换到编辑模式", "dashboard.topNave.fullScreenButtonAriaLabel": "全屏", "dashboard.topNave.fullScreenConfigDescription": "全屏模式", "dashboard.topNave.resetChangesButtonAriaLabel": "重置", "dashboard.topNave.resetChangesConfigDescription": "重置对仪表板所做的更改", - "dashboard.topNave.saveAsButtonAriaLabel": "另存为", - "dashboard.topNave.saveAsConfigDescription": "另存为新仪表板", + "dashboard.topNave.editModeInteractiveSaveButtonAriaLabel": "另存为", + "dashboard.topNave.editModeInteractiveSaveConfigDescription": "另存为新仪表板", "dashboard.topNave.saveButtonAriaLabel": "保存", "dashboard.topNave.saveConfigDescription": "没有任何提示,快速保存您的仪表板", "dashboard.topNave.settingsButtonAriaLabel": "设置", diff --git a/x-pack/test/accessibility/apps/group1/dashboard_links.ts b/x-pack/test/accessibility/apps/group1/dashboard_links.ts index 5e5d00dd34b94..3ec6df1b880ca 100644 --- a/x-pack/test/accessibility/apps/group1/dashboard_links.ts +++ b/x-pack/test/accessibility/apps/group1/dashboard_links.ts @@ -32,7 +32,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await common.navigateToApp('dashboard'); await dashboard.gotoDashboardLandingPage(); await dashboard.clickNewDashboard(); - await dashboard.saveDashboard(DASHBOARD_NAME, { exitFromEditMode: false }); + await dashboard.saveDashboard(DASHBOARD_NAME, { + exitFromEditMode: false, + saveAsNew: true, + }); }); after(async () => { diff --git a/x-pack/test/functional/apps/dashboard/group1/created_by.ts b/x-pack/test/functional/apps/dashboard/group1/created_by.ts index 00c280f28f96d..ed3798e1b8809 100644 --- a/x-pack/test/functional/apps/dashboard/group1/created_by.ts +++ b/x-pack/test/functional/apps/dashboard/group1/created_by.ts @@ -76,6 +76,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.dashboard.preserveCrossAppState(); await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.saveDashboard(DASHBOARD_NAME, { + saveAsNew: true, waitDialogIsClosed: false, exitFromEditMode: false, }); diff --git a/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts b/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts index ccf738af3825d..cb73963a68e97 100644 --- a/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts +++ b/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts @@ -48,7 +48,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await panelActions.customizePanel(); await dashboardCustomizePanel.disableCustomTimeRange(); await dashboardCustomizePanel.clickSaveButton(); - await dashboard.saveDashboard('Dashboard with Pie Chart'); + await dashboard.saveDashboard('Dashboard with Pie Chart', { + saveAsNew: false, + exitFromEditMode: true, + }); }); it('action exists in panel context menu', async () => { @@ -85,7 +88,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardCustomizePanel.clickCommonlyUsedTimeRange('Last_90 days'); await dashboardCustomizePanel.clickSaveButton(); - await dashboard.saveDashboard('Dashboard with Pie Chart'); + await dashboard.saveDashboard('Dashboard with Pie Chart', { + saveAsNew: false, + exitFromEditMode: true, + }); await panelActions.openContextMenu(); await testSubjects.clickWhenNotDisabledWithoutRetry(ACTION_TEST_SUBJ); diff --git a/x-pack/test/functional/apps/discover/saved_search_embeddable.ts b/x-pack/test/functional/apps/discover/saved_search_embeddable.ts index fd546315a1fd9..3f3f58dcdaf16 100644 --- a/x-pack/test/functional/apps/discover/saved_search_embeddable.ts +++ b/x-pack/test/functional/apps/discover/saved_search_embeddable.ts @@ -93,6 +93,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.saveDashboard('Dashboard with deleted saved search', { waitDialogIsClosed: true, exitFromEditMode: false, + saveAsNew: true, }); await kibanaServer.savedObjects.delete({ type: 'search', diff --git a/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts b/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts index 761278e69025c..965474919e6fa 100644 --- a/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts +++ b/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts @@ -36,6 +36,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.save('Embedded Visualization', true, false, false, 'new'); await PageObjects.dashboard.saveDashboard(`Open in Discover Testing ${uuidv4()}`, { + saveAsNew: true, exitFromEditMode: true, }); @@ -68,6 +69,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.save('Embedded Visualization', false); await PageObjects.dashboard.saveDashboard(`Open in Discover Testing ${uuidv4()}`, { + saveAsNew: false, exitFromEditMode: true, }); diff --git a/x-pack/test/functional/apps/managed_content/managed_content.ts b/x-pack/test/functional/apps/managed_content/managed_content.ts index 8f2ff247709cd..1bee3acd761bb 100644 --- a/x-pack/test/functional/apps/managed_content/managed_content.ts +++ b/x-pack/test/functional/apps/managed_content/managed_content.ts @@ -159,7 +159,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.dashboard.waitForRenderComplete(); - await PageObjects.dashboard.clickClone(); + await PageObjects.dashboard.duplicateDashboard(); await PageObjects.dashboard.waitForRenderComplete(); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts index 3f7e726543485..76f1f0fcd5584 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts @@ -106,7 +106,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.assertFieldStatsTableNotExists(); - await PageObjects.dashboard.saveDashboard(dashboardTitle); + await PageObjects.dashboard.saveDashboard(dashboardTitle, { saveAsNew: false }); }); }); } diff --git a/x-pack/test/saved_object_tagging/functional/tests/dashboard_integration.ts b/x-pack/test/saved_object_tagging/functional/tests/dashboard_integration.ts index 18be683db1d05..5a4a71c6abb2d 100644 --- a/x-pack/test/saved_object_tagging/functional/tests/dashboard_integration.ts +++ b/x-pack/test/saved_object_tagging/functional/tests/dashboard_integration.ts @@ -85,6 +85,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.saveDashboard('my-new-dashboard', { + saveAsNew: true, waitDialogIsClosed: true, tags: ['tag-1', 'tag-3'], }); @@ -102,7 +103,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.dashboard.clickNewDashboard(); - await testSubjects.click('dashboardSaveMenuItem'); + await testSubjects.click('dashboardInteractiveSaveMenuItem'); await testSubjects.setValue('savedObjectTitle', 'dashboard-with-new-tag'); await testSubjects.click('savedObjectTagSelector'); @@ -148,6 +149,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.dashboard.switchToEditMode(); await PageObjects.dashboard.saveDashboard('dashboard 4 with real data (tag-1)', { + saveAsNew: false, waitDialogIsClosed: true, tags: ['tag-3'], }); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts index 2cd16b00feb6a..84d67386a7555 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts @@ -81,6 +81,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.saveDashboard(dashboardName, { waitDialogIsClosed: true, exitFromEditMode: false, + saveAsNew: true, }); await refreshDashboardPage(); @@ -89,7 +90,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.changeRowsPerPageTo(10); - await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.dashboard.saveDashboard(dashboardName, { saveAsNew: false }); await refreshDashboardPage(); await dataGrid.checkCurrentRowsPerPageToBe(10); From b9e47025fa2723cdc83eb38df2ffdfe33ceb6896 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Wed, 29 May 2024 13:32:12 +0300 Subject: [PATCH 06/95] [ResponseOps][Rules] Fix KQL wildcards in alerts filtering in actions and MW (#183901) ## Summary This PR 1. Show KQL error messages to the UI 2. Respect the `query:allowLeadingWildcards` advance setting in the MW ## Testing Verify that the bug except the one about DSL filtering described in https://github.com/elastic/kibana/issues/168600 is fixed. Also, test the following scenarios. ### Actions **Error**: 1. Go to Stack -> Advanced setting and disable `query:allowLeadingWildcards` 2. Create a rule with an action and make the action conditional by toggling the "If alert matches query" 3. Add a KQL like `kibana.alert.instance.id : *development`. The leading `*` is important 4. Save the rule. You should see a toaster error with a message about `query:allowLeadingWildcards` **Happy path**: 1. Go to Stack -> Advanced setting and make sure `query:allowLeadingWildcards` is enabled 2. Create a rule with an action and make the action conditional by toggling the "If alert matches query" 3. Add a KQL like `kibana.alert.instance.id : *development`. The leading `*` is important 4. Save the rule. You should not see any errors. ### Maintenance Windows **Error**: 1. Go to Stack -> Advanced setting and disable `query:allowLeadingWildcards` 2. Go to Stack -> Maintenance Windows -> Create window 3. Toggle "Filter alerts" and add a KQL like `kibana.alert.instance.id : *development`. The leading `*` is important 4. Create the MW. You should see a toaster error with a message about `query:allowLeadingWildcards` **Happy path**: 1. Go to Stack -> Advanced setting and make sure `query:allowLeadingWildcards` is enabled 2. Go to Stack -> Maintenance Windows -> Create window 3. Toggle "Filter alerts" and add a KQL like `kibana.alert.instance.id : *development`. The leading `*` is important 4. Create the MW. You should not see any errors. Fixes: https://github.com/elastic/kibana/issues/168600 ### Checklist Delete any items that are not applicable to this PR. - [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] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### 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) ## Release notes Show errors about invalid KQL in conditional actions and respect the `query:allowLeadingWildcards` advanced setting in maintenance windows --- .../alerting/common/maintenance_window.ts | 3 +- .../use_create_maintenance_window.test.tsx | 20 ++++++++++- .../hooks/use_create_maintenance_window.ts | 20 +++++++++-- .../archive_maintenance_window.test.ts | 8 ++++- .../bulk_get_maintenance_windows.test.ts | 8 ++++- .../create/create_maintenance_window.test.ts | 23 +++++++++++- .../create/create_maintenance_window.ts | 9 +++-- .../delete/delete_maintenance_window.test.ts | 8 ++++- .../find/find_maintenance_windows.test.ts | 8 ++++- .../finish/finish_maintenance_window.test.ts | 8 ++++- .../get/get_maintenance_window.test.ts | 8 ++++- .../get_active_maintenance_windows.test.ts | 8 ++++- .../update/update_maintenance_window.test.ts | 8 ++++- .../server/lib/get_es_query_config.test.ts | 22 ++++++++++++ .../server/lib/get_es_query_config.ts | 23 ++++++++++++ .../maintenance_window_client.ts | 4 ++- .../maintenance_window_client_factory.test.ts | 4 ++- .../maintenance_window_client_factory.ts | 7 ++++ x-pack/plugins/alerting/server/plugin.ts | 1 + .../add_generated_action_values.test.ts.snap | 3 -- .../lib/add_generated_action_values.test.ts | 36 ++++++++++++++++--- .../lib/add_generated_action_values.ts | 17 +++------ .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 25 files changed, 218 insertions(+), 41 deletions(-) create mode 100644 x-pack/plugins/alerting/server/lib/get_es_query_config.test.ts create mode 100644 x-pack/plugins/alerting/server/lib/get_es_query_config.ts delete mode 100644 x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap diff --git a/x-pack/plugins/alerting/common/maintenance_window.ts b/x-pack/plugins/alerting/common/maintenance_window.ts index 80cdb88858643..d0cefad3c7319 100644 --- a/x-pack/plugins/alerting/common/maintenance_window.ts +++ b/x-pack/plugins/alerting/common/maintenance_window.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { Logger, SavedObjectsClientContract } from '@kbn/core/server'; +import type { IUiSettingsClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; import { FilterStateStore } from '@kbn/es-query'; import { RRuleParams } from './rrule_type'; @@ -76,6 +76,7 @@ export type MaintenanceWindowCreateBody = Omit< >; export interface MaintenanceWindowClientContext { + readonly uiSettings: IUiSettingsClient; getModificationMetadata: () => Promise; savedObjectsClient: SavedObjectsClientContract; logger: Logger; diff --git a/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.test.tsx b/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.test.tsx index c7c1ce427f02b..26d70f2d4e9a8 100644 --- a/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.test.tsx +++ b/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.test.tsx @@ -79,7 +79,25 @@ describe('useCreateMaintenanceWindow', () => { }); await waitFor(() => - expect(mockAddDanger).toBeCalledWith('Failed to create maintenance window.') + expect(mockAddDanger).toBeCalledWith('Failed to create maintenance window') + ); + }); + + it('should show 400 error messages', async () => { + createMaintenanceWindow.mockRejectedValue({ + body: { statusCode: 400, message: 'Bad request' }, + }); + + const { result } = renderHook(() => useCreateMaintenanceWindow(), { + wrapper: appMockRenderer.AppWrapper, + }); + + act(() => { + result.current.mutate(maintenanceWindow); + }); + + await waitFor(() => + expect(mockAddDanger).toBeCalledWith('Failed to create maintenance window: Bad request') ); }); }); diff --git a/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.ts b/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.ts index 985140fddc22b..a5828da589233 100644 --- a/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.ts +++ b/x-pack/plugins/alerting/public/hooks/use_create_maintenance_window.ts @@ -13,6 +13,19 @@ import type { KibanaServerError } from '@kbn/kibana-utils-plugin/public'; import { useKibana } from '../utils/kibana_react'; import { createMaintenanceWindow, CreateParams } from '../services/maintenance_windows_api/create'; +const onErrorWithMessage = (message: string) => + i18n.translate('xpack.alerting.maintenanceWindowsCreateFailureWithMessage', { + defaultMessage: 'Failed to create maintenance window: {message}', + values: { message }, + }); + +const onErrorWithoutMessage = i18n.translate( + 'xpack.alerting.maintenanceWindowsCreateFailureWithoutMessage', + { + defaultMessage: 'Failed to create maintenance window', + } +); + interface UseCreateMaintenanceWindowProps { onError?: (error: IHttpFetchError) => void; } @@ -41,10 +54,11 @@ export function useCreateMaintenanceWindow(props?: UseCreateMaintenanceWindowPro ); }, onError: (error: IHttpFetchError) => { + const getDefaultErrorMessage = (message?: string): string => + !message ? onErrorWithoutMessage : onErrorWithMessage(message); + toasts.addDanger( - i18n.translate('xpack.alerting.maintenanceWindowsCreateFailure', { - defaultMessage: 'Failed to create maintenance window.', - }) + getDefaultErrorMessage(error.body?.statusCode === 400 ? error.body?.message : '') ); onError?.(error); }, diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.test.ts index 0a4f25d87fbbf..fb8d1bccd89c1 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.test.ts @@ -8,7 +8,11 @@ import moment from 'moment-timezone'; import { Frequency } from '@kbn/rrule'; import { archiveMaintenanceWindow } from './archive_maintenance_window'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObjectsUpdateResponse, SavedObject } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -18,6 +22,7 @@ import { getMockMaintenanceWindow } from '../../../../data/maintenance_window/te import type { MaintenanceWindow } from '../../types'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const firstTimestamp = '2023-02-26T00:00:00.000Z'; const secondTimestamp = '2023-03-26T00:00:00.000Z'; @@ -33,6 +38,7 @@ const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - archive', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/bulk_get/bulk_get_maintenance_windows.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/bulk_get/bulk_get_maintenance_windows.test.ts index 488eb14f7df27..86eee6b564b80 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/bulk_get/bulk_get_maintenance_windows.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/bulk_get/bulk_get_maintenance_windows.test.ts @@ -6,7 +6,11 @@ */ import { bulkGetMaintenanceWindows } from './bulk_get_maintenance_windows'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObject } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -15,11 +19,13 @@ import { import { getMockMaintenanceWindow } from '../../../../data/maintenance_window/test_helpers'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - get', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts index efe8a9a9477d5..57f7153bd0231 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts @@ -8,7 +8,11 @@ import moment from 'moment-timezone'; import { createMaintenanceWindow } from './create_maintenance_window'; import { CreateMaintenanceWindowParams } from './types'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObject } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -19,6 +23,7 @@ import type { MaintenanceWindow } from '../../types'; import { FilterStateStore } from '@kbn/es-query'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const updatedMetadata = { createdAt: '2023-03-26T00:00:00.000Z', @@ -31,6 +36,7 @@ const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - create', () => { @@ -223,6 +229,21 @@ describe('MaintenanceWindowClient - create', () => { ).toMatchInlineSnapshot( `"{\\"bool\\":{\\"must\\":[],\\"filter\\":[{\\"bool\\":{\\"should\\":[{\\"match\\":{\\"_id\\":\\"'1234'\\"}}],\\"minimum_should_match\\":1}},{\\"match_phrase\\":{\\"kibana.alert.action_group\\":\\"test\\"}}],\\"should\\":[],\\"must_not\\":[]}}"` ); + + expect(uiSettings.get).toHaveBeenCalledTimes(3); + expect(uiSettings.get.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + "query:allowLeadingWildcards", + ], + Array [ + "query:queryString:options", + ], + Array [ + "courier:ignoreFilterIfFieldNotInIndex", + ], + ] + `); }); it('should throw if trying to create a maintenance window with invalid scoped query', async () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts index e613a5dd5433a..97bf8747ffc90 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts @@ -9,6 +9,7 @@ import moment from 'moment'; import Boom from '@hapi/boom'; import { SavedObjectsUtils } from '@kbn/core/server'; import { buildEsQuery, Filter } from '@kbn/es-query'; +import { getEsQueryConfig } from '../../../../lib/get_es_query_config'; import { generateMaintenanceWindowEvents } from '../../lib/generate_maintenance_window_events'; import type { MaintenanceWindowClientContext } from '../../../../../common'; import { getScopedQueryErrorMessage } from '../../../../../common'; @@ -26,8 +27,9 @@ export async function createMaintenanceWindow( params: CreateMaintenanceWindowParams ): Promise { const { data } = params; - const { savedObjectsClient, getModificationMetadata, logger } = context; + const { savedObjectsClient, getModificationMetadata, logger, uiSettings } = context; const { title, duration, rRule, categoryIds, scopedQuery } = data; + const esQueryConfig = await getEsQueryConfig(uiSettings); try { createMaintenanceWindowParamsSchema.validate(params); @@ -36,15 +38,18 @@ export async function createMaintenanceWindow( } let scopedQueryWithGeneratedValue = scopedQuery; + try { if (scopedQuery) { const dsl = JSON.stringify( buildEsQuery( undefined, [{ query: scopedQuery.kql, language: 'kuery' }], - scopedQuery.filters as Filter[] + scopedQuery.filters as Filter[], + esQueryConfig ) ); + scopedQueryWithGeneratedValue = { ...scopedQuery, dsl, diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/delete/delete_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/delete/delete_maintenance_window.test.ts index 0fd75c49f91d5..50e1307bf257b 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/delete/delete_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/delete/delete_maintenance_window.test.ts @@ -6,18 +6,24 @@ */ import { deleteMaintenanceWindow } from './delete_maintenance_window'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { MaintenanceWindowClientContext, MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, } from '../../../../../common'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - delete', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/find/find_maintenance_windows.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/find/find_maintenance_windows.test.ts index 8645012406e2c..8d06b335892b9 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/find/find_maintenance_windows.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/find/find_maintenance_windows.test.ts @@ -6,7 +6,11 @@ */ import { findMaintenanceWindows } from './find_maintenance_windows'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObjectsFindResponse } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -15,11 +19,13 @@ import { import { getMockMaintenanceWindow } from '../../../../data/maintenance_window/test_helpers'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - find', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.test.ts index 0d32342355706..6fa79cdb20fcf 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.test.ts @@ -8,7 +8,11 @@ import moment from 'moment-timezone'; import { Frequency } from '@kbn/rrule'; import { finishMaintenanceWindow } from './finish_maintenance_window'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObjectsUpdateResponse, SavedObject } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -18,6 +22,7 @@ import { getMockMaintenanceWindow } from '../../../../data/maintenance_window/te import type { MaintenanceWindow } from '../../types'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const firstTimestamp = '2023-02-26T00:00:00.000Z'; @@ -32,6 +37,7 @@ const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - finish', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/get/get_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/get/get_maintenance_window.test.ts index fa24bb42e57d8..54724c6cdfdc7 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/get/get_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/get/get_maintenance_window.test.ts @@ -6,7 +6,11 @@ */ import { getMaintenanceWindow } from './get_maintenance_window'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObject } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -15,11 +19,13 @@ import { import { getMockMaintenanceWindow } from '../../../../data/maintenance_window/test_helpers'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - get', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/get_active/get_active_maintenance_windows.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/get_active/get_active_maintenance_windows.test.ts index b9a9f958b4e6a..e40a189efa163 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/get_active/get_active_maintenance_windows.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/get_active/get_active_maintenance_windows.test.ts @@ -7,7 +7,11 @@ import { getActiveMaintenanceWindows } from './get_active_maintenance_windows'; import { toElasticsearchQuery } from '@kbn/es-query'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObjectsFindResponse } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -16,11 +20,13 @@ import { import { getMockMaintenanceWindow } from '../../../../data/maintenance_window/test_helpers'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - getActiveMaintenanceWindows', () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts index 8d25930aa0784..6797b4f57d508 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts @@ -9,7 +9,11 @@ import moment from 'moment-timezone'; import { Frequency } from '@kbn/rrule'; import { updateMaintenanceWindow } from './update_maintenance_window'; import { UpdateMaintenanceWindowParams } from './types'; -import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + loggingSystemMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { SavedObject } from '@kbn/core/server'; import { MaintenanceWindowClientContext, @@ -20,6 +24,7 @@ import type { MaintenanceWindow } from '../../types'; import { FilterStateStore } from '@kbn/es-query'; const savedObjectsClient = savedObjectsClientMock.create(); +const uiSettings = uiSettingsServiceMock.createClient(); const firstTimestamp = '2023-02-26T00:00:00.000Z'; const secondTimestamp = '2023-03-26T00:00:00.000Z'; @@ -47,6 +52,7 @@ const mockContext: jest.Mocked = { logger: loggingSystemMock.create().get(), getModificationMetadata: jest.fn(), savedObjectsClient, + uiSettings, }; describe('MaintenanceWindowClient - update', () => { diff --git a/x-pack/plugins/alerting/server/lib/get_es_query_config.test.ts b/x-pack/plugins/alerting/server/lib/get_es_query_config.test.ts new file mode 100644 index 0000000000000..b74e9410da2d8 --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/get_es_query_config.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 { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; +import { getEsQueryConfig } from './get_es_query_config'; + +describe('getEsQueryConfig', () => { + const uiSettingsClient = uiSettingsServiceMock.createClient(); + + it('should get the es query config correctly', async () => { + const settings = await getEsQueryConfig(uiSettingsClient); + + expect(settings).toEqual({ + allowLeadingWildcards: false, + ignoreFilterIfFieldNotInIndex: false, + queryStringOptions: false, + }); + }); +}); diff --git a/x-pack/plugins/alerting/server/lib/get_es_query_config.ts b/x-pack/plugins/alerting/server/lib/get_es_query_config.ts new file mode 100644 index 0000000000000..2c0668371a4de --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/get_es_query_config.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 { IUiSettingsClient } from '@kbn/core/server'; +import { UI_SETTINGS } from '@kbn/data-plugin/server'; + +export async function getEsQueryConfig(uiSettings: IUiSettingsClient) { + const allowLeadingWildcards = await uiSettings.get(UI_SETTINGS.QUERY_ALLOW_LEADING_WILDCARDS); + const queryStringOptions = await uiSettings.get(UI_SETTINGS.QUERY_STRING_OPTIONS); + const ignoreFilterIfFieldNotInIndex = await uiSettings.get( + UI_SETTINGS.COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX + ); + + return { + allowLeadingWildcards, + queryStringOptions, + ignoreFilterIfFieldNotInIndex, + }; +} diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts b/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts index 2bbbacad73a9e..60954d6d0a6d3 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/maintenance_window_client.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { Logger, SavedObjectsClientContract } from '@kbn/core/server'; +import { IUiSettingsClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; import { createMaintenanceWindow } from '../application/maintenance_window/methods/create/create_maintenance_window'; import type { CreateMaintenanceWindowParams } from '../application/maintenance_window/methods/create/types'; @@ -33,6 +33,7 @@ import { import type { MaintenanceWindow } from '../application/maintenance_window/types'; export interface MaintenanceWindowClientConstructorOptions { + readonly uiSettings: IUiSettingsClient; readonly logger: Logger; readonly savedObjectsClient: SavedObjectsClientContract; readonly getUserName: () => Promise; @@ -52,6 +53,7 @@ export class MaintenanceWindowClient { logger: this.logger, savedObjectsClient: this.savedObjectsClient, getModificationMetadata: this.getModificationMetadata.bind(this), + uiSettings: options.uiSettings, }; } diff --git a/x-pack/plugins/alerting/server/maintenance_window_client_factory.test.ts b/x-pack/plugins/alerting/server/maintenance_window_client_factory.test.ts index a1ec0a351729c..e25fcc34a46cc 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client_factory.test.ts @@ -13,6 +13,7 @@ import { savedObjectsClientMock, savedObjectsServiceMock, loggingSystemMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { AuthenticatedUser } from '@kbn/security-plugin/common'; import { securityMock } from '@kbn/security-plugin/server/mocks'; @@ -23,12 +24,13 @@ jest.mock('./maintenance_window_client'); const savedObjectsClient = savedObjectsClientMock.create(); const savedObjectsService = savedObjectsServiceMock.createInternalStartContract(); - const securityPluginStart = securityMock.createStart(); +const uiSettings = uiSettingsServiceMock.createStartContract(); const maintenanceWindowClientFactoryParams: jest.Mocked = { logger: loggingSystemMock.create().get(), savedObjectsService, + uiSettings, }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/maintenance_window_client_factory.ts b/x-pack/plugins/alerting/server/maintenance_window_client_factory.ts index 8363cfad5a7f7..4e040f50ec3ca 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client_factory.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client_factory.ts @@ -10,6 +10,7 @@ import { Logger, SavedObjectsServiceStart, SECURITY_EXTENSION_ID, + UiSettingsServiceStart, } from '@kbn/core/server'; import { SecurityPluginStart } from '@kbn/security-plugin/server'; import { MaintenanceWindowClient } from './maintenance_window_client'; @@ -19,6 +20,7 @@ export interface MaintenanceWindowClientFactoryOpts { logger: Logger; savedObjectsService: SavedObjectsServiceStart; securityPluginStart?: SecurityPluginStart; + uiSettings: UiSettingsServiceStart; } export class MaintenanceWindowClientFactory { @@ -26,6 +28,7 @@ export class MaintenanceWindowClientFactory { private logger!: Logger; private savedObjectsService!: SavedObjectsServiceStart; private securityPluginStart?: SecurityPluginStart; + private uiSettings!: UiSettingsServiceStart; public initialize(options: MaintenanceWindowClientFactoryOpts) { if (this.isInitialized) { @@ -35,6 +38,7 @@ export class MaintenanceWindowClientFactory { this.logger = options.logger; this.savedObjectsService = options.savedObjectsService; this.securityPluginStart = options.securityPluginStart; + this.uiSettings = options.uiSettings; } private createMaintenanceWindowClient(request: KibanaRequest, withAuth: boolean) { @@ -44,9 +48,12 @@ export class MaintenanceWindowClientFactory { ...(withAuth ? {} : { excludedExtensions: [SECURITY_EXTENSION_ID] }), }); + const uiSettingClient = this.uiSettings.asScopedToClient(savedObjectsClient); + return new MaintenanceWindowClient({ logger: this.logger, savedObjectsClient, + uiSettings: uiSettingClient, async getUserName() { if (!securityPluginStart || !request) { return null; diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index 401256f9f8013..884fa761526ea 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -556,6 +556,7 @@ export class AlertingPlugin { logger: this.logger, savedObjectsService: core.savedObjects, securityPluginStart: plugins.security, + uiSettings: core.uiSettings, }); const getRulesClientWithRequest = (request: KibanaRequest) => { diff --git a/x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap b/x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap deleted file mode 100644 index bfb8efef24896..0000000000000 --- a/x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`addGeneratedActionValues() throws error if KQL is not valid: "Error creating DSL query: invalid KQL" 1`] = `"Error creating DSL query: invalid KQL"`; diff --git a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts index ac58ab1a12685..9c6dda227b078 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts @@ -32,14 +32,16 @@ describe('addGeneratedActionValues()', () => { const taskManager = taskManagerMock.createStart(); const ruleTypeRegistry = ruleTypeRegistryMock.create(); const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); - const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); - const kibanaVersion = 'v7.10.0'; const logger = loggingSystemMock.create().get(); + const uiSettings = uiSettingsServiceMock.createStartContract(); + const uiSettingsClient = uiSettingsServiceMock.createClient(); + + uiSettings.asScopedToClient.mockReturnValue(uiSettingsClient); const rulesClientParams: jest.Mocked = { taskManager, @@ -64,7 +66,7 @@ describe('addGeneratedActionValues()', () => { getAlertIndicesAlias: jest.fn(), alertsService: null, backfillClient: backfillClientMock.create(), - uiSettings: uiSettingsServiceMock.createStartContract(), + uiSettings, connectorAdapterRegistry: new ConnectorAdapterRegistry(), isSystemAction: jest.fn(), }; @@ -103,6 +105,10 @@ describe('addGeneratedActionValues()', () => { params: {}, }; + beforeEach(() => { + jest.clearAllMocks(); + }); + test('adds uuid', async () => { const actionWithGeneratedValues = await addGeneratedActionValues( [mockAction], @@ -145,6 +151,21 @@ describe('addGeneratedActionValues()', () => { params: {}, uuid: '111-222', }); + + expect(uiSettingsClient.get).toHaveBeenCalledTimes(3); + expect(uiSettingsClient.get.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + "query:allowLeadingWildcards", + ], + Array [ + "query:queryString:options", + ], + Array [ + "courier:ignoreFilterIfFieldNotInIndex", + ], + ] + `); }); test('throws error if KQL is not valid', async () => { @@ -156,6 +177,7 @@ describe('addGeneratedActionValues()', () => { alertsFilter: { query: { kql: 'foo:bar:1', filters: [] } }, }, ], + [mockSystemAction], { ...rulesClientParams, @@ -163,6 +185,12 @@ describe('addGeneratedActionValues()', () => { minimumScheduleIntervalInMs: 0, } ) - ).rejects.toThrowErrorMatchingSnapshot('"Error creating DSL query: invalid KQL"'); + ).rejects.toThrowErrorMatchingInlineSnapshot( + ` + "Invalid KQL: Expected AND, OR, end of input but \\":\\" found. + foo:bar:1 + -------^" + ` + ); }); }); diff --git a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts index d50e773d880a0..31e97df2d1705 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts @@ -8,7 +8,6 @@ import { v4 } from 'uuid'; import { buildEsQuery, Filter } from '@kbn/es-query'; import Boom from '@hapi/boom'; -import { UI_SETTINGS } from '@kbn/data-plugin/common'; import { NormalizedAlertAction, NormalizedAlertDefaultActionWithGeneratedValues, @@ -16,6 +15,7 @@ import { NormalizedSystemAction, RulesClientContext, } from '..'; +import { getEsQueryConfig } from '../../lib/get_es_query_config'; export async function addGeneratedActionValues( actions: NormalizedAlertAction[] = [], @@ -26,24 +26,15 @@ export async function addGeneratedActionValues( systemActions: NormalizedAlertSystemActionWithGeneratedValues[]; }> { const uiSettingClient = context.uiSettings.asScopedToClient(context.unsecuredSavedObjectsClient); - const [allowLeadingWildcards, queryStringOptions, ignoreFilterIfFieldNotInIndex] = - await Promise.all([ - uiSettingClient.get(UI_SETTINGS.QUERY_ALLOW_LEADING_WILDCARDS), - uiSettingClient.get(UI_SETTINGS.QUERY_STRING_OPTIONS), - uiSettingClient.get(UI_SETTINGS.COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX), - ]); - const esQueryConfig = { - allowLeadingWildcards, - queryStringOptions, - ignoreFilterIfFieldNotInIndex, - }; + const esQueryConfig = await getEsQueryConfig(uiSettingClient); + const generateDSL = (kql: string, filters: Filter[]): string => { try { return JSON.stringify( buildEsQuery(undefined, [{ query: kql, language: 'kuery' }], filters, esQueryConfig) ); } catch (e) { - throw Boom.badRequest(`Error creating DSL query: invalid KQL`); + throw Boom.badRequest(`Invalid KQL: ${e.message}`); } }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 8c5b395bdd3f3..5493da4a52b6f 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -8567,7 +8567,6 @@ "xpack.alerting.maintenanceWindows.upcoming": "À venir", "xpack.alerting.maintenanceWindowsArchiveFailure": "Impossible d'archiver la fenêtre de maintenance.", "xpack.alerting.maintenanceWindowsArchiveSuccess": "Fenêtre de maintenance archivée \"{title}\"", - "xpack.alerting.maintenanceWindowsCreateFailure": "Impossible de créer la fenêtre de maintenance.", "xpack.alerting.maintenanceWindowsCreateSuccess": "Fenêtre de maintenance créée \"{title}\"", "xpack.alerting.maintenanceWindowsFinishedAndArchiveFailure": "Impossible d'annuler et d'archiver la fenêtre de maintenance.", "xpack.alerting.maintenanceWindowsFinishedAndArchiveSuccess": "Fenêtre de maintenance en cours d'exécution annulée et archivée \"{title}\"", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 48a3eefcb30ec..e1691ae0ab930 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8554,7 +8554,6 @@ "xpack.alerting.maintenanceWindows.upcoming": "予定", "xpack.alerting.maintenanceWindowsArchiveFailure": "保守時間枠をアーカイブできませんでした。", "xpack.alerting.maintenanceWindowsArchiveSuccess": "アーカイブされた保守時間枠'{title}'", - "xpack.alerting.maintenanceWindowsCreateFailure": "保守時間枠を作成できませんでした。", "xpack.alerting.maintenanceWindowsCreateSuccess": "作成された保守時間枠'{title}'", "xpack.alerting.maintenanceWindowsFinishedAndArchiveFailure": "保守時間枠をキャンセルしてアーカイブできませんでした。", "xpack.alerting.maintenanceWindowsFinishedAndArchiveSuccess": "キャンセルされ、アーカイブされた実行中の保守時間枠'{title}'", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index abaaacf435a14..70c4740f38375 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8571,7 +8571,6 @@ "xpack.alerting.maintenanceWindows.upcoming": "即将发生", "xpack.alerting.maintenanceWindowsArchiveFailure": "无法归档维护窗口。", "xpack.alerting.maintenanceWindowsArchiveSuccess": "已归档维护窗口“{title}”", - "xpack.alerting.maintenanceWindowsCreateFailure": "无法创建维护窗口。", "xpack.alerting.maintenanceWindowsCreateSuccess": "已创建维护窗口“{title}”", "xpack.alerting.maintenanceWindowsFinishedAndArchiveFailure": "无法取消并归档维护窗口。", "xpack.alerting.maintenanceWindowsFinishedAndArchiveSuccess": "已取消并归档正在运行的维护窗口“{title}”", From 9e2b401f2c4c315e0b9b037221d7864cf195f321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Wed, 29 May 2024 11:36:59 +0100 Subject: [PATCH 07/95] [Stateful sidenav] Register observabilty nav from inside plugin (#184215) --- .github/CODEOWNERS | 1 - package.json | 1 - packages/solution-nav/oblt/README.md | 3 - packages/solution-nav/oblt/index.ts | 9 --- packages/solution-nav/oblt/jest.config.js | 13 ---- packages/solution-nav/oblt/kibana.jsonc | 8 --- packages/solution-nav/oblt/package.json | 6 -- packages/solution-nav/oblt/tsconfig.json | 22 ------- src/plugins/navigation/public/plugin.test.ts | 44 ------------- src/plugins/navigation/public/plugin.tsx | 17 +---- src/plugins/navigation/tsconfig.json | 1 - tsconfig.base.json | 2 - .../observability/kibana.jsonc | 3 +- .../observability/public/navigation_tree.ts | 62 ++++++++++--------- .../observability/public/plugin.ts | 7 ++- .../observability/tsconfig.json | 2 + yarn.lock | 4 -- 17 files changed, 44 insertions(+), 161 deletions(-) delete mode 100644 packages/solution-nav/oblt/README.md delete mode 100644 packages/solution-nav/oblt/index.ts delete mode 100644 packages/solution-nav/oblt/jest.config.js delete mode 100644 packages/solution-nav/oblt/kibana.jsonc delete mode 100644 packages/solution-nav/oblt/package.json delete mode 100644 packages/solution-nav/oblt/tsconfig.json rename packages/solution-nav/oblt/definition.ts => x-pack/plugins/observability_solution/observability/public/navigation_tree.ts (82%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7bb36681643aa..479cf4473b1d3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -819,7 +819,6 @@ packages/kbn-shared-ux-utility @elastic/appex-sharedux x-pack/plugins/observability_solution/slo @elastic/obs-ux-management-team x-pack/packages/kbn-slo-schema @elastic/obs-ux-management-team x-pack/plugins/snapshot_restore @elastic/kibana-management -packages/solution-nav/oblt @elastic/appex-sharedux @elastic/obs-ux-management-team packages/kbn-some-dev-log @elastic/kibana-operations packages/kbn-sort-package-json @elastic/kibana-operations packages/kbn-sort-predicates @elastic/kibana-visualizations diff --git a/package.json b/package.json index cea7de2e2023f..83a1ff90c7f12 100644 --- a/package.json +++ b/package.json @@ -822,7 +822,6 @@ "@kbn/slo-plugin": "link:x-pack/plugins/observability_solution/slo", "@kbn/slo-schema": "link:x-pack/packages/kbn-slo-schema", "@kbn/snapshot-restore-plugin": "link:x-pack/plugins/snapshot_restore", - "@kbn/solution-nav-oblt": "link:packages/solution-nav/oblt", "@kbn/sort-predicates": "link:packages/kbn-sort-predicates", "@kbn/spaces-plugin": "link:x-pack/plugins/spaces", "@kbn/spaces-test-plugin": "link:x-pack/test/spaces_api_integration/common/plugins/spaces_test_plugin", diff --git a/packages/solution-nav/oblt/README.md b/packages/solution-nav/oblt/README.md deleted file mode 100644 index c01cf9968c143..0000000000000 --- a/packages/solution-nav/oblt/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @kbn/solution-nav-oblt - -## This package contains the navigation definition for the Observability solution in Kibana stateful. \ No newline at end of file diff --git a/packages/solution-nav/oblt/index.ts b/packages/solution-nav/oblt/index.ts deleted file mode 100644 index 8024948fb3cd1..0000000000000 --- a/packages/solution-nav/oblt/index.ts +++ /dev/null @@ -1,9 +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 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. - */ - -export { definition } from './definition'; diff --git a/packages/solution-nav/oblt/jest.config.js b/packages/solution-nav/oblt/jest.config.js deleted file mode 100644 index 35039f0fc7cd6..0000000000000 --- a/packages/solution-nav/oblt/jest.config.js +++ /dev/null @@ -1,13 +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 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. - */ - -module.exports = { - preset: '@kbn/test', - rootDir: '../../..', - roots: ['/packages/solution-nav/oblt'], -}; diff --git a/packages/solution-nav/oblt/kibana.jsonc b/packages/solution-nav/oblt/kibana.jsonc deleted file mode 100644 index 52c80e0a93c87..0000000000000 --- a/packages/solution-nav/oblt/kibana.jsonc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "shared-common", - "id": "@kbn/solution-nav-oblt", - "owner": [ - "@elastic/appex-sharedux", - "@elastic/obs-ux-management-team" - ] -} diff --git a/packages/solution-nav/oblt/package.json b/packages/solution-nav/oblt/package.json deleted file mode 100644 index e8985b19e9c63..0000000000000 --- a/packages/solution-nav/oblt/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@kbn/solution-nav-oblt", - "private": true, - "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" -} \ No newline at end of file diff --git a/packages/solution-nav/oblt/tsconfig.json b/packages/solution-nav/oblt/tsconfig.json deleted file mode 100644 index 0b379d8cbe17f..0000000000000 --- a/packages/solution-nav/oblt/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../../tsconfig.base.json", - "compilerOptions": { - "outDir": "target/types", - "types": [ - "jest", - "node", - "react" - ] - }, - "include": [ - "**/*.ts", - "**/*.tsx", - ], - "exclude": [ - "target/**/*" - ], - "kbn_references": [ - "@kbn/core-chrome-browser", - "@kbn/i18n", - ], -} diff --git a/src/plugins/navigation/public/plugin.test.ts b/src/plugins/navigation/public/plugin.test.ts index 6733a54cdc18b..9a94b3ba9ac1f 100644 --- a/src/plugins/navigation/public/plugin.test.ts +++ b/src/plugins/navigation/public/plugin.test.ts @@ -120,50 +120,6 @@ describe('Navigation Plugin', () => { describe('feature flag enabled', () => { const featureOn = true; - it('should add the default solution navs but **not** set the active nav', async () => { - const uiSettingsValues: Record = { - [ENABLE_SOLUTION_NAV_UI_SETTING_ID]: false, // NOT enabled, so we should not set the active nav - }; - - const { plugin, coreStart, unifiedSearch, cloud, cloudExperiments } = setup( - { - featureOn, - }, - { uiSettingsValues } - ); - - plugin.start(coreStart, { unifiedSearch, cloud, cloudExperiments }); - - // We need to wait for the next tick to allow the promise to fetch the feature flag to resolve - await new Promise((resolve) => setTimeout(resolve)); - - expect(coreStart.chrome.project.updateSolutionNavigations).toHaveBeenCalled(); - const [arg] = coreStart.chrome.project.updateSolutionNavigations.mock.calls[0]; - expect(Object.keys(arg)).toEqual(['oblt']); - - expect(coreStart.chrome.project.changeActiveSolutionNavigation).toHaveBeenCalledWith(null); - }); - - it('should add the default solution navs **and** set the active nav', async () => { - const uiSettingsValues: Record = { - [ENABLE_SOLUTION_NAV_UI_SETTING_ID]: true, - }; - - const { plugin, coreStart, unifiedSearch, cloud, cloudExperiments } = setup( - { featureOn, defaultSolution: 'security' }, - { uiSettingsValues } - ); - - plugin.start(coreStart, { unifiedSearch, cloud, cloudExperiments }); - await new Promise((resolve) => setTimeout(resolve)); - - expect(coreStart.chrome.project.updateSolutionNavigations).toHaveBeenCalled(); - - expect(coreStart.chrome.project.changeActiveSolutionNavigation).toHaveBeenCalledWith( - 'security' - ); - }); - it('should add the opt in/out toggle in the user menu', async () => { const uiSettingsValues: Record = { [ENABLE_SOLUTION_NAV_UI_SETTING_ID]: true, diff --git a/src/plugins/navigation/public/plugin.tsx b/src/plugins/navigation/public/plugin.tsx index 2a36bc8e980ed..ecc7b724fae45 100644 --- a/src/plugins/navigation/public/plugin.tsx +++ b/src/plugins/navigation/public/plugin.tsx @@ -25,12 +25,8 @@ import { import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import type { SecurityPluginStart, UserMenuLink } from '@kbn/security-plugin/public'; -import type { - SolutionNavigationDefinition, - SolutionNavigationDefinitions, -} from '@kbn/core-chrome-browser'; +import type { SolutionNavigationDefinition } from '@kbn/core-chrome-browser'; import { InternalChromeStart } from '@kbn/core-chrome-browser-internal'; -import { definition as obltDefinition } from '@kbn/solution-nav-oblt'; import type { PanelContentProvider } from '@kbn/shared-ux-chrome-navigation'; import { UserProfileData } from '@kbn/user-profile-components'; import { ENABLE_SOLUTION_NAV_UI_SETTING_ID, SOLUTION_NAV_FEATURE_FLAG_NAME } from '../common'; @@ -177,7 +173,6 @@ export class NavigationPublicPlugin if (!isEnabled) return; chrome.project.setCloudUrls(cloud!); - this.addDefaultSolutionNavigation({ chrome }); this.susbcribeToSolutionNavUiSettings({ core, security, defaultSolution }); }); @@ -268,16 +263,6 @@ export class NavigationPublicPlugin }); } - private addDefaultSolutionNavigation({ chrome }: { chrome: InternalChromeStart }) { - const solutionNavs: SolutionNavigationDefinitions = { - oblt: { - ...obltDefinition, - sideNavComponent: this.getSideNavComponent({ dataTestSubj: 'observabilitySideNav' }), - }, - }; - chrome.project.updateSolutionNavigations(solutionNavs, true); - } - private addOptInOutUserProfile({ core, security, diff --git a/src/plugins/navigation/tsconfig.json b/src/plugins/navigation/tsconfig.json index 8e96cf02c92ba..838e10016a910 100644 --- a/src/plugins/navigation/tsconfig.json +++ b/src/plugins/navigation/tsconfig.json @@ -24,7 +24,6 @@ "@kbn/config-schema", "@kbn/core-plugins-server", "@kbn/i18n", - "@kbn/solution-nav-oblt", "@kbn/config", "@kbn/security-plugin", "@kbn/user-profile-components", diff --git a/tsconfig.base.json b/tsconfig.base.json index 923d6dcb38c39..12d8ad5d63ae1 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1632,8 +1632,6 @@ "@kbn/slo-schema/*": ["x-pack/packages/kbn-slo-schema/*"], "@kbn/snapshot-restore-plugin": ["x-pack/plugins/snapshot_restore"], "@kbn/snapshot-restore-plugin/*": ["x-pack/plugins/snapshot_restore/*"], - "@kbn/solution-nav-oblt": ["packages/solution-nav/oblt"], - "@kbn/solution-nav-oblt/*": ["packages/solution-nav/oblt/*"], "@kbn/some-dev-log": ["packages/kbn-some-dev-log"], "@kbn/some-dev-log/*": ["packages/kbn-some-dev-log/*"], "@kbn/sort-package-json": ["packages/kbn-sort-package-json"], diff --git a/x-pack/plugins/observability_solution/observability/kibana.jsonc b/x-pack/plugins/observability_solution/observability/kibana.jsonc index 4ba6b81ce8881..997b6196def4b 100644 --- a/x-pack/plugins/observability_solution/observability/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability/kibana.jsonc @@ -39,7 +39,8 @@ "dashboard", "expressions", "logsExplorer", - "licensing" + "licensing", + "navigation" ], "optionalPlugins": [ "discover", diff --git a/packages/solution-nav/oblt/definition.ts b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts similarity index 82% rename from packages/solution-nav/oblt/definition.ts rename to x-pack/plugins/observability_solution/observability/public/navigation_tree.ts index d8721e52a28db..aa627c89d3825 100644 --- a/packages/solution-nav/oblt/definition.ts +++ b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts @@ -1,20 +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. + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. */ import { i18n } from '@kbn/i18n'; -import type { - NavigationTreeDefinition, - SolutionNavigationDefinition, -} from '@kbn/core-chrome-browser'; +import type { NavigationTreeDefinition } from '@kbn/core-chrome-browser'; +import type { AddSolutionNavigationArg } from '@kbn/navigation-plugin/public'; import { of } from 'rxjs'; -const title = i18n.translate('navigation.obltNav.headerSolutionSwitcher.obltSolutionTitle', { - defaultMessage: 'Observability', -}); +const title = i18n.translate( + 'xpack.observability.obltNav.headerSolutionSwitcher.obltSolutionTitle', + { + defaultMessage: 'Observability', + } +); const icon = 'logoObservability'; const navTree: NavigationTreeDefinition = { @@ -67,14 +67,14 @@ const navTree: NavigationTreeDefinition = { }, { id: 'aiMl', - title: i18n.translate('navigation.obltNav.ml.aiAndMlGroupTitle', { + title: i18n.translate('xpack.observability.obltNav.ml.aiAndMlGroupTitle', { defaultMessage: 'AI & ML', }), renderAs: 'accordion', children: [ { link: 'observabilityAIAssistant', - title: i18n.translate('navigation.obltNav.aiMl.aiAssistant', { + title: i18n.translate('xpack.observability.obltNav.aiMl.aiAssistant', { defaultMessage: 'AI Assistant', }), }, @@ -94,7 +94,7 @@ const navTree: NavigationTreeDefinition = { ], }, { - title: i18n.translate('navigation.obltNav.ml.logRateAnalysis', { + title: i18n.translate('xpack.observability.obltNav.ml.logRateAnalysis', { defaultMessage: 'Log rate analysis', }), link: 'ml:logRateAnalysis', @@ -109,7 +109,7 @@ const navTree: NavigationTreeDefinition = { link: 'logs:log-categories', }, { - title: i18n.translate('navigation.obltNav.ml.changePointDetection', { + title: i18n.translate('xpack.observability.obltNav.ml.changePointDetection', { defaultMessage: 'Change point detection', }), link: 'ml:changePointDetections', @@ -118,7 +118,7 @@ const navTree: NavigationTreeDefinition = { }, }, { - title: i18n.translate('navigation.obltNav.ml.job.notifications', { + title: i18n.translate('xpack.observability.obltNav.ml.job.notifications', { defaultMessage: 'Job notifications', }), link: 'ml:notifications', @@ -127,7 +127,7 @@ const navTree: NavigationTreeDefinition = { }, { id: 'apm', - title: i18n.translate('navigation.obltNav.applications', { + title: i18n.translate('xpack.observability.obltNav.applications', { defaultMessage: 'Applications', }), renderAs: 'accordion', @@ -153,14 +153,14 @@ const navTree: NavigationTreeDefinition = { }, { id: 'synthetics', - title: i18n.translate('navigation.obltNav.apm.syntheticsGroupTitle', { + title: i18n.translate('xpack.observability.obltNav.apm.syntheticsGroupTitle', { defaultMessage: 'Synthetics', }), renderAs: 'accordion', children: [ { link: 'synthetics', - title: i18n.translate('navigation.obltNav.apm.synthetics.monitors', { + title: i18n.translate('xpack.observability.obltNav.apm.synthetics.monitors', { defaultMessage: 'Monitors', }), }, @@ -172,7 +172,7 @@ const navTree: NavigationTreeDefinition = { }, { id: 'metrics', - title: i18n.translate('navigation.obltNav.infrastructure', { + title: i18n.translate('xpack.observability.obltNav.infrastructure', { defaultMessage: 'Infrastructure', }), renderAs: 'accordion', @@ -194,9 +194,12 @@ const navTree: NavigationTreeDefinition = { }, { id: 'profiling', - title: i18n.translate('navigation.obltNav.infrastructure.universalProfiling', { - defaultMessage: 'Universal Profiling', - }), + title: i18n.translate( + 'xpack.observability.obltNav.infrastructure.universalProfiling', + { + defaultMessage: 'Universal Profiling', + } + ), renderAs: 'accordion', children: [ { @@ -214,14 +217,14 @@ const navTree: NavigationTreeDefinition = { }, { id: 'otherTools', - title: i18n.translate('navigation.obltNav.otherTools', { + title: i18n.translate('xpack.observability.obltNav.otherTools', { defaultMessage: 'Other tools', }), renderAs: 'accordion', children: [ { link: 'logs:stream', - title: i18n.translate('navigation.obltNav.otherTools.logsStream', { + title: i18n.translate('xpack.observability.obltNav.otherTools.logsStream', { defaultMessage: 'Logs stream', }), }, @@ -234,7 +237,7 @@ const navTree: NavigationTreeDefinition = { { type: 'recentlyAccessed' }, { type: 'navItem', - title: i18n.translate('navigation.obltNav.getStarted', { + title: i18n.translate('xpack.observability.obltNav.getStarted', { defaultMessage: 'Get started', }), link: 'observabilityOnboarding', @@ -243,7 +246,7 @@ const navTree: NavigationTreeDefinition = { { type: 'navItem', id: 'devTools', - title: i18n.translate('navigation.obltNav.devTools', { + title: i18n.translate('xpack.observability.obltNav.devTools', { defaultMessage: 'Developer tools', }), link: 'dev_tools', @@ -252,7 +255,7 @@ const navTree: NavigationTreeDefinition = { { type: 'navGroup', id: 'project_settings_project_nav', - title: i18n.translate('navigation.obltNav.management', { + title: i18n.translate('xpack.observability.obltNav.management', { defaultMessage: 'Management', }), icon: 'gear', @@ -260,7 +263,7 @@ const navTree: NavigationTreeDefinition = { children: [ { link: 'management', - title: i18n.translate('navigation.obltNav.stackManagement', { + title: i18n.translate('xpack.observability.obltNav.stackManagement', { defaultMessage: 'Stack Management', }), renderAs: 'panelOpener', @@ -345,10 +348,11 @@ const navTree: NavigationTreeDefinition = { ], }; -export const definition: SolutionNavigationDefinition = { +export const definition: AddSolutionNavigationArg = { id: 'oblt', title, icon: 'logoObservability', homePage: 'observabilityOnboarding', navigationTree$: of(navTree), + dataTestSubj: 'observabilitySideNav', }; diff --git a/x-pack/plugins/observability_solution/observability/public/plugin.ts b/x-pack/plugins/observability_solution/observability/public/plugin.ts index 5fe41bf5f1336..ae2fb27aef374 100644 --- a/x-pack/plugins/observability_solution/observability/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability/public/plugin.ts @@ -66,7 +66,7 @@ import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/publi import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; import type { UiActionsStart, UiActionsSetup } from '@kbn/ui-actions-plugin/public'; - +import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import { DataViewFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; import { observabilityAppId, observabilityFeatureId } from '../common'; @@ -142,6 +142,7 @@ export interface ObservabilityPublicPluginsStart { guidedOnboarding?: GuidedOnboardingPluginStart; lens: LensPublicStart; licensing: LicensingPluginStart; + navigation: NavigationPublicPluginStart; observabilityShared: ObservabilitySharedPluginStart; observabilityAIAssistant?: ObservabilityAIAssistantPublicStart; ruleTypeRegistry: RuleTypeRegistryContract; @@ -460,6 +461,10 @@ export class Plugin updater$: this.appUpdater$, }); + import('./navigation_tree').then(({ definition }) => { + return pluginsStart.navigation.addSolutionNavigation(definition); + }); + return { config, observabilityRuleTypeRegistry: this.observabilityRuleTypeRegistry, diff --git a/x-pack/plugins/observability_solution/observability/tsconfig.json b/x-pack/plugins/observability_solution/observability/tsconfig.json index 5a0ddfd8678c0..84ef4bc7eee11 100644 --- a/x-pack/plugins/observability_solution/observability/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability/tsconfig.json @@ -101,6 +101,8 @@ "@kbn/alerting-comparators", "@kbn/react-kibana-context-render", "@kbn/react-kibana-mount", + "@kbn/core-chrome-browser", + "@kbn/navigation-plugin", ], "exclude": [ "target/**/*" diff --git a/yarn.lock b/yarn.lock index a998dbdc4cdaf..38f897f6dbf58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6299,10 +6299,6 @@ version "0.0.0" uid "" -"@kbn/solution-nav-oblt@link:packages/solution-nav/oblt": - version "0.0.0" - uid "" - "@kbn/some-dev-log@link:packages/kbn-some-dev-log": version "0.0.0" uid "" From 75e0b3bc477ecf4359e7284e9d72bffced499999 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Wed, 29 May 2024 12:24:08 +0100 Subject: [PATCH 08/95] [Security Solution][Detection Engine] enables Cypress and FTR tests for ES|QL rule type on serverless (#182789) ## Summary - addresses https://github.com/elastic/kibana/issues/181937 - enables Cypress and FTR tests for ES|QL rule type on serverless - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed Cypress ES|QL tests(x100): https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5881 FTR(x100): https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5875 --- .../execution_logic/esql.ts | 9 +++-- .../rule_creation/esql_rule_serverless.cy.ts | 38 ------------------- .../rule_details/esql_rule.cy.ts | 2 +- 3 files changed, 7 insertions(+), 42 deletions(-) delete mode 100644 x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_serverless.cy.ts diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts index 75ae7652df962..1bdf089844746 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql.ts @@ -37,6 +37,9 @@ export default ({ getService }: FtrProviderContext) => { const es = getService('es'); const log = getService('log'); const kibanaServer = getService('kibanaServer'); + const config = getService('config'); + const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username'); + const { indexEnhancedDocuments, indexListOfDocuments, indexGeneratedDocuments } = dataGeneratorFactory({ es, @@ -49,7 +52,7 @@ export default ({ getService }: FtrProviderContext) => { */ const internalIdPipe = (id: string) => `| where id=="${id}"`; - describe('@ess ES|QL rule type', () => { + describe('@ess @serverless ES|QL rule type', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/security_solution/ecs_compliant'); }); @@ -137,7 +140,7 @@ export default ({ getService }: FtrProviderContext) => { 'kibana.alert.risk_score': 55, 'kibana.alert.rule.actions': [], 'kibana.alert.rule.author': [], - 'kibana.alert.rule.created_by': 'elastic', + 'kibana.alert.rule.created_by': ELASTICSEARCH_USERNAME, 'kibana.alert.rule.description': 'Detecting root and admin users', 'kibana.alert.rule.enabled': true, 'kibana.alert.rule.exceptions_list': [], @@ -154,7 +157,7 @@ export default ({ getService }: FtrProviderContext) => { 'kibana.alert.rule.threat': [], 'kibana.alert.rule.to': 'now', 'kibana.alert.rule.type': 'esql', - 'kibana.alert.rule.updated_by': 'elastic', + 'kibana.alert.rule.updated_by': ELASTICSEARCH_USERNAME, 'kibana.alert.rule.version': 1, 'kibana.alert.workflow_tags': [], 'kibana.alert.workflow_assignee_ids': [], diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_serverless.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_serverless.cy.ts deleted file mode 100644 index 95e95ca5e1439..0000000000000 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_serverless.cy.ts +++ /dev/null @@ -1,38 +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 { getEsqlRule } from '../../../../objects/rule'; - -import { ESQL_TYPE, NEW_TERMS_TYPE, THRESHOLD_TYPE } from '../../../../screens/create_new_rule'; - -import { login } from '../../../../tasks/login'; -import { visit } from '../../../../tasks/navigation'; - -import { CREATE_RULE_URL } from '../../../../urls/navigation'; -import { createRule } from '../../../../tasks/api_calls/rules'; - -describe('Detection ES|QL rules, creation', { tags: ['@serverless'] }, () => { - beforeEach(() => { - login(); - }); - - it('should display ES|QL rule on form', function () { - visit(CREATE_RULE_URL); - - // ensure, page is loaded and rule types are displayed - cy.get(NEW_TERMS_TYPE).should('be.visible'); - cy.get(THRESHOLD_TYPE).should('be.visible'); - - cy.get(ESQL_TYPE).should('exist'); - }); - - it('allow creation rule by API call', function () { - createRule(getEsqlRule()).then((response) => { - expect(response.status).to.equal(200); - }); - }); -}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/esql_rule.cy.ts index f4e10fa690fa6..54f78ba7ac383 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/esql_rule.cy.ts @@ -24,7 +24,7 @@ import { visit } from '../../../../tasks/navigation'; import { ruleDetailsUrl } from '../../../../urls/rule_details'; -describe('Detection ES|QL rules, details view', { tags: ['@ess'] }, () => { +describe('Detection ES|QL rules, details view', { tags: ['@ess', '@serverless'] }, () => { const rule = getEsqlRule(); beforeEach(() => { From 6f7f1338061e3d9549877b729940cd697bfb2c03 Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Wed, 29 May 2024 14:13:39 +0200 Subject: [PATCH 09/95] [Dataset Quality]Add logic to display degraded fields in DQ Flyout (#183934) ## Summary Closes https://github.com/elastic/kibana/issues/172265 ## Description This PR adds the Degraded Fields Table to the Dataset Quality Flyout for individual Data Stream. Following tasks were done as part of this PR 1. A new server side endpoint created which queries the `datastream` directly and aggregates `_ignored` fields for that data stream during the given time range and also adds a sub aggregation for last occurence. 2. On the UI Side, the table was added with 3 columns as mentioned in the Original ticket - Field, Count and Last Occurrence 3. The UI currently supports clients side sorting and pagination. We can move this to server side pagination sorting if required in the future. 4. The Flyout also supports sync with the URL which means user can navigate to the Dataset Quality page where the flyout would be open and Sorting and Pagination would be pre-applied 5. API Tests 6. Stateful and Serverless FTR tests ## Screenshot image ## Scenario 1. Spin up a 8.14-snapshot instance 2. Ingest degraded docs 3. Upgrade to 8.15-snapshot 4. Open Data Set Quality Flyout and see how the page looks like image --- .../dataset_quality/common/api_types.ts | 16 +- .../dataset_quality/common/constants.ts | 5 + .../common/data_stream_details/errors.ts | 14 + .../common/data_stream_details/index.ts | 8 + .../common/data_streams_stats/types.ts | 28 +- .../dataset_quality/common/es_fields/index.ts | 1 + .../dataset_quality/common/translations.ts | 28 + .../dataset_quality/common/types/index.ts | 2 + .../flyout/degraded_fields/columns.tsx | 52 ++ .../degraded_fields/degraded_fields.tsx | 25 + .../flyout/degraded_fields/table.tsx | 54 ++ .../flyout/flyout_summary/flyout_summary.tsx | 5 + .../public/controller/public_state.ts | 16 +- .../public/controller/types.ts | 15 +- .../dataset_quality/public/hooks/index.ts | 1 + .../use_dataset_quality_degraded_field.ts | 75 ++ .../hooks/use_dataset_quality_table.tsx | 10 +- .../data_stream_details_client.ts | 42 +- .../services/data_stream_details/types.ts | 5 + .../src/defaults.ts | 15 +- .../src/state_machine.ts | 104 ++- .../dataset_quality_controller/src/types.ts | 31 +- .../data_streams/get_degraded_fields/index.ts | 68 ++ .../server/routes/data_streams/routes.ts | 29 + .../observability/server/index.ts | 9 +- .../observability/server/utils/queries.ts | 4 + .../dataset_quality/url_schema_v1.ts | 7 + .../data_streams/degraded_fields.spec.ts | 107 +++ .../apps/dataset_quality/data/logs_data.ts | 50 ++ .../dataset_quality/dataset_quality_flyout.ts | 729 ++++++++++------- .../page_objects/dataset_quality.ts | 41 +- .../dataset_quality/data/logs_data.ts | 50 ++ .../dataset_quality/dataset_quality_flyout.ts | 757 ++++++++++-------- 33 files changed, 1741 insertions(+), 662 deletions(-) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/errors.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/index.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/degraded_fields.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_degraded_field.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts create mode 100644 x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts index d35748f9a7407..0827329f4ceb8 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/api_types.ts @@ -78,6 +78,20 @@ export const degradedDocsRt = rt.type({ export type DegradedDocs = rt.TypeOf; +export const degradedFieldRt = rt.type({ + name: rt.string, + count: rt.number, + lastOccurrence: rt.union([rt.null, rt.number]), +}); + +export type DegradedField = rt.TypeOf; + +export const getDataStreamDegradedFieldsResponseRt = rt.type({ + degradedFields: rt.array(degradedFieldRt), +}); + +export type DegradedFieldResponse = rt.TypeOf; + export const dataStreamSettingsRt = rt.partial({ createdOn: rt.union([rt.null, rt.number]), // rt.null is needed because `createdOn` is not available on Serverless }); @@ -115,8 +129,6 @@ export const dataStreamsEstimatedDataInBytesRT = rt.type({ estimatedDataInBytes: rt.union([rt.number, rt.null]), // Null in serverless: https://github.com/elastic/kibana/issues/178954 }); -export type DataStreamsEstimatedDataInBytes = rt.TypeOf; - export const getDataStreamsEstimatedDataInBytesResponseRt = rt.exact( dataStreamsEstimatedDataInBytesRT ); diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts index d97def4d29625..ec2a9f6f641db 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/constants.ts @@ -17,6 +17,9 @@ export const DEGRADED_QUALITY_MINIMUM_PERCENTAGE = 0; export const DEFAULT_SORT_FIELD = 'title'; export const DEFAULT_SORT_DIRECTION = 'asc'; +export const DEFAULT_DEGRADED_FIELD_SORT_FIELD = 'count'; +export const DEFAULT_DEGRADED_FIELD_SORT_DIRECTION = 'desc'; + export const NONE = 'none'; export const DEFAULT_TIME_RANGE = { from: 'now-24h', to: 'now' }; @@ -33,3 +36,5 @@ export const NUMBER_FORMAT = '0,0.[000]'; export const BYTE_NUMBER_FORMAT = '0.0 b'; export const MAX_HOSTS_METRIC_VALUE = 50; + +export const MAX_DEGRADED_FIELDS = 1000; diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/errors.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/errors.ts new file mode 100644 index 0000000000000..2ba8bac9f6b51 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/errors.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. + */ + +export class GetDataStreamsDetailsError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + this.name = 'GetDataStreamsDetailsError'; + } +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/index.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/index.ts new file mode 100644 index 0000000000000..8761ef1b52a32 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/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 * from './errors'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts index 9905cef5f7ea5..b2426ef53aeb5 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_streams_stats/types.ts @@ -26,14 +26,33 @@ export type GetDataStreamsDegradedDocsStatsParams = export type GetDataStreamsDegradedDocsStatsQuery = GetDataStreamsDegradedDocsStatsParams['query']; export type GetDataStreamsDegradedDocsStatsResponse = APIReturnType<`GET /internal/dataset_quality/data_streams/degraded_docs`>; -export type DataStreamDegradedDocsStatServiceResponse = DegradedDocsStatType[]; export type DegradedDocsStatType = GetDataStreamsDegradedDocsStatsResponse['degradedDocs'][0]; +export type DataStreamDegradedDocsStatServiceResponse = DegradedDocsStatType[]; + +/* +Types for Degraded Fields inside a DataStream +*/ + +export type GetDataStreamDegradedFieldsPathParams = + APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields`>['params']['path']; +export type GetDataStreamDegradedFieldsQueryParams = + APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields`>['params']['query']; +export type GetDataStreamDegradedFieldsParams = GetDataStreamDegradedFieldsPathParams & + GetDataStreamDegradedFieldsQueryParams; + +/* +Types for DataStream Settings +*/ export type GetDataStreamSettingsParams = APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/settings`>['params']['path']; export type GetDataStreamSettingsResponse = APIReturnType<`GET /internal/dataset_quality/data_streams/{dataStream}/settings`>; +/* +Types for DataStream Details +*/ + type GetDataStreamDetailsPathParams = APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/{dataStream}/details`>['params']['path']; type GetDataStreamDetailsQueryParams = @@ -55,4 +74,9 @@ export type GetIntegrationDashboardsResponse = export type DashboardType = GetIntegrationDashboardsResponse['dashboards'][0]; export type { DataStreamStat } from './data_stream_stat'; -export type { DataStreamDetails, DataStreamSettings } from '../api_types'; +export type { + DataStreamDetails, + DataStreamSettings, + DegradedField, + DegradedFieldResponse, +} from '../api_types'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/es_fields/index.ts b/x-pack/plugins/observability_solution/dataset_quality/common/es_fields/index.ts index 187093b7cd7f6..1e67fb1c68f81 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/es_fields/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/es_fields/index.ts @@ -6,6 +6,7 @@ */ export const _IGNORED = '_ignored'; +export const TIMESTAMP = '@timestamp'; export const DATA_STREAM_DATASET = 'data_stream.dataset'; export const DATA_STREAM_NAMESPACE = 'data_stream.namespace'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts index d8ea867c44e4c..c57864e8aff2f 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts @@ -137,6 +137,34 @@ export const flyoutShowAllText = i18n.translate('xpack.datasetQuality.flyoutShow defaultMessage: 'Show all', }); +export const flyoutImprovementText = i18n.translate( + 'xpack.datasetQuality.flyoutDegradedFieldsSectionTitle', + { + defaultMessage: 'Degraded Fields', + } +); + +export const flyoutImprovementTooltip = i18n.translate( + 'xpack.datasetQuality.flyoutDegradedFieldsSectionTooltip', + { + defaultMessage: + 'Set of degraded fields in the dataset. Please not that this list may not be exhaustive.', + } +); + +export const flyoutDegradedFieldsTableLoadingText = i18n.translate( + 'xpack.datasetQuality.flyoutDegradedFieldsTableLoadingText', + { + defaultMessage: 'Loading degraded fields', + } +); + +export const flyoutDegradedFieldsTableNoData = i18n.translate( + 'xpack.datasetQuality.flyoutDegradedFieldsTableNoData', + { + defaultMessage: 'No degraded fields found', + } +); /* Summary Panel */ diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts b/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts index 143556e5a519f..bbdac062fde8d 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/types/index.ts @@ -7,3 +7,5 @@ export * from './dataset_types'; export * from './quality_types'; + +export type SortDirection = 'asc' | 'desc'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.tsx new file mode 100644 index 0000000000000..10b30fe855aa2 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/columns.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 { EuiBasicTableColumn } from '@elastic/eui'; +import { FieldFormat } from '@kbn/field-formats-plugin/common'; +import { i18n } from '@kbn/i18n'; + +import { DegradedField } from '../../../../common/api_types'; + +const fieldColumnName = i18n.translate('xpack.datasetQuality.flyout.degradedField.field', { + defaultMessage: 'Field', +}); + +const countColumnName = i18n.translate('xpack.datasetQuality.flyout.degradedField.count', { + defaultMessage: 'Count', +}); + +const lastOccurrenceColumnName = i18n.translate( + 'xpack.datasetQuality.flyout.degradedField.lastOccurrence', + { + defaultMessage: 'Last Occurrence', + } +); + +export const getDegradedFieldsColumns = ({ + dateFormatter, +}: { + dateFormatter: FieldFormat; +}): Array> => [ + { + name: fieldColumnName, + field: 'name', + }, + { + name: countColumnName, + sortable: true, + field: 'count', + truncateText: true, + }, + { + name: lastOccurrenceColumnName, + sortable: true, + field: 'lastOccurrence', + render: (lastOccurrence: number) => { + return dateFormatter.convert(lastOccurrence); + }, + }, +]; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/degraded_fields.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/degraded_fields.tsx new file mode 100644 index 0000000000000..bd2c20b24171a --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/degraded_fields.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFlexGroup, EuiPanel, EuiTitle, EuiIconTip } from '@elastic/eui'; +import { flyoutImprovementText, flyoutImprovementTooltip } from '../../../../common/translations'; +import { DegradedFieldTable } from './table'; + +export function DegradedFields() { + return ( + + + +

{flyoutImprovementText}
+ + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx new file mode 100644 index 0000000000000..b14bc6dbf57f2 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_fields/table.tsx @@ -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 { EuiBasicTable, EuiEmptyPrompt } from '@elastic/eui'; +import React from 'react'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '@kbn/field-types'; +import { useDatasetQualityDegradedField } from '../../../hooks'; +import { getDegradedFieldsColumns } from './columns'; +import { + flyoutDegradedFieldsTableLoadingText, + flyoutDegradedFieldsTableNoData, +} from '../../../../common/translations'; + +export const DegradedFieldTable = () => { + const { isLoading, pagination, renderedItems, onTableChange, sort, fieldFormats } = + useDatasetQualityDegradedField(); + const dateFormatter = fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.DATE, [ + ES_FIELD_TYPES.DATE, + ]); + const columns = getDegradedFieldsColumns({ dateFormatter }); + + return ( + {flyoutDegradedFieldsTableNoData}} + hasBorder={false} + titleSize="m" + /> + ) + } + /> + ); +}; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx index c3e38d5a9940a..4977f6b0d7732 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/flyout_summary/flyout_summary.tsx @@ -26,6 +26,7 @@ import { useDatasetQualityContext } from '../../dataset_quality/context'; import { FlyoutDataset, TimeRangeConfig } from '../../../state_machines/dataset_quality_controller'; import { FlyoutSummaryHeader } from './flyout_summary_header'; import { FlyoutSummaryKpis, FlyoutSummaryKpisLoading } from './flyout_summary_kpis'; +import { DegradedFields } from '../degraded_fields/degraded_fields'; const nonAggregatableWarningTitle = i18n.translate('xpack.datasetQuality.nonAggregatable.title', { defaultMessage: 'Your request may take longer to complete', @@ -173,6 +174,10 @@ export function FlyoutSummary({ lastReloadTime={lastReloadTime} onTimeRangeChange={handleTimeRangeChange} /> + + + + ); } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/controller/public_state.ts b/x-pack/plugins/observability_solution/dataset_quality/public/controller/public_state.ts index 138ea2cf2d4a6..9500b473c95ed 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/controller/public_state.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/controller/public_state.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SortField } from '../hooks'; +import { DatasetTableSortField, DegradedFieldSortField } from '../hooks'; import { DatasetQualityControllerContext, DEFAULT_CONTEXT, @@ -32,13 +32,25 @@ export const getContextFromPublicState = ( sort: publicState.table?.sort ? { ...publicState.table?.sort, - field: publicState.table?.sort.field as SortField, + field: publicState.table?.sort.field as DatasetTableSortField, } : DEFAULT_CONTEXT.table.sort, }, flyout: { ...DEFAULT_CONTEXT.flyout, ...publicState.flyout, + degradedFields: { + table: { + ...DEFAULT_CONTEXT.flyout.degradedFields.table, + ...publicState.flyout?.degradedFields?.table, + sort: publicState.flyout?.degradedFields?.table?.sort + ? { + ...publicState.flyout.degradedFields.table.sort, + field: publicState.flyout.degradedFields.table.sort.field as DegradedFieldSortField, + } + : DEFAULT_CONTEXT.flyout.degradedFields.table.sort, + }, + }, }, filters: { ...DEFAULT_CONTEXT.filters, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/controller/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/controller/types.ts index a74b5ed498717..66757d3409567 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/controller/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/controller/types.ts @@ -11,6 +11,7 @@ import { WithFilters, WithFlyoutOptions, WithTableOptions, + DegradedFields, } from '../state_machines/dataset_quality_controller'; export interface DatasetQualityController { @@ -24,7 +25,19 @@ export type DatasetQualityTableOptions = Partial< Omit & { sort: TableSortOptions } >; -export type DatasetQualityFlyoutOptions = Omit; +type DegradedFieldSortOptions = Omit & { field: string }; + +export type DatasetQualityDegradedFieldTableOptions = Partial< + Omit & { + sort: DegradedFieldSortOptions; + } +>; + +export type DatasetQualityFlyoutOptions = Partial< + Omit & { + degradedFields: { table?: DatasetQualityDegradedFieldTableOptions }; + } +>; export type DatasetQualityFilterOptions = Partial; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/index.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/index.ts index 3d40c1674d40a..eafeddaeb1386 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/index.ts @@ -11,3 +11,4 @@ export * from './use_degraded_docs_chart'; export * from './use_link_to_logs_explorer'; export * from './use_summary_panel'; export * from './use_create_dataview'; +export * from './use_dataset_quality_degraded_field'; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_degraded_field.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_degraded_field.ts new file mode 100644 index 0000000000000..ed95a0cd7fec9 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_degraded_field.ts @@ -0,0 +1,75 @@ +/* + * 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 { useSelector } from '@xstate/react'; +import { useCallback, useMemo } from 'react'; +import { orderBy } from 'lodash'; +import { useDatasetQualityContext } from '../components/dataset_quality/context'; +import { DegradedField } from '../../common/data_streams_stats'; +import { SortDirection } from '../../common/types'; +import { + DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + DEFAULT_DEGRADED_FIELD_SORT_FIELD, +} from '../../common/constants'; +import { useKibanaContextForPlugin } from '../utils'; + +export type DegradedFieldSortField = keyof DegradedField; + +export function useDatasetQualityDegradedField() { + const { service } = useDatasetQualityContext(); + const { + services: { fieldFormats }, + } = useKibanaContextForPlugin(); + + const degradedFields = useSelector(service, (state) => state.context.flyout.degradedFields) ?? {}; + const { data, table } = degradedFields; + const { page, rowsPerPage, sort } = table; + + const pagination = { + pageIndex: page, + pageSize: rowsPerPage, + totalItemCount: data?.length ?? 0, + hidePerPageOptions: true, + }; + + const onTableChange = useCallback( + (options: { + page: { index: number; size: number }; + sort?: { field: DegradedFieldSortField; direction: SortDirection }; + }) => { + service.send({ + type: 'UPDATE_DEGRADED_FIELDS_TABLE_CRITERIA', + degraded_field_criteria: { + page: options.page.index, + rowsPerPage: options.page.size, + sort: { + field: options.sort?.field || DEFAULT_DEGRADED_FIELD_SORT_FIELD, + direction: options.sort?.direction || DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + }, + }, + }); + }, + [service] + ); + + const renderedItems = useMemo(() => { + const sortedItems = orderBy(data, sort.field, sort.direction); + return sortedItems.slice(page * rowsPerPage, (page + 1) * rowsPerPage); + }, [data, sort.field, sort.direction, page, rowsPerPage]); + + const isLoading = useSelector(service, (state) => + state.matches('flyout.initializing.dataStreamDegradedFields.fetching') + ); + + return { + isLoading, + pagination, + onTableChange, + renderedItems, + sort: { sort }, + fieldFormats, + }; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx index d9c936943cf0b..dd82b52a7e743 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx @@ -17,12 +17,12 @@ import { useDatasetQualityContext } from '../components/dataset_quality/context' import { FlyoutDataset } from '../state_machines/dataset_quality_controller'; import { useKibanaContextForPlugin } from '../utils'; import { filterInactiveDatasets, isActiveDataset } from '../utils/filter_inactive_datasets'; +import { SortDirection } from '../../common/types'; -export type Direction = 'asc' | 'desc'; -export type SortField = keyof DataStreamStat; +export type DatasetTableSortField = keyof DataStreamStat; const sortingOverrides: Partial<{ - [key in SortField]: SortField | ((item: DataStreamStat) => Primitive); + [key in DatasetTableSortField]: DatasetTableSortField | ((item: DataStreamStat) => Primitive); }> = { ['title']: 'name', ['size']: DataStreamStat.calculateFilteredSize, @@ -167,11 +167,11 @@ export const useDatasetQualityTable = () => { const onTableChange = useCallback( (options: { page: { index: number; size: number }; - sort?: { field: SortField; direction: Direction }; + sort?: { field: DatasetTableSortField; direction: SortDirection }; }) => { service.send({ type: 'UPDATE_TABLE_CRITERIA', - criteria: { + dataset_criteria: { page: options.page.index, rowsPerPage: options.page.size, sort: { diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts index 3b95814397f3a..e1282eb494999 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts @@ -8,21 +8,26 @@ import { HttpStart } from '@kbn/core/public'; import { decodeOrThrow } from '@kbn/io-ts-utils'; import { - getDataStreamsSettingsResponseRt, + getDataStreamDegradedFieldsResponseRt, getDataStreamsDetailsResponseRt, + getDataStreamsSettingsResponseRt, integrationDashboardsRT, } from '../../../common/api_types'; import { - GetDataStreamsStatsError, - GetDataStreamSettingsParams, - GetDataStreamSettingsResponse, + DataStreamDetails, + DataStreamSettings, + DegradedFieldResponse, + GetDataStreamDegradedFieldsParams, GetDataStreamDetailsParams, GetDataStreamDetailsResponse, + GetDataStreamSettingsParams, + GetDataStreamSettingsResponse, + GetDataStreamsStatsError, GetIntegrationDashboardsParams, GetIntegrationDashboardsResponse, } from '../../../common/data_streams_stats'; -import { DataStreamDetails, DataStreamSettings } from '../../../common/data_streams_stats'; import { IDataStreamDetailsClient } from './types'; +import { GetDataStreamsDetailsError } from '../../../common/data_stream_details'; export class DataStreamDetailsClient implements IDataStreamDetailsClient { constructor(private readonly http: HttpStart) {} @@ -66,6 +71,33 @@ export class DataStreamDetailsClient implements IDataStreamDetailsClient { return dataStreamDetails as DataStreamDetails; } + public async getDataStreamDegradedFields({ + dataStream, + start, + end, + }: GetDataStreamDegradedFieldsParams) { + const response = await this.http + .get( + `/internal/dataset_quality/data_streams/${dataStream}/degraded_fields`, + { + query: { start, end }, + } + ) + .catch((error) => { + throw new GetDataStreamsDetailsError( + `Failed to fetch data stream degraded fields": ${error}` + ); + }); + + return decodeOrThrow( + getDataStreamDegradedFieldsResponseRt, + (message: string) => + new GetDataStreamsDetailsError( + `Failed to decode data stream degraded fields response: ${message}"` + ) + )(response); + } + public async getIntegrationDashboards({ integration }: GetIntegrationDashboardsParams) { const response = await this.http .get( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts index f85e05d0179f5..708c1ba8a6c4c 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts @@ -13,6 +13,8 @@ import { DataStreamDetails, GetIntegrationDashboardsParams, GetIntegrationDashboardsResponse, + GetDataStreamDegradedFieldsParams, + DegradedFieldResponse, } from '../../../common/data_streams_stats'; export type DataStreamDetailsServiceSetup = void; @@ -28,6 +30,9 @@ export interface DataStreamDetailsServiceStartDeps { export interface IDataStreamDetailsClient { getDataStreamSettings(params: GetDataStreamSettingsParams): Promise; getDataStreamDetails(params: GetDataStreamDetailsParams): Promise; + getDataStreamDegradedFields( + params: GetDataStreamDegradedFieldsParams + ): Promise; getIntegrationDashboards( params: GetIntegrationDashboardsParams ): Promise; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts index 72a7c2ddc24ee..a1b823d6f60fb 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts @@ -7,6 +7,8 @@ import { DEFAULT_DATASET_TYPE, + DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + DEFAULT_DEGRADED_FIELD_SORT_FIELD, DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD, } from '../../../../common/constants'; @@ -39,7 +41,18 @@ export const DEFAULT_CONTEXT: DefaultDatasetQualityControllerState = { namespaces: [], qualities: [], }, - flyout: {}, + flyout: { + degradedFields: { + table: { + page: 0, + rowsPerPage: 10, + sort: { + field: DEFAULT_DEGRADED_FIELD_SORT_FIELD, + direction: DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + }, + }, + }, + }, datasets: [], isSizeStatsAvailable: true, nonAggregatableDatasets: [], diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts index 8d8efc3d3c3db..2da9fe409aee8 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts @@ -8,7 +8,7 @@ import { IToasts } from '@kbn/core/public'; import { getDateISORange } from '@kbn/timerange'; import { assign, createMachine, DoneInvokeEvent, InterpreterFrom } from 'xstate'; -import { DataStreamStat } from '../../../../common/api_types'; +import { DataStreamStat, DegradedFieldResponse } from '../../../../common/api_types'; import { Integration } from '../../../../common/data_streams_stats/integration'; import { IDataStreamDetailsClient } from '../../../services/data_stream_details'; import { @@ -43,6 +43,10 @@ import { DefaultDatasetQualityControllerState, FlyoutDataset, } from './types'; +import { + DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + DEFAULT_DEGRADED_FIELD_SORT_FIELD, +} from '../../../../common/constants'; export const createPureDatasetQualityControllerStateMachine = ( initialContext: DatasetQualityControllerContext @@ -311,6 +315,35 @@ export const createPureDatasetQualityControllerStateMachine = ( }, }, }, + dataStreamDegradedFields: { + initial: 'fetching', + states: { + fetching: { + invoke: { + src: 'loadDegradedFieldsPerDataStream', + onDone: { + target: 'done', + actions: ['storeDegradedFields'], + }, + onError: { + target: 'done', + }, + }, + }, + done: { + on: { + UPDATE_INSIGHTS_TIME_RANGE: { + target: 'fetching', + actions: ['resetDegradedFieldPage'], + }, + UPDATE_DEGRADED_FIELDS_TABLE_CRITERIA: { + target: 'done', + actions: ['storeDegradedFieldTableOptions'], + }, + }, + }, + }, + }, }, onDone: { target: '#DatasetQualityController.flyout.loaded', @@ -349,9 +382,22 @@ export const createPureDatasetQualityControllerStateMachine = ( { actions: { storeTableOptions: assign((_context, event) => { - return 'criteria' in event + return 'dataset_criteria' in event + ? { + table: event.dataset_criteria, + } + : {}; + }), + storeDegradedFieldTableOptions: assign((context, event) => { + return 'degraded_field_criteria' in event ? { - table: event.criteria, + flyout: { + ...context.flyout, + degradedFields: { + ...context.flyout.degradedFields, + table: event.degraded_field_criteria, + }, + }, } : {}; }), @@ -361,6 +407,22 @@ export const createPureDatasetQualityControllerStateMachine = ( page: 0, }, })), + resetDegradedFieldPage: assign((context, _event) => ({ + flyout: { + ...context.flyout, + degradedFields: { + ...context.flyout.degradedFields, + table: { + page: 0, + rowsPerPage: 10, + sort: { + field: DEFAULT_DEGRADED_FIELD_SORT_FIELD, + direction: DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + }, + }, + }, + }, + })), storeInactiveDatasetsVisibility: assign((context, _event) => { return { filters: { @@ -448,7 +510,7 @@ export const createPureDatasetQualityControllerStateMachine = ( }, }; }), - resetFlyoutOptions: assign((_context, _event) => ({ flyout: undefined })), + resetFlyoutOptions: assign((_context, _event) => ({ flyout: DEFAULT_CONTEXT.flyout })), storeDataStreamStats: assign((_context, event) => { if ('data' in event) { const dataStreamStats = event.data as DataStreamStat[]; @@ -470,6 +532,19 @@ export const createPureDatasetQualityControllerStateMachine = ( } : {}; }), + storeDegradedFields: assign((context, event: DoneInvokeEvent) => { + return 'data' in event + ? { + flyout: { + ...context.flyout, + degradedFields: { + ...context.flyout.degradedFields, + data: event.data.degradedFields, + }, + }, + } + : {}; + }), storeNonAggregatableDatasets: assign( ( _context: DefaultDatasetQualityControllerState, @@ -606,6 +681,27 @@ export const createDatasetQualityControllerStateMachine = ({ end, }); }, + + loadDegradedFieldsPerDataStream: (context) => { + if (!context.flyout.dataset || !context.flyout.insightsTimeRange) { + return Promise.resolve({}); + } + + const { startDate: start, endDate: end } = getDateISORange( + context.flyout.insightsTimeRange + ); + const { type, name: dataset, namespace } = context.flyout.dataset; + + return dataStreamDetailsClient.getDataStreamDegradedFields({ + dataStream: dataStreamPartsToIndexName({ + type: type as DataStreamType, + dataset, + namespace, + }), + start, + end, + }); + }, loadIntegrations: (context) => { return dataStreamStatsClient.getIntegrations({ type: context.type as GetIntegrationsParams['query']['type'], diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts index 538ad16f3f977..286f621fe432c 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts @@ -7,9 +7,9 @@ import { DoneInvokeEvent } from 'xstate'; import { RefreshInterval, TimeRange } from '@kbn/data-plugin/common'; -import { QualityIndicators } from '../../../../common/types'; +import { QualityIndicators, SortDirection } from '../../../../common/types'; import { Integration } from '../../../../common/data_streams_stats/integration'; -import { Direction, SortField } from '../../../hooks'; +import { DatasetTableSortField, DegradedFieldSortField } from '../../../hooks'; import { DegradedDocsStat } from '../../../../common/data_streams_stats/malformed_docs_stat'; import { DashboardType, @@ -21,6 +21,8 @@ import { DataStreamStat, DataStreamStatType, GetNonAggregatableDataStreamsResponse, + DegradedField, + DegradedFieldResponse, } from '../../../../common/data_streams_stats'; export type FlyoutDataset = Omit< @@ -28,15 +30,20 @@ export type FlyoutDataset = Omit< 'type' | 'size' | 'sizeBytes' | 'lastActivity' | 'degradedDocs' > & { type: string }; -interface TableCriteria { +interface TableCriteria { page: number; rowsPerPage: number; sort: { - field: SortField; - direction: Direction; + field: TSortField; + direction: SortDirection; }; } +export interface DegradedFields { + table: TableCriteria; + data?: DegradedField[]; +} + export type TimeRangeConfig = Pick & { refresh: RefreshInterval; }; @@ -52,7 +59,7 @@ interface FiltersCriteria { } export interface WithTableOptions { - table: TableCriteria; + table: TableCriteria; } export interface WithFlyoutOptions { @@ -62,6 +69,7 @@ export interface WithFlyoutOptions { datasetDetails?: DataStreamDetails; insightsTimeRange?: TimeRangeConfig; breakdownField?: string; + degradedFields: DegradedFields; isNonAggregatable?: boolean; }; } @@ -140,6 +148,10 @@ export type DatasetQualityControllerTypeState = value: 'flyout.initializing.dataStreamDetails.fetching'; context: DefaultDatasetQualityStateContext; } + | { + value: 'flyout.initializing.dataStreamDegradedFields.fetching'; + context: DefaultDatasetQualityStateContext; + } | { value: 'flyout.initializing.integrationDashboards.fetching'; context: DefaultDatasetQualityStateContext; @@ -150,7 +162,11 @@ export type DatasetQualityControllerContext = DatasetQualityControllerTypeState[ export type DatasetQualityControllerEvent = | { type: 'UPDATE_TABLE_CRITERIA'; - criteria: TableCriteria; + dataset_criteria: TableCriteria; + } + | { + type: 'UPDATE_DEGRADED_FIELDS_TABLE_CRITERIA'; + degraded_field_criteria: TableCriteria; } | { type: 'OPEN_FLYOUT'; @@ -204,6 +220,7 @@ export type DatasetQualityControllerEvent = | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent + | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts new file mode 100644 index 0000000000000..92a1565afb9bc --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_fields/index.ts @@ -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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { rangeQuery, existsQuery } from '@kbn/observability-plugin/server'; +import { DegradedFieldResponse } from '../../../../common/api_types'; +import { MAX_DEGRADED_FIELDS } from '../../../../common/constants'; +import { createDatasetQualityESClient } from '../../../utils'; +import { _IGNORED, TIMESTAMP } from '../../../../common/es_fields'; + +export async function getDegradedFields({ + esClient, + start, + end, + dataStream, +}: { + esClient: ElasticsearchClient; + start: number; + end: number; + dataStream: string; +}): Promise { + const datasetQualityESClient = createDatasetQualityESClient(esClient); + + const filterQuery = [...rangeQuery(start, end)]; + + const mustQuery = [...existsQuery(_IGNORED)]; + + const aggs = { + degradedFields: { + terms: { + size: MAX_DEGRADED_FIELDS, + field: _IGNORED, + }, + aggs: { + lastOccurrence: { + max: { + field: TIMESTAMP, + }, + }, + }, + }, + }; + + const response = await datasetQualityESClient.search({ + index: dataStream, + size: 0, + query: { + bool: { + filter: filterQuery, + must: mustQuery, + }, + }, + aggs, + }); + + return { + degradedFields: + response.aggregations?.degradedFields.buckets.map((bucket) => ({ + name: bucket.key as string, + count: bucket.doc_count, + lastOccurrence: bucket.lastOccurrence.value, + })) ?? [], + }; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts index b4a757330647e..26761e53575fd 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts @@ -13,6 +13,7 @@ import { DataStreamStat, DegradedDocs, NonAggregatableDatasets, + DegradedFieldResponse, } from '../../../common/api_types'; import { indexNameToDataStreamParts } from '../../../common/utils'; import { rangeRt, typeRt } from '../../types/default_api_types'; @@ -22,6 +23,7 @@ import { getDataStreams } from './get_data_streams'; import { getDataStreamsStats } from './get_data_streams_stats'; import { getDegradedDocsPaginated } from './get_degraded_docs'; import { getNonAggregatableDataStreams } from './get_non_aggregatable_data_streams'; +import { getDegradedFields } from './get_degraded_fields'; const statsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/stats', @@ -123,6 +125,32 @@ const nonAggregatableDatasetsRoute = createDatasetQualityServerRoute({ }, }); +const degradedFieldsRoute = createDatasetQualityServerRoute({ + endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields', + params: t.type({ + path: t.type({ + dataStream: t.string, + }), + query: rangeRt, + }), + options: { + tags: [], + }, + async handler(resources): Promise { + const { context, params } = resources; + const { dataStream } = params.path; + const coreContext = await context.core; + + const esClient = coreContext.elasticsearch.client.asCurrentUser; + + return await getDegradedFields({ + esClient, + dataStream, + ...params.query, + }); + }, +}); + const dataStreamSettingsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', params: t.type({ @@ -198,6 +226,7 @@ export const dataStreamsRouteRepository = { ...statsRoute, ...degradedDocsRoute, ...nonAggregatableDatasetsRoute, + ...degradedFieldsRoute, ...dataStreamDetailsRoute, ...dataStreamSettingsRoute, }; diff --git a/x-pack/plugins/observability_solution/observability/server/index.ts b/x-pack/plugins/observability_solution/observability/server/index.ts index f7a9435198f8e..6486731fcd90c 100644 --- a/x-pack/plugins/observability_solution/observability/server/index.ts +++ b/x-pack/plugins/observability_solution/observability/server/index.ts @@ -20,7 +20,14 @@ import { WrappedElasticsearchClientError, } from '../common/utils/unwrap_es_response'; -export { rangeQuery, kqlQuery, termQuery, termsQuery, wildcardQuery } from './utils/queries'; +export { + rangeQuery, + kqlQuery, + termQuery, + termsQuery, + wildcardQuery, + existsQuery, +} from './utils/queries'; export { getParsedFilterQuery } from './utils/get_parsed_filtered_query'; export { getInspectResponse } from '../common/utils/get_inspect_response'; diff --git a/x-pack/plugins/observability_solution/observability/server/utils/queries.ts b/x-pack/plugins/observability_solution/observability/server/utils/queries.ts index fa581df62e745..e66fca3264f1b 100644 --- a/x-pack/plugins/observability_solution/observability/server/utils/queries.ts +++ b/x-pack/plugins/observability_solution/observability/server/utils/queries.ts @@ -83,6 +83,10 @@ export function rangeQuery( ]; } +export function existsQuery(field: string): QueryDslQueryContainer[] { + return [{ exists: { field } }]; +} + export function kqlQuery(kql?: string): estypes.QueryDslQueryContainer[] { if (!kql) { return []; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/dataset_quality/url_schema_v1.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/dataset_quality/url_schema_v1.ts index 738b95d09ea6e..6fd5781a217e8 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/dataset_quality/url_schema_v1.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/dataset_quality/url_schema_v1.ts @@ -55,11 +55,18 @@ const timeRangeRT = rt.strict({ }), }); +const degradedFieldRT = rt.exact( + rt.partial({ + table: tableRT, + }) +); + export const flyoutRT = rt.exact( rt.partial({ dataset: datasetRT, insightsTimeRange: timeRangeRT, breakdownField: rt.string, + degradedFields: degradedFieldRT, }) ); diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts new file mode 100644 index 0000000000000..fb2edfcc56efd --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams/degraded_fields.spec.ts @@ -0,0 +1,107 @@ +/* + * 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 { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { DegradedField } from '@kbn/dataset-quality-plugin/common/api_types'; +import { DatasetQualityApiClientKey } from '../../common/config'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +const MORE_THAN_1024_CHARS = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + const synthtrace = getService('logSynthtraceEsClient'); + const datasetQualityApiClient = getService('datasetQualityApiClient'); + const start = '2024-05-22T08:00:00.000Z'; + const end = '2024-05-23T08:02:00.000Z'; + const type = 'logs'; + const dataset = 'nginx.access'; + const degradedFieldDataset = 'nginx.error'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + + async function callApiAs(user: DatasetQualityApiClientKey, dataStream: string) { + return await datasetQualityApiClient[user]({ + endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields', + params: { + path: { + dataStream, + }, + query: { + start, + end, + }, + }, + }); + } + + registry.when('Degraded Fields per DataStream', { config: 'basic' }, () => { + describe('gets the degraded fields per data stream', () => { + before(async () => { + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(dataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName + 0, + 'host.name': hostName, + }) + ), + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a error message') + .logLevel(MORE_THAN_1024_CHARS) + .timestamp(timestamp) + .dataset(degradedFieldDataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/error.log', + 'service.name': serviceName + 1, + 'trace.id': MORE_THAN_1024_CHARS, + }) + ), + ]); + }); + + after(async () => { + await synthtrace.clean(); + }); + + it('returns no results when dataStream does not have any degraded fields', async () => { + const resp = await callApiAs('datasetQualityLogsUser', `${type}-${dataset}-${namespace}`); + expect(resp.body.degradedFields.length).to.be(0); + }); + + it('returns results when dataStream do have degraded fields', async () => { + const expectedDegradedFields = ['log.level', 'trace.id']; + const resp = await callApiAs( + 'datasetQualityLogsUser', + `${type}-${degradedFieldDataset}-${namespace}` + ); + const degradedFields = resp.body.degradedFields.map((field: DegradedField) => field.name); + + expect(resp.body.degradedFields.length).to.be(2); + expect(degradedFields).to.eql(expectedDegradedFields); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts b/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts index 68d96070990f0..399030d1dd377 100644 --- a/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts +++ b/x-pack/test/functional/apps/dataset_quality/data/logs_data.ts @@ -139,6 +139,56 @@ export function createLogRecord( .timestamp(timestamp); } +/* +The helped function generates 2 sets of Malformed Docs for the given dataset. +1 set has more Malformed fields than the second one. This help in having different counts and hence sorting + */ +export function createDegradedFieldsRecord({ + to, + count = 1, + dataset, +}: { + to: string; + count?: number; + dataset: string; +}) { + return timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(count) + .fill(0) + .flatMap((_, index) => [ + log + .create() + .dataset(dataset) + .message(MESSAGE_LOG_LEVELS[0].message) + .logLevel(MORE_THAN_1024_CHARS) + .service(SERVICE_NAMES[0]) + .namespace(defaultNamespace) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'cloud.availability_zone': MORE_THAN_1024_CHARS, + }) + .timestamp(timestamp), + log + .create() + .dataset(dataset) + .message(MESSAGE_LOG_LEVELS[1].message) + .logLevel(MESSAGE_LOG_LEVELS[1].level) + .service(SERVICE_NAMES[0]) + .namespace(defaultNamespace) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'cloud.availability_zone': MORE_THAN_1024_CHARS, + }) + .timestamp(timestamp), + ]); + }); +} + export const datasetNames = ['synth.1', 'synth.2', 'synth.3']; export const defaultNamespace = 'default'; diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts index 8e1abbbefa9dc..3bd17373123ee 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts @@ -7,7 +7,12 @@ import expect from '@kbn/expect'; import { DatasetQualityFtrProviderContext } from './config'; -import { datasetNames, getInitialTestLogs, getLogsForDataset } from './data'; +import { + createDegradedFieldsRecord, + datasetNames, + getInitialTestLogs, + getLogsForDataset, +} from './data'; const integrationActions = { overview: 'Overview', @@ -28,414 +33,520 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const browser = getService('browser'); const to = '2024-01-01T12:00:00.000Z'; - // FLAKY: https://github.com/elastic/kibana/issues/182154 - describe.skip('Dataset quality flyout', () => { - before(async () => { - await synthtrace.index(getInitialTestLogs({ to, count: 4 })); - await PageObjects.datasetQuality.navigateTo(); - }); + describe('Dataset quality flyout', () => { + // FLAKY: https://github.com/elastic/kibana/issues/182154 + // Added this sub describe block so that the existing flaky tests can be skipped and new ones can be added in the other describe block + describe.skip('Other dataset quality flyout tests', () => { + before(async () => { + await synthtrace.index(getInitialTestLogs({ to, count: 4 })); + await PageObjects.datasetQuality.navigateTo(); + }); - after(async () => { - await synthtrace.clean(); - await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); - }); + after(async () => { + await synthtrace.clean(); + await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); + }); - it('opens the flyout for the right dataset', async () => { - const testDatasetName = datasetNames[1]; + it('opens the flyout for the right dataset', async () => { + const testDatasetName = datasetNames[1]; - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutTitle - ); - }); + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutTitle + ); + }); - it('shows the correct last activity', async () => { - const testDatasetName = datasetNames[0]; + it('shows the correct last activity', async () => { + const testDatasetName = datasetNames[0]; - // Update last activity for the dataset - await PageObjects.datasetQuality.closeFlyout(); - await synthtrace.index( - getLogsForDataset({ to: new Date().toISOString(), count: 1, dataset: testDatasetName }) - ); - await PageObjects.datasetQuality.refreshTable(); + // Update last activity for the dataset + await PageObjects.datasetQuality.closeFlyout(); + await synthtrace.index( + getLogsForDataset({ to: new Date().toISOString(), count: 1, dataset: testDatasetName }) + ); + await PageObjects.datasetQuality.refreshTable(); - const cols = await PageObjects.datasetQuality.parseDatasetTable(); + const cols = await PageObjects.datasetQuality.parseDatasetTable(); - const datasetNameCol = cols['Dataset Name']; - const datasetNameColCellTexts = await datasetNameCol.getCellTexts(); + const datasetNameCol = cols['Dataset Name']; + const datasetNameColCellTexts = await datasetNameCol.getCellTexts(); - const testDatasetRowIndex = datasetNameColCellTexts.findIndex( - (dName: string) => dName === testDatasetName - ); + const testDatasetRowIndex = datasetNameColCellTexts.findIndex( + (dName: string) => dName === testDatasetName + ); - const lastActivityText = (await cols['Last Activity'].getCellTexts())[testDatasetRowIndex]; + const lastActivityText = (await cols['Last Activity'].getCellTexts())[testDatasetRowIndex]; - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - const lastActivityTextExists = await PageObjects.datasetQuality.doestTextExistInFlyout( - lastActivityText, - `[data-test-subj=${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutFieldValue}]` - ); + const lastActivityTextExists = await PageObjects.datasetQuality.doestTextExistInFlyout( + lastActivityText, + `[data-test-subj=${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutFieldValue}]` + ); - expect(lastActivityTextExists).to.eql(true); - }); + expect(lastActivityTextExists).to.eql(true); + }); - it('reflects the breakdown field state in url', async () => { - const testDatasetName = datasetNames[0]; - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + it('reflects the breakdown field state in url', async () => { + const testDatasetName = datasetNames[0]; + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - const breakdownField = 'service.name'; - await PageObjects.datasetQuality.selectBreakdownField(breakdownField); + const breakdownField = 'service.name'; + await PageObjects.datasetQuality.selectBreakdownField(breakdownField); - // Wait for URL to contain "breakdownField:service.name" - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - expect(decodeURIComponent(currentUrl)).to.contain(`breakdownField:${breakdownField}`); - }); + // Wait for URL to contain "breakdownField:service.name" + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + expect(decodeURIComponent(currentUrl)).to.contain(`breakdownField:${breakdownField}`); + }); - // Clear breakdown field - await PageObjects.datasetQuality.selectBreakdownField('No breakdown'); + // Clear breakdown field + await PageObjects.datasetQuality.selectBreakdownField('No breakdown'); - // Wait for URL to not contain "breakdownField" - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - expect(currentUrl).to.not.contain('breakdownField'); + // Wait for URL to not contain "breakdownField" + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + expect(currentUrl).to.not.contain('breakdownField'); + }); }); - }); - it('shows the integration details', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - const apacheIntegrationId = 'apache'; + it('shows the integration details', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + const apacheIntegrationId = 'apache'; - await PageObjects.observabilityLogsExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.datasetQuality.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - const integrationNameElements = await PageObjects.datasetQuality.getFlyoutElementsByText( - '[data-test-subj=datasetQualityFlyoutFieldValue]', - apacheIntegrationId - ); + const integrationNameElements = await PageObjects.datasetQuality.getFlyoutElementsByText( + '[data-test-subj=datasetQualityFlyoutFieldValue]', + apacheIntegrationId + ); - await PageObjects.datasetQuality.closeFlyout(); + await PageObjects.datasetQuality.closeFlyout(); - expect(integrationNameElements.length).to.eql(1); - }); + expect(integrationNameElements.length).to.eql(1); + }); - it('goes to log explorer page when open button is clicked', async () => { - const testDatasetName = datasetNames[2]; - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + it('goes to log explorer page when open button is clicked', async () => { + const testDatasetName = datasetNames[2]; + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - await (await PageObjects.datasetQuality.getFlyoutLogsExplorerButton()).click(); + await (await PageObjects.datasetQuality.getFlyoutLogsExplorerButton()).click(); - // Confirm dataset selector text in observability logs explorer - const datasetSelectorText = - await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); - expect(datasetSelectorText).to.eql(testDatasetName); - }); + // Confirm dataset selector text in observability logs explorer + const datasetSelectorText = + await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); + expect(datasetSelectorText).to.eql(testDatasetName); + }); - it('shows summary KPIs', async () => { - await PageObjects.datasetQuality.navigateTo(); + it('shows summary KPIs', async () => { + await PageObjects.datasetQuality.navigateTo(); - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - const summary = await PageObjects.datasetQuality.parseFlyoutKpis(); - expect(summary).to.eql({ - docsCountTotal: '0', - size: '0.0 B', - services: '0', - hosts: '0', - degradedDocs: '0', + const summary = await PageObjects.datasetQuality.parseFlyoutKpis(); + expect(summary).to.eql({ + docsCountTotal: '0', + size: '0.0 B', + services: '0', + hosts: '0', + degradedDocs: '0', + }); }); - }); - it('shows the updated KPIs', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - - const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis(); - - // Set time range to 3 days ago - const flyoutBodyContainer = await testSubjects.find( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutBody - ); - await PageObjects.datasetQuality.setDatePickerLastXUnits(flyoutBodyContainer, 3, 'd'); - - // Index 2 doc 2 days ago - const time2DaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; - await synthtrace.index( - getLogsForDataset({ - to: time2DaysAgo, - count: 2, - dataset: apacheAccessDatasetName, - isMalformed: false, - }) - ); - - // Index 5 degraded docs 2 days ago - await synthtrace.index( - getLogsForDataset({ - to: time2DaysAgo, - count: 5, - dataset: apacheAccessDatasetName, - isMalformed: true, - }) - ); - - await PageObjects.datasetQuality.refreshFlyout(); - const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis(); - - expect(parseInt(summaryAfter.docsCountTotal, 10)).to.be.greaterThan( - parseInt(summaryBefore.docsCountTotal, 10) - ); - - expect(parseInt(summaryAfter.degradedDocs, 10)).to.be.greaterThan( - parseInt(summaryBefore.degradedDocs, 10) - ); - - expect(parseInt(summaryAfter.size, 10)).to.be.greaterThan(parseInt(summaryBefore.size, 10)); - expect(parseInt(summaryAfter.services, 10)).to.be.greaterThan( - parseInt(summaryBefore.services, 10) - ); - expect(parseInt(summaryAfter.hosts, 10)).to.be.greaterThan(parseInt(summaryBefore.hosts, 10)); - }); + it('shows the updated KPIs', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - it('shows the right number of services', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - - const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis(); - const testServices = ['test-srv-1', 'test-srv-2']; - - // Index 2 docs with different services - const timeNow = Date.now(); - await synthtrace.index( - getLogsForDataset({ - to: timeNow, - count: 2, - dataset: apacheAccessDatasetName, - isMalformed: false, - services: testServices, - }) - ); - - await PageObjects.datasetQuality.refreshFlyout(); - const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis(); - - expect(parseInt(summaryAfter.services, 10)).to.eql( - parseInt(summaryBefore.services, 10) + testServices.length - ); - }); + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis(); - it('goes to log explorer for degraded docs when show all is clicked', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + // Set time range to 3 days ago + const flyoutBodyContainer = await testSubjects.find( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutBody + ); + await PageObjects.datasetQuality.setDatePickerLastXUnits(flyoutBodyContainer, 3, 'd'); + + // Index 2 doc 2 days ago + const time2DaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + }) + ); - const degradedDocsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.degradedDocs}`; - await testSubjects.click(degradedDocsShowAllSelector); - await browser.switchTab(1); + // Index 5 degraded docs 2 days ago + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 5, + dataset: apacheAccessDatasetName, + isMalformed: true, + }) + ); - // Confirm dataset selector text in observability logs explorer - const datasetSelectorText = - await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); - expect(datasetSelectorText).to.contain(apacheAccessDatasetName); + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis(); - await browser.closeCurrentWindow(); - await browser.switchTab(0); - }); + expect(parseInt(summaryAfter.docsCountTotal, 10)).to.be.greaterThan( + parseInt(summaryBefore.docsCountTotal, 10) + ); + + expect(parseInt(summaryAfter.degradedDocs, 10)).to.be.greaterThan( + parseInt(summaryBefore.degradedDocs, 10) + ); - // Blocked by https://github.com/elastic/kibana/issues/181705 - it.skip('goes to infra hosts for hosts when show all is clicked', async () => { - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + expect(parseInt(summaryAfter.size, 10)).to.be.greaterThan(parseInt(summaryBefore.size, 10)); + expect(parseInt(summaryAfter.services, 10)).to.be.greaterThan( + parseInt(summaryBefore.services, 10) + ); + expect(parseInt(summaryAfter.hosts, 10)).to.be.greaterThan( + parseInt(summaryBefore.hosts, 10) + ); + }); - const hostsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.hosts}`; - await testSubjects.click(hostsShowAllSelector); - await browser.switchTab(1); + it('shows the right number of services', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis(); + const testServices = ['test-srv-1', 'test-srv-2']; + + // Index 2 docs with different services + const timeNow = Date.now(); + await synthtrace.index( + getLogsForDataset({ + to: timeNow, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + services: testServices, + }) + ); + + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis(); - // Confirm url contains metrics/hosts - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); - expect(parsedUrl.pathname).to.contain('/app/metrics/hosts'); + expect(parseInt(summaryAfter.services, 10)).to.eql( + parseInt(summaryBefore.services, 10) + testServices.length + ); }); - await browser.closeCurrentWindow(); - await browser.switchTab(0); - }); + it('goes to log explorer for degraded docs when show all is clicked', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + + const degradedDocsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.degradedDocs}`; + await testSubjects.click(degradedDocsShowAllSelector); + await browser.switchTab(1); - it('Integration actions menu is present with correct actions', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; + // Confirm dataset selector text in observability logs explorer + const datasetSelectorText = + await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); + expect(datasetSelectorText).to.contain(apacheAccessDatasetName); - await PageObjects.observabilityLogsExplorer.navigateTo(); + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + // Blocked by https://github.com/elastic/kibana/issues/181705 + it.skip('goes to infra hosts for hosts when show all is clicked', async () => { + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + const hostsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.hosts}`; + await testSubjects.click(hostsShowAllSelector); + await browser.switchTab(1); - await PageObjects.datasetQuality.navigateTo(); + // Confirm url contains metrics/hosts + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + expect(parsedUrl.pathname).to.contain('/app/metrics/hosts'); + }); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); - const actions = await Promise.all( - Object.values(integrationActions).map((action) => - PageObjects.datasetQuality.getIntegrationActionButtonByAction(action) - ) - ); + it('Integration actions menu is present with correct actions', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; - expect(actions.length).to.eql(3); - }); + await PageObjects.observabilityLogsExplorer.navigateTo(); - it('Integration dashboard action hidden for integrations without dashboards', async () => { - const bitbucketDatasetName = 'atlassian_bitbucket.audit'; - const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); - await PageObjects.observabilityLogsExplorer.navigateTo(); + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.installPackage({ - name: 'atlassian_bitbucket', - version: '1.14.0', + await PageObjects.datasetQuality.navigateTo(); + + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); + + const actions = await Promise.all( + Object.values(integrationActions).map((action) => + PageObjects.datasetQuality.getIntegrationActionButtonByAction(action) + ) + ); + + expect(actions.length).to.eql(3); }); - // Index 10 logs for `atlassian_bitbucket.audit` dataset - await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); + it('Integration dashboard action hidden for integrations without dashboards', async () => { + const bitbucketDatasetName = 'atlassian_bitbucket.audit'; + const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.installPackage({ + name: 'atlassian_bitbucket', + version: '1.14.0', + }); - await testSubjects.missingOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutIntegrationAction( - integrationActions.viewDashboards - ) - ); - }); + // Index 10 logs for `atlassian_bitbucket.audit` dataset + await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); - it('Integration overview action should navigate to the integration overview page', async () => { - const bitbucketDatasetName = 'atlassian_bitbucket.audit'; - const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; + await PageObjects.datasetQuality.navigateTo(); - await PageObjects.observabilityLogsExplorer.navigateTo(); + await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.installPackage({ - name: 'atlassian_bitbucket', - version: '1.14.0', + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutIntegrationAction( + integrationActions.viewDashboards + ) + ); }); - // Index 10 logs for `atlassian_bitbucket.audit` dataset - await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); + it('Integration overview action should navigate to the integration overview page', async () => { + const bitbucketDatasetName = 'atlassian_bitbucket.audit'; + const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; + + await PageObjects.observabilityLogsExplorer.navigateTo(); - await PageObjects.datasetQuality.navigateTo(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.installPackage({ + name: 'atlassian_bitbucket', + version: '1.14.0', + }); - await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + // Index 10 logs for `atlassian_bitbucket.audit` dataset + await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); - const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( - integrationActions.overview - ); + await PageObjects.datasetQuality.navigateTo(); + + await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); + + const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( + integrationActions.overview + ); - await action.click(); + await action.click(); - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); - expect(parsedUrl.pathname).to.contain('/app/integrations/detail/atlassian_bitbucket'); + expect(parsedUrl.pathname).to.contain('/app/integrations/detail/atlassian_bitbucket'); + }); }); - }); - it('Integration template action should navigate to the index template page', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; + it('Integration template action should navigate to the index template page', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + + await PageObjects.observabilityLogsExplorer.navigateTo(); + + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); + + await PageObjects.datasetQuality.navigateTo(); + + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); + + await retry.tryForTime(5000, async () => { + const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( + integrationActions.template + ); + + await action.click(); + + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + expect(parsedUrl.pathname).to.contain( + `/app/management/data/index_management/templates/logs-${apacheAccessDatasetName}` + ); + }); + }); + + it('Integration dashboard action should navigate to the selected dashboard', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.observabilityLogsExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.datasetQuality.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); - await retry.tryForTime(5000, async () => { const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( - integrationActions.template + integrationActions.viewDashboards ); await action.click(); - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); - expect(parsedUrl.pathname).to.contain( - `/app/management/data/index_management/templates/logs-${apacheAccessDatasetName}` - ); + const dashboardButtons = await PageObjects.datasetQuality.getIntegrationDashboardButtons(); + const firstDashboardButton = await dashboardButtons[0]; + const dashboardText = await firstDashboardButton.getVisibleText(); + + await firstDashboardButton.click(); + + const breadcrumbText = await testSubjects.getVisibleText('breadcrumb last'); + + expect(breadcrumbText).to.eql(dashboardText); }); }); - it('Integration dashboard action should navigate to the selected dashboard', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; + // The above describe block has some failing/flaky tests which will + // be fixed as part of the tech debt mentioned here + // https://github.com/elastic/kibana/issues/184145 + // Until then, the below describe block is added to cover the tests for the + // newly added degraded Fields Table. This must be merged under the above + // describe block once the tech debt is fixed. + describe('Dataset quality flyout with degraded fields', () => { + const goodDatasetName = 'good'; + const degradedDatasetName = 'degraded'; + const today = new Date().toISOString(); + before(async () => { + await synthtrace.index([ + getLogsForDataset({ + to: today, + count: 2, + dataset: goodDatasetName, + isMalformed: false, + }), + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.datasetQuality.navigateTo(); + }); + + after(async () => { + await synthtrace.clean(); + }); + + it('shows the degraded fields table with no data when no degraded fields are present', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(goodDatasetName); - await PageObjects.observabilityLogsExplorer.navigateTo(); + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedTableNoData + ); + + await PageObjects.datasetQuality.closeFlyout(); + }); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + it('should load the degraded fields table with data', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable + ); + + const rows = + await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); - await PageObjects.datasetQuality.navigateTo(); + expect(rows.length).to.eql(2); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + await PageObjects.datasetQuality.closeFlyout(); + }); - const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( - integrationActions.viewDashboards - ); + it('should sort the table when the count table header is clicked', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - await action.click(); + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - const dashboardButtons = await PageObjects.datasetQuality.getIntegrationDashboardButtons(); - const firstDashboardButton = await dashboardButtons[0]; - const dashboardText = await firstDashboardButton.getVisibleText(); + const countColumn = table.Count; + const cellTexts = await countColumn.getCellTexts(); - await firstDashboardButton.click(); + await countColumn.sort('ascending'); + const sortedCellTexts = await countColumn.getCellTexts(); - const breadcrumbText = await testSubjects.getVisibleText('breadcrumb last'); + expect(cellTexts.reverse()).to.eql(sortedCellTexts); - expect(breadcrumbText).to.eql(dashboardText); + await PageObjects.datasetQuality.closeFlyout(); + }); + + it('should update the table when new data is ingested and the flyout is refreshed using the time selector', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + + const countColumn = table.Count; + const cellTexts = await countColumn.getCellTexts(); + + await synthtrace.index([ + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + + await PageObjects.datasetQuality.refreshFlyout(); + + const updatedCellTexts = await countColumn.getCellTexts(); + + const singleValuePreviously = parseInt(cellTexts[0], 10); + const singleValueNow = parseInt(updatedCellTexts[0], 10); + + expect(singleValueNow).to.be(singleValuePreviously * 2); + + await PageObjects.datasetQuality.closeFlyout(); + }); }); }); } diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index f81cffea160f8..ba7a4241bdf8a 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -14,6 +14,10 @@ import { OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, datasetQualityUrlSchemaV1, } from '@kbn/observability-logs-explorer-plugin/common'; +import { + DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + DEFAULT_DEGRADED_FIELD_SORT_FIELD, +} from '@kbn/dataset-quality-plugin/common/constants'; import { FtrProviderContext } from '../ftr_provider_context'; const defaultPageState: datasetQualityUrlSchemaV1.UrlSchema = { @@ -22,7 +26,18 @@ const defaultPageState: datasetQualityUrlSchemaV1.UrlSchema = { page: 0, }, filters: {}, - flyout: {}, + flyout: { + degradedFields: { + table: { + page: 0, + rowsPerPage: 10, + sort: { + field: DEFAULT_DEGRADED_FIELD_SORT_FIELD, + direction: DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, + }, + }, + }, + }, }; type SummaryPanelKpi = Record< @@ -60,6 +75,8 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv datasetQualityFlyout: 'datasetQualityFlyout', datasetQualityFlyoutBody: 'datasetQualityFlyoutBody', datasetQualityFlyoutTitle: 'datasetQualityFlyoutTitle', + datasetQualityFlyoutDegradedFieldTable: 'datasetQualityFlyoutDegradedFieldTable', + datasetQualityFlyoutDegradedTableNoData: 'datasetQualityFlyoutDegradedTableNoData', datasetQualityHeaderButton: 'datasetQualityHeaderButton', datasetQualityFlyoutFieldValue: 'datasetQualityFlyoutFieldValue', datasetQualityFlyoutIntegrationActionsButton: 'datasetQualityFlyoutIntegrationActionsButton', @@ -121,6 +138,10 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv await find.waitForDeletedByCssSelector('.euiBasicTable-loading', 20 * 1000); }, + async waitUntilTableInFlyoutLoaded() { + await find.waitForDeletedByCssSelector('.euiFlyoutBody .euiBasicTable-loading', 20 * 1000); + }, + async waitUntilSummaryPanelLoaded() { await testSubjects.missingOrFail(`datasetQuality-${texts.activeDatasets}-loading`); await testSubjects.missingOrFail(`datasetQuality-${texts.estimatedData}-loading`); @@ -159,6 +180,19 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv return testSubjects.find(testSubjectSelectors.datasetQualityTable); }, + getDatasetQualityFlyoutDegradedFieldTable(): Promise { + return testSubjects.find(testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable); + }, + + async getDatasetQualityFlyoutDegradedFieldTableRows(): Promise { + await this.waitUntilTableInFlyoutLoaded(); + const table = await testSubjects.find( + testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable + ); + const tBody = await table.findByTagName('tbody'); + return tBody.findAllByTagName('tr'); + }, + async refreshTable() { const filtersContainer = await testSubjects.find( testSubjectSelectors.datasetQualityFiltersContainer @@ -190,6 +224,11 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ]); }, + async parseDegradedFieldTable() { + const table = await this.getDatasetQualityFlyoutDegradedFieldTable(); + return parseDatasetTable(table, ['Field', 'Count', 'Last Occurrence']); + }, + async filterForIntegrations(integrations: string[]) { return euiSelectable.selectOnlyOptionsWithText( testSubjectSelectors.datasetQualityIntegrationsSelectableButton, diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts index 68d96070990f0..399030d1dd377 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/data/logs_data.ts @@ -139,6 +139,56 @@ export function createLogRecord( .timestamp(timestamp); } +/* +The helped function generates 2 sets of Malformed Docs for the given dataset. +1 set has more Malformed fields than the second one. This help in having different counts and hence sorting + */ +export function createDegradedFieldsRecord({ + to, + count = 1, + dataset, +}: { + to: string; + count?: number; + dataset: string; +}) { + return timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(count) + .fill(0) + .flatMap((_, index) => [ + log + .create() + .dataset(dataset) + .message(MESSAGE_LOG_LEVELS[0].message) + .logLevel(MORE_THAN_1024_CHARS) + .service(SERVICE_NAMES[0]) + .namespace(defaultNamespace) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'cloud.availability_zone': MORE_THAN_1024_CHARS, + }) + .timestamp(timestamp), + log + .create() + .dataset(dataset) + .message(MESSAGE_LOG_LEVELS[1].message) + .logLevel(MESSAGE_LOG_LEVELS[1].level) + .service(SERVICE_NAMES[0]) + .namespace(defaultNamespace) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'cloud.availability_zone': MORE_THAN_1024_CHARS, + }) + .timestamp(timestamp), + ]); + }); +} + export const datasetNames = ['synth.1', 'synth.2', 'synth.3']; export const defaultNamespace = 'default'; diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts index 2f2c40932ceaf..a79c93f922a33 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts @@ -7,7 +7,12 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { datasetNames, getInitialTestLogs, getLogsForDataset } from './data'; +import { + datasetNames, + getInitialTestLogs, + getLogsForDataset, + createDegradedFieldsRecord, +} from './data'; const integrationActions = { overview: 'Overview', @@ -31,429 +36,537 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const to = '2024-01-01T12:00:00.000Z'; const excludeKeysFromServerless = ['size']; // https://github.com/elastic/kibana/issues/178954 - // FLAKY: https://github.com/elastic/kibana/issues/183771 - describe.skip('Dataset quality flyout', function () { - this.tags(['failsOnMKI']); // Failing https://github.com/elastic/kibana/issues/183495 + describe('Dataset quality flyout', function () { + // FLAKY: https://github.com/elastic/kibana/issues/183771 + // Added this sub describe block so that the existing flaky tests can be skipped and new ones can be added in the other describe block - before(async () => { - await PageObjects.svlCommonPage.loginWithRole('admin'); - await synthtrace.index(getInitialTestLogs({ to, count: 4 })); - await PageObjects.datasetQuality.navigateTo(); - }); + describe.skip('Other dataset quality flyout tests', () => { + this.tags(['failsOnMKI']); // Failing https://github.com/elastic/kibana/issues/183495 - after(async () => { - await synthtrace.clean(); - await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); - }); + before(async () => { + await PageObjects.svlCommonPage.loginWithRole('admin'); + await synthtrace.index(getInitialTestLogs({ to, count: 4 })); + await PageObjects.datasetQuality.navigateTo(); + }); - it('opens the flyout for the right dataset', async () => { - const testDatasetName = datasetNames[1]; + after(async () => { + await synthtrace.clean(); + await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); + }); - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + it('opens the flyout for the right dataset', async () => { + const testDatasetName = datasetNames[1]; - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutTitle - ); - }); + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - // Fails on Serverless. TODO: Need to update the UI as well as the test - it.skip('shows the correct last activity', async () => { - const testDatasetName = datasetNames[0]; + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutTitle + ); + }); - // Update last activity for the dataset - await PageObjects.datasetQuality.closeFlyout(); - await synthtrace.index( - getLogsForDataset({ to: new Date().toISOString(), count: 1, dataset: testDatasetName }) - ); - await PageObjects.datasetQuality.refreshTable(); + // Fails on Serverless. TODO: Need to update the UI as well as the test + it.skip('shows the correct last activity', async () => { + const testDatasetName = datasetNames[0]; - const cols = await PageObjects.datasetQuality.parseDatasetTable(); + // Update last activity for the dataset + await PageObjects.datasetQuality.closeFlyout(); + await synthtrace.index( + getLogsForDataset({ to: new Date().toISOString(), count: 1, dataset: testDatasetName }) + ); + await PageObjects.datasetQuality.refreshTable(); - const datasetNameCol = cols['Dataset Name']; - const datasetNameColCellTexts = await datasetNameCol.getCellTexts(); + const cols = await PageObjects.datasetQuality.parseDatasetTable(); - const testDatasetRowIndex = datasetNameColCellTexts.findIndex( - (dName: string) => dName === testDatasetName - ); + const datasetNameCol = cols['Dataset Name']; + const datasetNameColCellTexts = await datasetNameCol.getCellTexts(); - const lastActivityText = (await cols['Last Activity'].getCellTexts())[testDatasetRowIndex]; + const testDatasetRowIndex = datasetNameColCellTexts.findIndex( + (dName: string) => dName === testDatasetName + ); - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + const lastActivityText = (await cols['Last Activity'].getCellTexts())[testDatasetRowIndex]; - const lastActivityTextExists = await PageObjects.datasetQuality.doestTextExistInFlyout( - lastActivityText, - `[data-test-subj=${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutFieldValue}]` - ); + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - expect(lastActivityTextExists).to.eql(true); - }); + const lastActivityTextExists = await PageObjects.datasetQuality.doestTextExistInFlyout( + lastActivityText, + `[data-test-subj=${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutFieldValue}]` + ); - // FLAKY: https://github.com/elastic/kibana/issues/180994 - it.skip('reflects the breakdown field state in url', async () => { - const testDatasetName = datasetNames[0]; - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + expect(lastActivityTextExists).to.eql(true); + }); - const breakdownField = 'service.name'; - await PageObjects.datasetQuality.selectBreakdownField(breakdownField); + // FLAKY: https://github.com/elastic/kibana/issues/180994 + it.skip('reflects the breakdown field state in url', async () => { + const testDatasetName = datasetNames[0]; + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - // Wait for URL to contain "breakdownField:service.name" - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - expect(decodeURIComponent(currentUrl)).to.contain(`breakdownField:${breakdownField}`); - }); + const breakdownField = 'service.name'; + await PageObjects.datasetQuality.selectBreakdownField(breakdownField); - // Clear breakdown field - await PageObjects.datasetQuality.selectBreakdownField('No breakdown'); + // Wait for URL to contain "breakdownField:service.name" + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + expect(decodeURIComponent(currentUrl)).to.contain(`breakdownField:${breakdownField}`); + }); - // Wait for URL to not contain "breakdownField" - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - expect(currentUrl).to.not.contain('breakdownField'); + // Clear breakdown field + await PageObjects.datasetQuality.selectBreakdownField('No breakdown'); + + // Wait for URL to not contain "breakdownField" + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + expect(currentUrl).to.not.contain('breakdownField'); + }); }); - }); - it('shows the integration details', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - const apacheIntegrationId = 'apache'; + it('shows the integration details', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + const apacheIntegrationId = 'apache'; - await PageObjects.observabilityLogsExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.datasetQuality.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - const integrationNameElements = await PageObjects.datasetQuality.getFlyoutElementsByText( - '[data-test-subj=datasetQualityFlyoutFieldValue]', - apacheIntegrationId - ); + const integrationNameElements = await PageObjects.datasetQuality.getFlyoutElementsByText( + '[data-test-subj=datasetQualityFlyoutFieldValue]', + apacheIntegrationId + ); - await PageObjects.datasetQuality.closeFlyout(); + await PageObjects.datasetQuality.closeFlyout(); - expect(integrationNameElements.length).to.eql(1); - }); + expect(integrationNameElements.length).to.eql(1); + }); - it('goes to log explorer page when open button is clicked', async () => { - const testDatasetName = datasetNames[2]; - await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); + it('goes to log explorer page when open button is clicked', async () => { + const testDatasetName = datasetNames[2]; + await PageObjects.datasetQuality.openDatasetFlyout(testDatasetName); - await (await PageObjects.datasetQuality.getFlyoutLogsExplorerButton()).click(); + await (await PageObjects.datasetQuality.getFlyoutLogsExplorerButton()).click(); - // Confirm dataset selector text in observability logs explorer - const datasetSelectorText = - await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); - expect(datasetSelectorText).to.eql(testDatasetName); - }); + // Confirm dataset selector text in observability logs explorer + const datasetSelectorText = + await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); + expect(datasetSelectorText).to.eql(testDatasetName); + }); - it('shows summary KPIs', async () => { - await PageObjects.datasetQuality.navigateTo(); + it('shows summary KPIs', async () => { + await PageObjects.datasetQuality.navigateTo(); - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - const summary = await PageObjects.datasetQuality.parseFlyoutKpis(excludeKeysFromServerless); - expect(summary).to.eql({ - docsCountTotal: '0', - // size: '0.0 B', // `_stats` not available on Serverless - services: '0', - hosts: '0', - degradedDocs: '0', + const summary = await PageObjects.datasetQuality.parseFlyoutKpis(excludeKeysFromServerless); + expect(summary).to.eql({ + docsCountTotal: '0', + // size: '0.0 B', // `_stats` not available on Serverless + services: '0', + hosts: '0', + degradedDocs: '0', + }); }); - }); - it('shows the updated KPIs', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - - const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis( - excludeKeysFromServerless - ); - - // Set time range to 3 days ago - const flyoutBodyContainer = await testSubjects.find( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutBody - ); - await PageObjects.datasetQuality.setDatePickerLastXUnits(flyoutBodyContainer, 3, 'd'); - - // Index 2 doc 2 days ago - const time2DaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; - await synthtrace.index( - getLogsForDataset({ - to: time2DaysAgo, - count: 2, - dataset: apacheAccessDatasetName, - isMalformed: false, - }) - ); - - // Index 5 degraded docs 2 days ago - await synthtrace.index( - getLogsForDataset({ - to: time2DaysAgo, - count: 5, - dataset: apacheAccessDatasetName, - isMalformed: true, - }) - ); - - await PageObjects.datasetQuality.refreshFlyout(); - const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis( - excludeKeysFromServerless - ); - - expect(parseInt(summaryAfter.docsCountTotal, 10)).to.be.greaterThan( - parseInt(summaryBefore.docsCountTotal, 10) - ); - - expect(parseInt(summaryAfter.degradedDocs, 10)).to.be.greaterThan( - parseInt(summaryBefore.degradedDocs, 10) - ); - - // `_stats` not available on Serverless so we can't compare size // https://github.com/elastic/kibana/issues/178954 - // expect(parseInt(summaryAfter.size, 10)).to.be.greaterThan(parseInt(summaryBefore.size, 10)); - - expect(parseInt(summaryAfter.services, 10)).to.be.greaterThan( - parseInt(summaryBefore.services, 10) - ); - expect(parseInt(summaryAfter.hosts, 10)).to.be.greaterThan(parseInt(summaryBefore.hosts, 10)); - }); + it('shows the updated KPIs', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - it('shows the right number of services', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - - const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis( - excludeKeysFromServerless - ); - const testServices = ['test-srv-1', 'test-srv-2']; - - // Index 2 docs with different services - const timeNow = Date.now(); - await synthtrace.index( - getLogsForDataset({ - to: timeNow, - count: 2, - dataset: apacheAccessDatasetName, - isMalformed: false, - services: testServices, - }) - ); - - await PageObjects.datasetQuality.refreshFlyout(); - const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis( - excludeKeysFromServerless - ); - - expect(parseInt(summaryAfter.services, 10)).to.eql( - parseInt(summaryBefore.services, 10) + testServices.length - ); - }); + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); - it('goes to log explorer for degraded docs when show all is clicked', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + // Set time range to 3 days ago + const flyoutBodyContainer = await testSubjects.find( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutBody + ); + await PageObjects.datasetQuality.setDatePickerLastXUnits(flyoutBodyContainer, 3, 'd'); + + // Index 2 doc 2 days ago + const time2DaysAgo = Date.now() - 2 * 24 * 60 * 60 * 1000; + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + }) + ); - const degradedDocsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.degradedDocs}`; - await testSubjects.click(degradedDocsShowAllSelector); - await browser.switchTab(1); + // Index 5 degraded docs 2 days ago + await synthtrace.index( + getLogsForDataset({ + to: time2DaysAgo, + count: 5, + dataset: apacheAccessDatasetName, + isMalformed: true, + }) + ); - // Confirm dataset selector text in observability logs explorer - const datasetSelectorText = - await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); - expect(datasetSelectorText).to.contain(apacheAccessDatasetName); + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); - await browser.closeCurrentWindow(); - await browser.switchTab(0); - }); + expect(parseInt(summaryAfter.docsCountTotal, 10)).to.be.greaterThan( + parseInt(summaryBefore.docsCountTotal, 10) + ); - // Blocked by https://github.com/elastic/kibana/issues/181705 - it.skip('goes to infra hosts for hosts when show all is clicked', async () => { - const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + expect(parseInt(summaryAfter.degradedDocs, 10)).to.be.greaterThan( + parseInt(summaryBefore.degradedDocs, 10) + ); - const hostsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.hosts}`; - await testSubjects.click(hostsShowAllSelector); - await browser.switchTab(1); + // `_stats` not available on Serverless so we can't compare size // https://github.com/elastic/kibana/issues/178954 + // expect(parseInt(summaryAfter.size, 10)).to.be.greaterThan(parseInt(summaryBefore.size, 10)); - // Confirm url contains metrics/hosts - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); - expect(parsedUrl.pathname).to.contain('/app/metrics/hosts'); + expect(parseInt(summaryAfter.services, 10)).to.be.greaterThan( + parseInt(summaryBefore.services, 10) + ); + expect(parseInt(summaryAfter.hosts, 10)).to.be.greaterThan( + parseInt(summaryBefore.hosts, 10) + ); }); - await browser.closeCurrentWindow(); - await browser.switchTab(0); - }); + it('shows the right number of services', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - it('Integration actions menu is present with correct actions', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; + const summaryBefore = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); + const testServices = ['test-srv-1', 'test-srv-2']; + + // Index 2 docs with different services + const timeNow = Date.now(); + await synthtrace.index( + getLogsForDataset({ + to: timeNow, + count: 2, + dataset: apacheAccessDatasetName, + isMalformed: false, + services: testServices, + }) + ); - await PageObjects.observabilityLogsExplorer.navigateTo(); + await PageObjects.datasetQuality.refreshFlyout(); + const summaryAfter = await PageObjects.datasetQuality.parseFlyoutKpis( + excludeKeysFromServerless + ); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + expect(parseInt(summaryAfter.services, 10)).to.eql( + parseInt(summaryBefore.services, 10) + testServices.length + ); + }); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + it('goes to log explorer for degraded docs when show all is clicked', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.navigateTo(); + const degradedDocsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.degradedDocs}`; + await testSubjects.click(degradedDocsShowAllSelector); + await browser.switchTab(1); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + // Confirm dataset selector text in observability logs explorer + const datasetSelectorText = + await PageObjects.observabilityLogsExplorer.getDataSourceSelectorButtonText(); + expect(datasetSelectorText).to.contain(apacheAccessDatasetName); - const actions = await Promise.all( - Object.values(integrationActions).map((action) => - PageObjects.datasetQuality.getIntegrationActionButtonByAction(action) - ) - ); + await browser.closeCurrentWindow(); + await browser.switchTab(0); + }); - expect(actions.length).to.eql(3); - }); + // Blocked by https://github.com/elastic/kibana/issues/181705 + it.skip('goes to infra hosts for hosts when show all is clicked', async () => { + const apacheAccessDatasetHumanName = 'Apache access logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - it('Integration dashboard action hidden for integrations without dashboards', async () => { - const bitbucketDatasetName = 'atlassian_bitbucket.audit'; - const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; + const hostsShowAllSelector = `${PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutKpiLink}-${PageObjects.datasetQuality.texts.hosts}`; + await testSubjects.click(hostsShowAllSelector); + await browser.switchTab(1); - await PageObjects.observabilityLogsExplorer.navigateTo(); + // Confirm url contains metrics/hosts + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + expect(parsedUrl.pathname).to.contain('/app/metrics/hosts'); + }); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.installPackage({ - name: 'atlassian_bitbucket', - version: '1.14.0', + await browser.closeCurrentWindow(); + await browser.switchTab(0); }); - // Index 10 logs for `atlassian_bitbucket.audit` dataset - await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); + it('Integration actions menu is present with correct actions', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); - await testSubjects.missingOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutIntegrationAction( - integrationActions.viewDashboards - ) - ); - }); + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); + + await PageObjects.datasetQuality.navigateTo(); - it('Integration overview action should navigate to the integration overview page', async () => { - const bitbucketDatasetName = 'atlassian_bitbucket.audit'; - const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); - await PageObjects.observabilityLogsExplorer.navigateTo(); + const actions = await Promise.all( + Object.values(integrationActions).map((action) => + PageObjects.datasetQuality.getIntegrationActionButtonByAction(action) + ) + ); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.installPackage({ - name: 'atlassian_bitbucket', - version: '1.14.0', + expect(actions.length).to.eql(3); }); - // Index 10 logs for `atlassian_bitbucket.audit` dataset - await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); + it('Integration dashboard action hidden for integrations without dashboards', async () => { + const bitbucketDatasetName = 'atlassian_bitbucket.audit'; + const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.installPackage({ + name: 'atlassian_bitbucket', + version: '1.14.0', + }); - const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( - integrationActions.overview - ); + // Index 10 logs for `atlassian_bitbucket.audit` dataset + await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); - await action.click(); + await PageObjects.datasetQuality.navigateTo(); - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); + await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); - expect(parsedUrl.pathname).to.contain('/app/integrations/detail/atlassian_bitbucket'); + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutIntegrationAction( + integrationActions.viewDashboards + ) + ); }); - }); - it('Integration template action should navigate to the index template page', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; + it('Integration overview action should navigate to the integration overview page', async () => { + const bitbucketDatasetName = 'atlassian_bitbucket.audit'; + const bitbucketDatasetHumanName = 'Bitbucket Audit Logs'; - await PageObjects.observabilityLogsExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + // Add initial integrations + await PageObjects.observabilityLogsExplorer.installPackage({ + name: 'atlassian_bitbucket', + version: '1.14.0', + }); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + // Index 10 logs for `atlassian_bitbucket.audit` dataset + await synthtrace.index(getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName })); - await PageObjects.datasetQuality.navigateTo(); + await PageObjects.datasetQuality.navigateTo(); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + await PageObjects.datasetQuality.openDatasetFlyout(bitbucketDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); - await retry.tryForTime(5000, async () => { const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( - integrationActions.template + integrationActions.overview ); await action.click(); - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); - expect(parsedUrl.pathname).to.contain( - `/app/management/data/index_management/templates/logs-${apacheAccessDatasetName}` + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + + expect(parsedUrl.pathname).to.contain('/app/integrations/detail/atlassian_bitbucket'); + }); + }); + + it('Integration template action should navigate to the index template page', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + + await PageObjects.observabilityLogsExplorer.navigateTo(); + + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) ); + + await PageObjects.datasetQuality.navigateTo(); + + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); + + await retry.tryForTime(5000, async () => { + const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( + integrationActions.template + ); + + await action.click(); + + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + expect(parsedUrl.pathname).to.contain( + `/app/management/data/index_management/templates/logs-${apacheAccessDatasetName}` + ); + }); + }); + + it('Integration dashboard action should navigate to the selected dashboard', async () => { + const apacheAccessDatasetName = 'apache.access'; + const apacheAccessDatasetHumanName = 'Apache access logs'; + + await PageObjects.observabilityLogsExplorer.navigateTo(); + + // Add initial integrations + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + + // Index 10 logs for `logs-apache.access` dataset + await synthtrace.index( + getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) + ); + + await PageObjects.datasetQuality.navigateTo(); + + await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); + await PageObjects.datasetQuality.openIntegrationActionsMenu(); + + const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( + integrationActions.viewDashboards + ); + + await action.click(); + + const dashboardButtons = await PageObjects.datasetQuality.getIntegrationDashboardButtons(); + const firstDashboardButton = await dashboardButtons[0]; + const dashboardText = await firstDashboardButton.getVisibleText(); + + await firstDashboardButton.click(); + + const breadcrumbText = await testSubjects.getVisibleText('breadcrumb last'); + + expect(breadcrumbText).to.eql(dashboardText); }); }); - it('Integration dashboard action should navigate to the selected dashboard', async () => { - const apacheAccessDatasetName = 'apache.access'; - const apacheAccessDatasetHumanName = 'Apache access logs'; + // The above describe block has some failing/flaky tests which will + // be fixed as part of the tech debt mentioned here + // https://github.com/elastic/kibana/issues/184145 + // Until then, the below describe block is added to cover the tests for the + // newly added degraded Fields Table. This must be merged under the above + // describe block once the tech debt is fixed. + describe('Dataset quality flyout with degraded fields', () => { + const goodDatasetName = 'good'; + const degradedDatasetName = 'degraded'; + const today = new Date().toISOString(); + before(async () => { + await PageObjects.svlCommonPage.loginWithRole('admin'); + await synthtrace.index([ + getLogsForDataset({ + to: today, + count: 2, + dataset: goodDatasetName, + isMalformed: false, + }), + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.datasetQuality.navigateTo(); + }); + + after(async () => { + await synthtrace.clean(); + }); + + it('shows the degraded fields table with no data when no degraded fields are present', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(goodDatasetName); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedTableNoData + ); + + await PageObjects.datasetQuality.closeFlyout(); + }); + + it('should load the degraded fields table with data', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - await PageObjects.observabilityLogsExplorer.navigateTo(); + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityFlyoutDegradedFieldTable + ); + + const rows = + await PageObjects.datasetQuality.getDatasetQualityFlyoutDegradedFieldTableRows(); + + expect(rows.length).to.eql(2); + + await PageObjects.datasetQuality.closeFlyout(); + }); + + it('should sort the table when the count table header is clicked', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); - // Add initial integrations - await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - // Index 10 logs for `logs-apache.access` dataset - await synthtrace.index( - getLogsForDataset({ to, count: 10, dataset: apacheAccessDatasetName }) - ); + const countColumn = table.Count; + const cellTexts = await countColumn.getCellTexts(); - await PageObjects.datasetQuality.navigateTo(); + await countColumn.sort('ascending'); + const sortedCellTexts = await countColumn.getCellTexts(); - await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - await PageObjects.datasetQuality.openIntegrationActionsMenu(); + expect(cellTexts.reverse()).to.eql(sortedCellTexts); - const action = await PageObjects.datasetQuality.getIntegrationActionButtonByAction( - integrationActions.viewDashboards - ); + await PageObjects.datasetQuality.closeFlyout(); + }); + + it('should update the table when new data is ingested and the flyout is refreshed using the time selector', async () => { + await PageObjects.datasetQuality.openDatasetFlyout(degradedDatasetName); + + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - await action.click(); + const countColumn = table.Count; + const cellTexts = await countColumn.getCellTexts(); - const dashboardButtons = await PageObjects.datasetQuality.getIntegrationDashboardButtons(); - const firstDashboardButton = await dashboardButtons[0]; - const dashboardText = await firstDashboardButton.getVisibleText(); + await synthtrace.index([ + createDegradedFieldsRecord({ + to: today, + count: 2, + dataset: degradedDatasetName, + }), + ]); - await firstDashboardButton.click(); + await PageObjects.datasetQuality.refreshFlyout(); - const breadcrumbText = await testSubjects.getVisibleText('breadcrumb last'); + const updatedCellTexts = await countColumn.getCellTexts(); - expect(breadcrumbText).to.eql(dashboardText); + const singleValuePreviously = parseInt(cellTexts[0], 10); + const singleValueNow = parseInt(updatedCellTexts[0], 10); + + expect(singleValueNow).to.be(singleValuePreviously * 2); + + await PageObjects.datasetQuality.closeFlyout(); + }); }); }); } From 405be1af73121f0b934f29f1fc29130b6b9d838a Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Wed, 29 May 2024 07:13:20 -0600 Subject: [PATCH 10/95] [ConnectionDetails] add aria-labels (#184243) ## Summary Closes https://github.com/elastic/kibana-team/issues/741 ### 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) --- .../rows/cloud_id_row/cloud_id_row.tsx | 17 +++++++++++++++-- .../endpoints_tab/rows/endpoints_url_row.tsx | 8 +++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row/cloud_id_row.tsx b/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row/cloud_id_row.tsx index 53d31baaef8f1..332f238efa904 100644 --- a/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row/cloud_id_row.tsx +++ b/packages/cloud/connection_details/tabs/endpoints_tab/rows/cloud_id_row/cloud_id_row.tsx @@ -44,7 +44,14 @@ export const CloudIdRow: React.FC = ({ {showCloudId && ( } + label={ + )} diff --git a/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx b/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx index 7eb9683b11ed6..cd4d8e428c969 100644 --- a/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx +++ b/packages/cloud/connection_details/tabs/endpoints_tab/rows/endpoints_url_row.tsx @@ -28,7 +28,13 @@ export const EndpointUrlRow: React.FC = ({ url, onCopyClick }) fullWidth data-test-subj="connectionDetailsEsUrl" > - onCopyClick?.()} /> + onCopyClick?.()} + aria-label={i18n.translate('cloud.connectionDetails.tab.endpoints.endpointField.copy', { + defaultMessage: 'Copy Elasticsearch endpoint to clipboard', + })} + /> ); }; From 2369bae38236c5677b8313a08a7b26fa8b50b9a0 Mon Sep 17 00:00:00 2001 From: Mykola Harmash Date: Wed, 29 May 2024 15:23:10 +0200 Subject: [PATCH 11/95] [Onboarding] Logs auto-detection logic in Bash (#184299) Closes https://github.com/elastic/kibana/issues/183360 Partially addresses https://github.com/elastic/kibana/issues/183361 ## Summary Adds logs auto-detection script that scans the system and prompts user to confirm their selection for logs to ingest. https://github.com/elastic/kibana/assets/793851/98aefb60-e3a4-4c19-a7bd-fdfdb8ca4af2 --- .../public/assets/auto_detect.sh | 259 ++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100755 x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh new file mode 100755 index 0000000000000..85e50b467d1eb --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/auto_detect.sh @@ -0,0 +1,259 @@ +#!/bin/bash + +known_integrations_list_string="" +selected_known_integrations_array=() +selected_known_integrations_tsv_string="" +unknown_log_file_path_list_string="" +unknown_log_file_pattern_list_string="" +selected_unknown_log_file_pattern_array=() +excluded_options_string="" +selected_unknown_log_file_pattern_tsv_string="" +custom_log_file_path_list_tsv_string="" +known_integrations_api_body_string="" +custom_integrations_api_body_string="" + +read_open_log_file_list() { + local exclude_patterns=( + "^\/Users\/.+?\/Library\/Application Support" + "^\/Users\/.+?\/Library\/Caches", + # Excluding all patterns that correspond to known integrations + # that we are detecting separately + "^\/var\/log\/nginx", + "^\/var\/log\/apache2", + "^\/var\/log\/httpd", + "^\/var\/lib\/docker\/containers", + "^\/var\/log\/syslog", + "^\/var\/log\/auth.log", + "^\/var\/log\/system.log", + "^\/var\/log\/messages", + "^\/var\/log\/secure", + ) + + local list=$(lsof -Fn | grep "\.log$" | awk '/^n/ {print substr($0, 2)}' | sort | uniq) + + # Filtering by the exclude patterns + while IFS= read -r line; do + if ! grep -qE "$(IFS="|"; echo "${exclude_patterns[*]}")" <<< "$line"; then + unknown_log_file_path_list_string+="$line\n" + fi + done <<< "$list" +} + +detect_known_integrations() { + local nginx_patterns=( + "/var/log/nginx/access.log*" + "/var/log/nginx/error.log*" + ) + + for pattern in "${nginx_patterns[@]}"; do + if compgen -G "$pattern" > /dev/null; then + known_integrations_list_string+="nginx"$'\n' + break + fi + done + + local apache_patterns=( + "/var/log/apache2/access.log*" + "/var/log/apache2/other_vhosts_access.log*" + "/var/log/apache2/error.log*" + "/var/log/httpd/access_log*" + "/var/log/httpd/error_log*" + ) + + for pattern in "${apache_patterns[@]}"; do + if compgen -G "$pattern" > /dev/null; then + known_integrations_list_string+="apache"$'\n' + break + fi + done + + if compgen -G "/var/lib/docker/containers/*/*-json.log" > /dev/null; then + known_integrations_list_string+="docker"$'\n' + fi + + local system_patterns=( + "/var/log/messages*" + "/var/log/syslog*" + "/var/log/system*" + "/var/log/auth.log*" + "/var/log/secure*" + "/var/log/system.log*" + ) + + for pattern in "${system_patterns[@]}"; do + if compgen -G "$pattern" > /dev/null; then + known_integrations_list_string+="system"$'\n' + break + fi + done +} + +known_integration_title() { + local integration=$1 + case $integration in + "nginx") + echo "Nginx Logs" + ;; + "apache") + echo "Apache Logs" + ;; + "docker") + echo "Docker Container Logs" + ;; + "system") + echo "System Logs" + ;; + *) + echo "Unknown" + ;; + esac +} + +build_unknown_log_file_patterns() { + while IFS= read -r log_file_path; do + unknown_log_file_pattern_list_string+="$(dirname "$log_file_path")/*.log\n" + done <<< "$(echo -e $unknown_log_file_path_list_string)" + + unknown_log_file_pattern_list_string=$(echo -e "$unknown_log_file_pattern_list_string" | sort -u) +} + +function select_list() { + local known_integrations_options=() + local unknown_logs_options=() + + while IFS= read -r line; do + if [[ -z "$line" ]]; then + continue + fi + known_integrations_options+=("$line") + done <<< "$known_integrations_list_string" + + while IFS= read -r line; do + if [[ -z "$line" ]]; then + continue + fi + unknown_logs_options+=("$line") + done <<< "$unknown_log_file_pattern_list_string" + + local options=("${known_integrations_options[@]}" "${unknown_logs_options[@]}") + + for i in "${!options[@]}"; do + if [[ "$i" -lt "${#known_integrations_options[@]}" ]]; then + printf "\e[32m%s)\e[0m %s\n" "$((i + 1))" "$(known_integration_title "${options[$i]}")" + else + printf "\e[32m%s)\e[0m %s\n" "$((i + 1))" "${options[$i]}" + fi + done + + echo -e "\n" + read -p "Do you want to ingest all of these logs? [Y/n] (default: Yes): " confirmation_reply + confirmation_reply="${confirmation_reply:-Y}" + + if [[ ! "$confirmation_reply" =~ ^[Yy]$ ]]; then + echo -e "\nExclude logs by listing their index numbers (e.g. 1, 2, 3):" + read exclude_index_list_string + + IFS=', ' read -r -a exclude_index_list_array <<< "$exclude_index_list_string" + + for index in "${!options[@]}"; do + local is_excluded=0 + for excluded_index in "${exclude_index_list_array[@]}"; do + if [[ "$index" -eq "$((excluded_index - 1))" ]]; then + is_excluded=1 + fi + done + + if [[ $is_excluded -eq 0 ]]; then + if [[ "$index" -lt "${#known_integrations_options[@]}" ]]; then + selected_known_integrations_array+=("${options[index]}") + else + selected_unknown_log_file_pattern_array+=("${options[index]}") + fi + else + excluded_options_string+="$((index + 1))) ${options[index]}\n" + fi + done + else + selected_known_integrations_array=("${known_integrations_options[@]}") + selected_unknown_log_file_pattern_array=("${unknown_logs_options[@]}") + fi +} + +generate_custom_integration_name() { + local path_pattern="$1" + local dir_path + local name_parts=() + local name + + dir_path=$(dirname "$path_pattern") + IFS='/' read -r -a dir_array <<< "$dir_path" + + # Get the last up to 4 parts of the path + for (( i=${#dir_array[@]}-1, count=0; i>=0 && count<4; i--, count++ )); do + name_parts=("${dir_array[$i]}" "${name_parts[@]}") + done + + # Join the parts into a single string with underscores + name=$(printf "%s_" "${name_parts[@]}") + name="${name#_}" # Remove leading underscore + name="${name%_}" # Remove trailing underscore + + # Replace special characters with underscores + name="${name// /_}" + name="${name//-/_}" + name="${name//./_}" + + echo "$name" +} + +build_known_integrations_api_body_string() { + for item in "${selected_known_integrations_array[@]}"; do + known_integrations_api_body_string+="$item\tregistry\n" + done +} + +build_custom_integrations_api_body_string() { + for item in "${selected_unknown_log_file_pattern_array[@]}" "${custom_log_file_path_list_array[@]}"; do + local integration_name=$(generate_custom_integration_name "$item") + + custom_integrations_api_body_string+="$integration_name\tcustom\t$item\n" + done +} + +echo "Looking for log files..." +detect_known_integrations +read_open_log_file_list +build_unknown_log_file_patterns + +echo -e "\nWe found these logs on your system:" +select_list + +if [[ -n "$excluded_options_string" ]]; then + echo -e "\nThese logs will not be ingested:" + echo -e "$excluded_options_string" +fi + +echo -e "\nAdd paths to any custom logs we've missed (e.g. /var/log/myapp/*.log, /home/j/myapp/*.log). Press Enter to skip." +read custom_log_file_path_list_string + +IFS=', ' read -r -a custom_log_file_path_list_array <<< "$custom_log_file_path_list_string" + +echo -e "\nYou've selected these logs to ingest:" +for item in "${selected_known_integrations_array[@]}"; do + printf "• %s\n" "$(known_integration_title "${item}")" +done +for item in "${selected_unknown_log_file_pattern_array[@]}" "${custom_log_file_path_list_array[@]}"; do + printf "• %s\n" "$item" +done + +echo -e "\n" +read -p "Confirm selection [Y/n] (default: Yes): " confirmation_reply +confirmation_reply="${confirmation_reply:-Y}" + +if [[ ! "$confirmation_reply" =~ ^[Yy]$ ]]; then + echo -e "Rerun the script again to select different logs." + exit 1 +fi + +build_known_integrations_api_body_string +build_custom_integrations_api_body_string From 09a81439df0b1218bb91b15685714aba5d864d8b Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 29 May 2024 09:42:02 -0400 Subject: [PATCH 12/95] chore(slo): Use timeslice window as interval for timeslice SLO (#184366) --- .../slo/error_rate_chart/error_rate_chart.tsx | 1 + .../error_rate_chart/use_lens_definition.ts | 7 ++- .../slo/error_rate_chart/utils.test.ts | 46 +++++++++++++++++++ .../components/slo/error_rate_chart/utils.ts | 25 ++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.test.ts create mode 100644 x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.ts diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/error_rate_chart.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/error_rate_chart.tsx index 793ebdb89ba6b..261359e1b8873 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/error_rate_chart.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/error_rate_chart.tsx @@ -43,6 +43,7 @@ export function ErrorRateChart({ slo, threshold, alertTimeRange, + dataTimeRange, annotations, showErrorRateAsLine, selectedTabId, diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/use_lens_definition.ts b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/use_lens_definition.ts index 513b26c6c2d18..d562706f78129 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/use_lens_definition.ts +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/use_lens_definition.ts @@ -12,8 +12,9 @@ import { TypedLensByValueInput } from '@kbn/lens-plugin/public'; import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; import moment from 'moment'; import { v4 as uuidv4 } from 'uuid'; -import { SloTabId } from '../../../pages/slo_details/components/slo_details'; import { SLO_DESTINATION_INDEX_PATTERN } from '../../../../common/constants'; +import { SloTabId } from '../../../pages/slo_details/components/slo_details'; +import { getLensDefinitionInterval } from './utils'; export interface TimeRange { from: Date; @@ -28,6 +29,7 @@ export interface AlertAnnotation { export function useLensDefinition({ slo, threshold, + dataTimeRange, alertTimeRange, annotations, showErrorRateAsLine, @@ -35,6 +37,7 @@ export function useLensDefinition({ }: { slo: SLOWithSummaryResponse; threshold: number; + dataTimeRange: TimeRange; alertTimeRange?: TimeRange; annotations?: AlertAnnotation[]; showErrorRateAsLine?: boolean; @@ -42,7 +45,7 @@ export function useLensDefinition({ }): TypedLensByValueInput['attributes'] { const { euiTheme } = useEuiTheme(); - const interval = 'auto'; + const interval = getLensDefinitionInterval(dataTimeRange, slo); return { title: 'SLO Error Rate', diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.test.ts b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.test.ts new file mode 100644 index 0000000000000..951b1f1ff3aed --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.test.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { buildSlo } from '../../../data/slo/slo'; +import { getLensDefinitionInterval } from './utils'; + +describe('getLensDefinitionInterval', () => { + it('returns auto when the date range is greater than 24 hours', () => { + const dataTimeRange = { + from: new Date('2021-07-01T00:00:00.000Z'), + to: new Date('2021-07-03T00:00:00.000Z'), + }; + const slo = buildSlo({ + budgetingMethod: 'timeslices', + objective: { target: 0.99, timesliceWindow: '1h', timesliceTarget: 0.98 }, + }); + expect(getLensDefinitionInterval(dataTimeRange, slo)).toBe('auto'); + }); + + it('returns auto when the SLO budgeting method is occurences', () => { + const dataTimeRange = { + from: new Date('2021-07-01T00:00:00.000Z'), + to: new Date('2021-07-03T00:00:00.000Z'), + }; + const slo = buildSlo({ + budgetingMethod: 'occurrences', + }); + expect(getLensDefinitionInterval(dataTimeRange, slo)).toBe('auto'); + }); + + it('returns the timesliceWindow when the SLO budgeting method is timeslice and range duration is lower than 24h', () => { + const dataTimeRange = { + from: new Date('2021-07-01T00:00:00.000Z'), + to: new Date('2021-07-01T23:59:00.000Z'), + }; + const slo = buildSlo({ + budgetingMethod: 'timeslices', + objective: { target: 0.99, timesliceWindow: '1h', timesliceTarget: 0.98 }, + }); + expect(getLensDefinitionInterval(dataTimeRange, slo)).toBe('1h'); + }); +}); diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.ts b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.ts new file mode 100644 index 0000000000000..31a219138f90b --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/error_rate_chart/utils.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SLOWithSummaryResponse, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; +import moment from 'moment'; +import { TimeRange } from './use_lens_definition'; + +// For a timeslice SLO +// When the date range is lower than 24 hours, we force the interval to be the timeslice window +// Greater than 24 hours, the 'auto' interval will be fine +export function getLensDefinitionInterval(dataTimeRange: TimeRange, slo: SLOWithSummaryResponse) { + const dataTimeRangeDuration = moment(dataTimeRange.to).diff(moment(dataTimeRange.from), 'ms'); + const interval = + timeslicesBudgetingMethodSchema.is(slo.budgetingMethod) && + dataTimeRangeDuration <= 86400000 && + slo.objective?.timesliceWindow + ? slo.objective.timesliceWindow + : 'auto'; + + return interval; +} From d6c2909ed4d94dbc6669d90db13cc75d6491a647 Mon Sep 17 00:00:00 2001 From: Karen Grigoryan Date: Wed, 29 May 2024 15:53:40 +0200 Subject: [PATCH 13/95] [Security Solution] add new route for fetching results by index pattern (#184297) Address #183698 This MR introduces a new internal DQD `GET` endpoint for fetching index results by pattern without aggregation in descending order by `@timestamp`: `GET /internal/ecs_data_quality_dashboard/results/:pattern` This new endpoint supports additional query params like: - `from` - es search pagination offset - `size`- es search query response size - `outcome` - es search query response filter by presence/absence of `incompatibleFieldCount` field - `startDate` - es search query response filter by `@timestamp` (inclusive) - `endDate`- es search query response filter by `@timestamp` (inclusive) This endpoint returns a list of historical index `results` sorted by `@timestamp` and a `total` number of results for facilitating pagination on client. Additionally this MR updates latest results endpoint to have simplified naming for improved consistency, lifts shared functionality into a helper function and adds necessary unit tests. In particular: - `GET /internal/ecs_data_quality_dashboard/results/indices_latest/:pattern` has been simplified to just `GET /internal/ecs_data_quality_dashboard/results_latest/:pattern`. All respective server and client code has been updated. ## How to test Example: - `GET /internal/ecs_data_quality_dashboard/results/logs-*?from=5&size=5&outcome=fail&startDate=now-1w/w&endDate=now` - `GET /internal/ecs_data_quality_dashboard/results_latest/logs-*` --- .../impl/data_quality/helpers.test.ts | 2 +- .../impl/data_quality/helpers.ts | 10 +- .../common/constants.ts | 5 +- .../helpers/get_authorized_index_names.ts | 56 ++ .../server/helpers/get_hits_total.test.ts | 32 + .../server/helpers/get_hits_total.ts | 19 + .../routes/results/get_index_results.test.ts | 548 ++++++++++++++++++ .../routes/results/get_index_results.ts | 159 +++++ ...st.ts => get_index_results_latest.test.ts} | 20 +- ..._latest.ts => get_index_results_latest.ts} | 56 +- .../server/routes/results/index.ts | 10 +- ...lts.test.ts => post_index_results.test.ts} | 18 +- ...{post_results.ts => post_index_results.ts} | 10 +- .../server/schemas/result.ts | 20 +- 14 files changed, 877 insertions(+), 88 deletions(-) create mode 100644 x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_authorized_index_names.ts create mode 100644 x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.test.ts create mode 100644 x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.ts create mode 100644 x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.test.ts create mode 100644 x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.ts rename x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/{get_results_indices_latest.test.ts => get_index_results_latest.test.ts} (93%) rename x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/{get_results_indices_latest.ts => get_index_results_latest.ts} (59%) rename x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/{post_results.test.ts => post_index_results.test.ts} (94%) rename x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/{post_results.ts => post_index_results.ts} (92%) diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.test.ts b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.test.ts index 8cec06b28d3a3..f4d44e65309f0 100644 --- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.test.ts +++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.test.ts @@ -1483,7 +1483,7 @@ describe('helpers', () => { }); expect(fetch).toHaveBeenCalledWith( - '/internal/ecs_data_quality_dashboard/results/indices_latest/auditbeat-*', + '/internal/ecs_data_quality_dashboard/results_latest/auditbeat-*', expect.objectContaining({ method: 'GET', }) diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.ts b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.ts index c34f8e35ed289..48dd12688838c 100644 --- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.ts +++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/impl/data_quality/helpers.ts @@ -456,9 +456,9 @@ export const getErrorSummaries = ( ); }; -export const RESULTS_API_ROUTE = '/internal/ecs_data_quality_dashboard/results'; -export const RESULTS_INDICES_LATEST_ROUTE = - '/internal/ecs_data_quality_dashboard/results/indices_latest/{pattern}'; +export const POST_INDEX_RESULTS = '/internal/ecs_data_quality_dashboard/results'; +export const GET_INDEX_RESULTS_LATEST = + '/internal/ecs_data_quality_dashboard/results_latest/{pattern}'; export interface StorageResult { batchId: string; @@ -544,7 +544,7 @@ export async function postStorageResult({ abortController?: AbortController; }): Promise { try { - await httpFetch(RESULTS_API_ROUTE, { + await httpFetch(POST_INDEX_RESULTS, { method: 'POST', signal: abortController.signal, version: INTERNAL_API_VERSION, @@ -567,7 +567,7 @@ export async function getStorageResults({ abortController: AbortController; }): Promise { try { - const route = RESULTS_INDICES_LATEST_ROUTE.replace('{pattern}', pattern); + const route = GET_INDEX_RESULTS_LATEST.replace('{pattern}', pattern); const results = await httpFetch(route, { method: 'GET', signal: abortController.signal, diff --git a/x-pack/plugins/ecs_data_quality_dashboard/common/constants.ts b/x-pack/plugins/ecs_data_quality_dashboard/common/constants.ts index 7c35cd9b2fbbd..32aeda5494659 100755 --- a/x-pack/plugins/ecs_data_quality_dashboard/common/constants.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/common/constants.ts @@ -13,6 +13,7 @@ export const GET_INDEX_STATS = `${BASE_PATH}/stats/{pattern}`; export const GET_INDEX_MAPPINGS = `${BASE_PATH}/mappings/{pattern}`; export const GET_UNALLOWED_FIELD_VALUES = `${BASE_PATH}/unallowed_field_values`; export const GET_ILM_EXPLAIN = `${BASE_PATH}/ilm_explain/{pattern}`; -export const RESULTS_ROUTE_PATH = `${BASE_PATH}/results`; -export const RESULTS_INDICES_LATEST_ROUTE_PATH = `${BASE_PATH}/results/indices_latest/{pattern}`; +export const POST_INDEX_RESULTS = `${BASE_PATH}/results`; +export const GET_INDEX_RESULTS = `${BASE_PATH}/results/{pattern}`; +export const GET_INDEX_RESULTS_LATEST = `${BASE_PATH}/results_latest/{pattern}`; export const INTERNAL_API_VERSION = '1'; diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_authorized_index_names.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_authorized_index_names.ts new file mode 100644 index 0000000000000..5078915e22a9c --- /dev/null +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_authorized_index_names.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 type { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { checkIndicesPrivileges } from '../routes/results/privileges'; + +export const getAuthorizedIndexNames = async ( + client: IScopedClusterClient, + pattern: string +): Promise => { + // Discover all indices for the pattern using internal user + const indicesResponse = await client.asInternalUser.indices.get({ + index: pattern, + features: 'aliases', // omit 'settings' and 'mappings' to reduce response size + }); + + // map data streams to their backing indices and collect indices to authorize + const indicesToAuthorize: string[] = []; + const dataStreamIndices: Record = {}; + Object.entries(indicesResponse).forEach(([indexName, { data_stream: dataStream }]) => { + if (dataStream) { + if (!dataStreamIndices[dataStream]) { + dataStreamIndices[dataStream] = []; + } + dataStreamIndices[dataStream].push(indexName); + } else { + indicesToAuthorize.push(indexName); + } + }); + indicesToAuthorize.push(...Object.keys(dataStreamIndices)); + if (indicesToAuthorize.length === 0) { + return []; + } + + // check privileges for indices or data streams + const hasIndexPrivileges = await checkIndicesPrivileges({ + client, + indices: indicesToAuthorize, + }); + + // filter out unauthorized indices, and expand data streams backing indices + return Object.entries(hasIndexPrivileges).reduce((acc, [indexName, authorized]) => { + if (authorized) { + if (dataStreamIndices[indexName]) { + acc.push(...dataStreamIndices[indexName]); + } else { + acc.push(indexName); + } + } + return acc; + }, []); +}; diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.test.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.test.ts new file mode 100644 index 0000000000000..a17bd18ed46ff --- /dev/null +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.test.ts @@ -0,0 +1,32 @@ +/* + * 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 { SearchHitsMetadata } from '@elastic/elasticsearch/lib/api/types'; +import { getHitsTotal } from './get_hits_total'; + +describe('getHitsTotal', () => { + describe('when hits.total is number', () => { + it('should return it', () => { + const hits = { total: 5 } as SearchHitsMetadata; + expect(getHitsTotal(hits)).toBe(5); + }); + }); + + describe('when hits.total is object', () => { + it('should return hits.total.value', () => { + const hits = { total: { value: 10 } } as SearchHitsMetadata; + expect(getHitsTotal(hits)).toBe(10); + }); + }); + + describe('when hits.total is 0', () => { + it('should return it', () => { + const hits = { total: 0 } as SearchHitsMetadata; + expect(getHitsTotal(hits)).toBe(0); + }); + }); +}); diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.ts new file mode 100644 index 0000000000000..a83c7575ccc4b --- /dev/null +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/helpers/get_hits_total.ts @@ -0,0 +1,19 @@ +/* + * 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 { SearchHitsMetadata } from '@elastic/elasticsearch/lib/api/types'; + +export const getHitsTotal = (hits: T): number | undefined => { + const hitsTotal = hits.total; + if (hitsTotal != null) { + if (typeof hitsTotal === 'object') { + return hitsTotal.value; + } else { + return hitsTotal; + } + } +}; diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.test.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.test.ts new file mode 100644 index 0000000000000..403a721db6286 --- /dev/null +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.test.ts @@ -0,0 +1,548 @@ +/* + * 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 { GET_INDEX_RESULTS } from '../../../common/constants'; +import { serverMock } from '../../__mocks__/server'; +import { requestMock } from '../../__mocks__/request'; +import { requestContextMock } from '../../__mocks__/request_context'; +import { loggerMock } from '@kbn/logging-mocks'; +import { resultDocument } from './results.mock'; + +import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; +import type { ResultDocument } from '../../schemas/result'; +import type { CheckIndicesPrivilegesParam } from './privileges'; +import { getIndexResultsRoute, getQuery } from './get_index_results'; + +const searchResponse = { + hits: { total: { value: 1 }, hits: [{ _source: resultDocument }] }, +} as unknown as SearchResponse; + +const mockCheckIndicesPrivileges = jest.fn(({ indices }: CheckIndicesPrivilegesParam) => + Promise.resolve(Object.fromEntries(indices.map((index) => [index, true]))) +); + +jest.mock('./privileges', () => ({ + checkIndicesPrivileges: (params: CheckIndicesPrivilegesParam) => + mockCheckIndicesPrivileges(params), +})); + +const createTestSetup = () => { + const server = serverMock.create(); + const logger = loggerMock.create(); + const { context } = requestContextMock.createTools(); + + context.core.elasticsearch.client.asInternalUser.indices.get.mockResolvedValue({ + [resultDocument.indexName]: {}, + }); + context.core.elasticsearch.client.asInternalUser.search.mockResolvedValue(searchResponse); + getIndexResultsRoute(server.router, logger); + + return { server, context, logger }; +}; + +describe('getIndexResultsRoute route', () => { + beforeEach(() => jest.clearAllMocks()); + describe('when querying', () => { + describe('when the request is successful', () => { + it('returns the result with total', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + ...getQuery({ indexNames: [resultDocument.indexName] }), + }); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ data: [resultDocument], total: 1 }); + }); + }); + + describe('when there is a results data stream error', () => { + it('returns a 503 error', async () => { + const { server, context, logger } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const errorMessage = 'Installation Error!'; + + context.dataQualityDashboard.getResultsIndexName.mockRejectedValueOnce( + new Error(errorMessage) + ); + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(response.status).toEqual(503); + expect(response.body).toEqual({ + message: expect.stringContaining(errorMessage), + status_code: 503, + }); + expect(logger.error).toHaveBeenCalledWith(expect.stringContaining(errorMessage)); + }); + }); + + describe('when there is a search error', () => { + it('returns a 500 error', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const errorMessage = 'Error!'; + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockRejectedValueOnce({ message: errorMessage }); + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(response.status).toEqual(500); + expect(response.body).toEqual({ message: errorMessage, status_code: 500 }); + }); + }); + + describe('given a "from" parameter', () => { + it('calls search with "from" option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { from: '10' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + from: 10, + index: expect.any(String), + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + + describe('given a "size" parameter', () => { + it('calls search with "size" option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { size: '5' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + size: 5, + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + + describe('given an "outcome=pass" parameter', () => { + it('calls search with "incompatibleFieldCount < 1" range option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { outcome: 'pass' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + { + range: { + incompatibleFieldCount: { lt: 1 }, + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + + describe('given an "outcome=fail" parameter', () => { + it('calls search with "incompatibleFieldCount > 0" range option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { outcome: 'fail' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + { + range: { + incompatibleFieldCount: { gt: 0 }, + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + + describe('given a "startDate" parameter', () => { + it('calls search with "@timestamp >= starDate" range option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { startDate: '2023-01-01T00:00:00Z' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + { + range: { + '@timestamp': { + gte: '2023-01-01T00:00:00Z', + }, + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + + describe('given an "endDate" parameter', () => { + it('calls search with "@timestamp <= endDate" range option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { endDate: '2023-12-31T23:59:59Z' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + { + range: { + '@timestamp': { + lte: '2023-12-31T23:59:59Z', + }, + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + + describe('given both "startDate" and "endDate" parameters', () => { + it('calls search with "@timestamp >= startDate && <= endDate" range option', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + query: { startDate: '2023-01-01T00:00:00Z', endDate: '2023-12-31T23:59:59Z' }, + }); + + const mockSearch = context.core.elasticsearch.client.asInternalUser.search; + mockSearch.mockResolvedValueOnce(searchResponse); + await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockSearch).toHaveBeenCalledWith({ + index: expect.any(String), + + query: { + bool: { + filter: [ + { + terms: { + indexName: [resultDocument.indexName], + }, + }, + { + range: { + '@timestamp': { + gte: '2023-01-01T00:00:00Z', + lte: '2023-12-31T23:59:59Z', + }, + }, + }, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + }); + }); + }); + }); + + describe('when requesting indices authorization', () => { + describe('when indices are authorized from pattern', () => { + it('returns the result', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const mockGetIndices = context.core.elasticsearch.client.asInternalUser.indices.get; + mockGetIndices.mockResolvedValueOnce({ [resultDocument.indexName]: {} }); + const response = await server.inject(req, requestContextMock.convertContext(context)); + expect(mockGetIndices).toHaveBeenCalledWith({ index: 'logs-*', features: 'aliases' }); + expect(mockCheckIndicesPrivileges).toHaveBeenCalledWith( + expect.objectContaining({ indices: [resultDocument.indexName] }) + ); + + expect(context.core.elasticsearch.client.asInternalUser.search).toHaveBeenCalled(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ data: [resultDocument], total: 1 }); + }); + }); + + describe('when data streams are authorized from pattern', () => { + it('returns the result', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const dataStreamName = 'test_data_stream_name'; + const resultIndexNameTwo = `${resultDocument.indexName}_2`; + const resultIndexNameThree = `${resultDocument.indexName}_3`; + const mockGetIndices = context.core.elasticsearch.client.asInternalUser.indices.get; + + mockGetIndices.mockResolvedValueOnce({ + [resultDocument.indexName]: {}, + [resultIndexNameTwo]: { data_stream: dataStreamName }, + [resultIndexNameThree]: { data_stream: dataStreamName }, + }); + + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockGetIndices).toHaveBeenCalledWith({ index: 'logs-*', features: 'aliases' }); + expect(mockCheckIndicesPrivileges).toHaveBeenCalledWith( + expect.objectContaining({ indices: [resultDocument.indexName, dataStreamName] }) + ); + expect(context.core.elasticsearch.client.asInternalUser.search).toHaveBeenCalledWith({ + index: expect.any(String), + ...getQuery({ + indexNames: [resultDocument.indexName, resultIndexNameTwo, resultIndexNameThree], + }), + }); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ data: [resultDocument], total: 1 }); + }); + }); + + describe('when no indices are found', () => { + it('does not search and returns an empty array', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const mockGetIndices = context.core.elasticsearch.client.asInternalUser.indices.get; + mockGetIndices.mockResolvedValueOnce({}); // empty object means no index is found + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(mockCheckIndicesPrivileges).not.toHaveBeenCalled(); + expect(context.core.elasticsearch.client.asInternalUser.search).not.toHaveBeenCalled(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ data: [], total: 0 }); + }); + }); + + describe('when indices are unauthorized', () => { + it('does not search and returns an empty array', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + mockCheckIndicesPrivileges.mockResolvedValueOnce({}); // empty object means no index is authorized + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(context.core.elasticsearch.client.asInternalUser.search).not.toHaveBeenCalled(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ data: [], total: 0 }); + }); + }); + + describe('when there is an index discovery error', () => { + it('returns a 500 error', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const errorMessage = 'Error!'; + const mockGetIndices = context.core.elasticsearch.client.asInternalUser.indices.get; + mockGetIndices.mockRejectedValueOnce({ message: errorMessage }); + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(response.status).toEqual(500); + expect(response.body).toEqual({ message: errorMessage, status_code: 500 }); + }); + }); + + describe('when there is an index authorization error', () => { + it('returns a 500 error', async () => { + const { server, context } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: { pattern: 'logs-*' }, + }); + + const errorMessage = 'Error!'; + mockCheckIndicesPrivileges.mockRejectedValueOnce({ message: errorMessage }); + const response = await server.inject(req, requestContextMock.convertContext(context)); + + expect(response.status).toEqual(500); + expect(response.body).toEqual({ message: errorMessage, status_code: 500 }); + }); + }); + }); + + describe('when validating request', () => { + describe('when path param is invalid', () => { + it('returns a bad request error', () => { + const { server } = createTestSetup(); + + const req = requestMock.create({ + method: 'get', + path: GET_INDEX_RESULTS, + params: {}, + }); + + const result = server.validate(req); + + expect(result.badRequest).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.ts new file mode 100644 index 0000000000000..bbab7dede3c21 --- /dev/null +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.ts @@ -0,0 +1,159 @@ +/* + * 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 { IRouter, Logger } from '@kbn/core/server'; + +import type { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; +import { INTERNAL_API_VERSION, GET_INDEX_RESULTS } from '../../../common/constants'; +import { buildResponse } from '../../lib/build_response'; +import { buildRouteValidation } from '../../schemas/common'; +import type { ResultDocument } from '../../schemas/result'; +import { GetIndexResultsQuery, GetIndexResultsParams } from '../../schemas/result'; +import type { DataQualityDashboardRequestHandlerContext } from '../../types'; +import { API_RESULTS_INDEX_NOT_AVAILABLE } from './translations'; +import { API_DEFAULT_ERROR_MESSAGE } from '../../translations'; +import { getAuthorizedIndexNames } from '../../helpers/get_authorized_index_names'; +import { getHitsTotal } from '../../helpers/get_hits_total'; + +interface GetQuery { + indexNames: string[]; + size?: number; + from?: number; + outcome?: 'pass' | 'fail'; + startDate?: string; + endDate?: string; +} + +export const getQuery = ({ + indexNames, + size, + from, + outcome, + startDate, + endDate, +}: GetQuery): SearchRequest => { + const filters = []; + + if (outcome !== undefined) { + const incompatibleFieldCountValueFilter = outcome === 'pass' ? { lt: 1 } : { gt: 0 }; + filters.push({ + range: { + incompatibleFieldCount: incompatibleFieldCountValueFilter, + }, + }); + } + + if (startDate || endDate) { + const startDateValueFilter = startDate && { gte: startDate }; + const endDateValueFilter = endDate && { lte: endDate }; + filters.push({ + range: { + '@timestamp': { + ...startDateValueFilter, + ...endDateValueFilter, + }, + }, + }); + } + + return { + query: { + bool: { + filter: [ + { + terms: { + indexName: indexNames, + }, + }, + ...filters, + ], + }, + }, + sort: [{ '@timestamp': 'desc' }], + ...(size != null && { size }), + ...(from != null && { from }), + }; +}; + +export const getIndexResultsRoute = ( + router: IRouter, + logger: Logger +) => { + router.versioned + .get({ + path: GET_INDEX_RESULTS, + access: 'internal', + options: { tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: INTERNAL_API_VERSION, + validate: { + request: { + params: buildRouteValidation(GetIndexResultsParams), + query: buildRouteValidation(GetIndexResultsQuery), + }, + }, + }, + async (context, request, response) => { + const services = await context.resolve(['core', 'dataQualityDashboard']); + const resp = buildResponse(response); + + let index: string; + try { + index = await services.dataQualityDashboard.getResultsIndexName(); + } catch (err) { + logger.error(`[GET results] Error retrieving results index name: ${err.message}`); + return resp.error({ + body: `${API_RESULTS_INDEX_NOT_AVAILABLE}: ${err.message}`, + statusCode: 503, + }); + } + + try { + const { client } = services.core.elasticsearch; + const { pattern } = request.params; + + const authorizedIndexNames = await getAuthorizedIndexNames(client, pattern); + + if (authorizedIndexNames.length === 0) { + return response.ok({ body: { data: [], total: 0 } }); + } + + const { from, size, startDate, endDate, outcome } = request.query; + // Get all results for all index names + const query = { + index, + ...getQuery({ + indexNames: authorizedIndexNames, + from, + size, + startDate, + endDate, + outcome, + }), + }; + const { hits } = await client.asInternalUser.search(query); + + const resultsWithUndefined = hits.hits.map((doc) => doc._source) ?? []; + + const resultsWithoutUndefined = resultsWithUndefined.filter((r) => r); + + return response.ok({ + body: { data: resultsWithoutUndefined, total: getHitsTotal(hits) }, + }); + } catch (err) { + logger.error(err.message); + + return resp.error({ + body: err.message ?? API_DEFAULT_ERROR_MESSAGE, + statusCode: err.statusCode ?? 500, + }); + } + } + ); +}; diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.test.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.test.ts similarity index 93% rename from x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.test.ts rename to x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.test.ts index 7aad4c347a8cb..bfb38864916fe 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.test.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.test.ts @@ -4,13 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { RESULTS_INDICES_LATEST_ROUTE_PATH } from '../../../common/constants'; +import { GET_INDEX_RESULTS_LATEST } from '../../../common/constants'; import { serverMock } from '../../__mocks__/server'; import { requestMock } from '../../__mocks__/request'; import { requestContextMock } from '../../__mocks__/request_context'; -import type { LatestAggResponseBucket } from './get_results_indices_latest'; -import { getResultsIndicesLatestRoute, getQuery } from './get_results_indices_latest'; +import type { LatestAggResponseBucket } from './get_index_results_latest'; +import { getIndexResultsLatestRoute, getQuery } from './get_index_results_latest'; import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; import { resultDocument } from './results.mock'; import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; @@ -41,7 +41,7 @@ jest.mock('./privileges', () => ({ mockCheckIndicesPrivileges(params), })); -describe('getResultsIndicesLatestRoute route', () => { +describe('getIndexResultsLatestRoute route', () => { describe('querying', () => { let server: ReturnType; let { context } = requestContextMock.createTools(); @@ -49,7 +49,7 @@ describe('getResultsIndicesLatestRoute route', () => { const req = requestMock.create({ method: 'get', - path: RESULTS_INDICES_LATEST_ROUTE_PATH, + path: GET_INDEX_RESULTS_LATEST, params: { pattern: 'logs-*' }, }); @@ -65,7 +65,7 @@ describe('getResultsIndicesLatestRoute route', () => { [resultDocument.indexName]: {}, }); - getResultsIndicesLatestRoute(server.router, logger); + getIndexResultsLatestRoute(server.router, logger); }); it('gets result', async () => { @@ -114,7 +114,7 @@ describe('getResultsIndicesLatestRoute route', () => { const req = requestMock.create({ method: 'get', - path: RESULTS_INDICES_LATEST_ROUTE_PATH, + path: GET_INDEX_RESULTS_LATEST, params: { pattern: 'logs-*' }, }); @@ -132,7 +132,7 @@ describe('getResultsIndicesLatestRoute route', () => { [resultDocument.indexName]: {}, }); - getResultsIndicesLatestRoute(server.router, logger); + getIndexResultsLatestRoute(server.router, logger); }); it('should authorize indices from pattern', async () => { @@ -225,13 +225,13 @@ describe('getResultsIndicesLatestRoute route', () => { beforeEach(() => { server = serverMock.create(); logger = loggerMock.create(); - getResultsIndicesLatestRoute(server.router, logger); + getIndexResultsLatestRoute(server.router, logger); }); test('disallows invalid path param', () => { const req = requestMock.create({ method: 'get', - path: RESULTS_INDICES_LATEST_ROUTE_PATH, + path: GET_INDEX_RESULTS_LATEST, params: {}, }); const result = server.validate(req); diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.ts similarity index 59% rename from x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.ts rename to x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.ts index a4508e1471b3b..55ff8e01a01dc 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.ts @@ -7,15 +7,15 @@ import type { IRouter, Logger } from '@kbn/core/server'; -import { INTERNAL_API_VERSION, RESULTS_INDICES_LATEST_ROUTE_PATH } from '../../../common/constants'; +import { INTERNAL_API_VERSION, GET_INDEX_RESULTS_LATEST } from '../../../common/constants'; import { buildResponse } from '../../lib/build_response'; import { buildRouteValidation } from '../../schemas/common'; -import { GetResultParams } from '../../schemas/result'; +import { GetIndexResultsLatestParams } from '../../schemas/result'; import type { ResultDocument } from '../../schemas/result'; import { API_DEFAULT_ERROR_MESSAGE } from '../../translations'; import type { DataQualityDashboardRequestHandlerContext } from '../../types'; import { API_RESULTS_INDEX_NOT_AVAILABLE } from './translations'; -import { checkIndicesPrivileges } from './privileges'; +import { getAuthorizedIndexNames } from '../../helpers/get_authorized_index_names'; export const getQuery = (indexName: string[]) => ({ size: 0, @@ -33,13 +33,13 @@ export interface LatestAggResponseBucket { latest_doc: { hits: { hits: Array<{ _source: ResultDocument }> } }; } -export const getResultsIndicesLatestRoute = ( +export const getIndexResultsLatestRoute = ( router: IRouter, logger: Logger ) => { router.versioned .get({ - path: RESULTS_INDICES_LATEST_ROUTE_PATH, + path: GET_INDEX_RESULTS_LATEST, access: 'internal', options: { tags: ['access:securitySolution'] }, }) @@ -48,7 +48,7 @@ export const getResultsIndicesLatestRoute = ( version: INTERNAL_API_VERSION, validate: { request: { - params: buildRouteValidation(GetResultParams), + params: buildRouteValidation(GetIndexResultsLatestParams), }, }, }, @@ -71,50 +71,8 @@ export const getResultsIndicesLatestRoute = ( const { client } = services.core.elasticsearch; const { pattern } = request.params; - // Discover all indices for the pattern using internal user - const indicesResponse = await client.asInternalUser.indices.get({ - index: pattern, - features: 'aliases', // omit 'settings' and 'mappings' to reduce response size - }); - - // map data streams to their backing indices and collect indices to authorize - const indicesToAuthorize: string[] = []; - const dataStreamIndices: Record = {}; - Object.entries(indicesResponse).forEach(([indexName, { data_stream: dataStream }]) => { - if (dataStream) { - if (!dataStreamIndices[dataStream]) { - dataStreamIndices[dataStream] = []; - } - dataStreamIndices[dataStream].push(indexName); - } else { - indicesToAuthorize.push(indexName); - } - }); - indicesToAuthorize.push(...Object.keys(dataStreamIndices)); - if (indicesToAuthorize.length === 0) { - return response.ok({ body: [] }); - } - - // check privileges for indices or data streams - const hasIndexPrivileges = await checkIndicesPrivileges({ - client, - indices: indicesToAuthorize, - }); + const authorizedIndexNames = await getAuthorizedIndexNames(client, pattern); - // filter out unauthorized indices, and expand data streams backing indices - const authorizedIndexNames = Object.entries(hasIndexPrivileges).reduce( - (acc, [indexName, authorized]) => { - if (authorized) { - if (dataStreamIndices[indexName]) { - acc.push(...dataStreamIndices[indexName]); - } else { - acc.push(indexName); - } - } - return acc; - }, - [] - ); if (authorizedIndexNames.length === 0) { return response.ok({ body: [] }); } diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/index.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/index.ts index d403ece283b1d..6fb1c7ce87222 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/index.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/index.ts @@ -7,14 +7,16 @@ import type { IRouter, Logger } from '@kbn/core/server'; -import { postResultsRoute } from './post_results'; -import { getResultsIndicesLatestRoute } from './get_results_indices_latest'; +import { postIndexResultsRoute } from './post_index_results'; +import { getIndexResultsLatestRoute } from './get_index_results_latest'; import type { DataQualityDashboardRequestHandlerContext } from '../../types'; +import { getIndexResultsRoute } from './get_index_results'; export const resultsRoutes = ( router: IRouter, logger: Logger ) => { - postResultsRoute(router, logger); - getResultsIndicesLatestRoute(router, logger); + postIndexResultsRoute(router, logger); + getIndexResultsLatestRoute(router, logger); + getIndexResultsRoute(router, logger); }; diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.test.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.test.ts similarity index 94% rename from x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.test.ts rename to x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.test.ts index 1c38b86f9766c..b06e86c8a0c8e 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.test.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.test.ts @@ -4,12 +4,12 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { RESULTS_ROUTE_PATH } from '../../../common/constants'; +import { POST_INDEX_RESULTS } from '../../../common/constants'; import { serverMock } from '../../__mocks__/server'; import { requestMock } from '../../__mocks__/request'; import { requestContextMock } from '../../__mocks__/request_context'; -import { postResultsRoute } from './post_results'; +import { postIndexResultsRoute } from './post_index_results'; import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; import type { WriteResponseBase } from '@elastic/elasticsearch/lib/api/types'; import { resultDocument } from './results.mock'; @@ -27,7 +27,7 @@ jest.mock('./privileges', () => ({ const USER_PROFILE_UID = 'mocked_profile_uid'; -describe('postResultsRoute route', () => { +describe('postIndexResultsRoute route', () => { describe('indexation', () => { let server: ReturnType; let { context } = requestContextMock.createTools(); @@ -35,7 +35,7 @@ describe('postResultsRoute route', () => { const req = requestMock.create({ method: 'post', - path: RESULTS_ROUTE_PATH, + path: POST_INDEX_RESULTS, body: resultDocument, }); @@ -53,7 +53,7 @@ describe('postResultsRoute route', () => { context.core.security.authc.getCurrentUser.mockReturnValue({ profile_uid: USER_PROFILE_UID, } as AuthenticatedUser); - postResultsRoute(server.router, logger); + postIndexResultsRoute(server.router, logger); }); it('indexes result', async () => { @@ -110,7 +110,7 @@ describe('postResultsRoute route', () => { const req = requestMock.create({ method: 'post', - path: RESULTS_ROUTE_PATH, + path: POST_INDEX_RESULTS, body: resultDocument, }); @@ -132,7 +132,7 @@ describe('postResultsRoute route', () => { result: 'created', } as WriteResponseBase); - postResultsRoute(server.router, logger); + postIndexResultsRoute(server.router, logger); }); it('should authorize index', async () => { @@ -193,13 +193,13 @@ describe('postResultsRoute route', () => { beforeEach(() => { server = serverMock.create(); logger = loggerMock.create(); - postResultsRoute(server.router, logger); + postIndexResultsRoute(server.router, logger); }); test('disallows invalid pattern', () => { const req = requestMock.create({ method: 'post', - path: RESULTS_ROUTE_PATH, + path: POST_INDEX_RESULTS, body: { indexName: 'invalid body' }, }); const result = server.validate(req); diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.ts similarity index 92% rename from x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.ts rename to x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.ts index 20deaa158e829..5e87cadb4dadf 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.ts @@ -7,29 +7,29 @@ import type { IRouter, Logger } from '@kbn/core/server'; -import { RESULTS_ROUTE_PATH, INTERNAL_API_VERSION } from '../../../common/constants'; +import { POST_INDEX_RESULTS, INTERNAL_API_VERSION } from '../../../common/constants'; import { buildResponse } from '../../lib/build_response'; import { buildRouteValidation } from '../../schemas/common'; -import { PostResultBody } from '../../schemas/result'; +import { PostIndexResultBody } from '../../schemas/result'; import { API_CURRENT_USER_ERROR_MESSAGE, API_DEFAULT_ERROR_MESSAGE } from '../../translations'; import type { DataQualityDashboardRequestHandlerContext } from '../../types'; import { checkIndicesPrivileges } from './privileges'; import { API_RESULTS_INDEX_NOT_AVAILABLE } from './translations'; -export const postResultsRoute = ( +export const postIndexResultsRoute = ( router: IRouter, logger: Logger ) => { router.versioned .post({ - path: RESULTS_ROUTE_PATH, + path: POST_INDEX_RESULTS, access: 'internal', options: { tags: ['access:securitySolution'] }, }) .addVersion( { version: INTERNAL_API_VERSION, - validate: { request: { body: buildRouteValidation(PostResultBody) } }, + validate: { request: { body: buildRouteValidation(PostIndexResultBody) } }, }, async (context, request, response) => { const services = await context.resolve(['core', 'dataQualityDashboard']); diff --git a/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts b/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts index 055930d82cefb..c16a3d806b1bd 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts +++ b/x-pack/plugins/ecs_data_quality_dashboard/server/schemas/result.ts @@ -7,6 +7,8 @@ import * as t from 'io-ts'; +import { StringToPositiveNumber } from '@kbn/securitysolution-io-ts-types'; + const ResultDocumentInterface = t.interface({ batchId: t.string, indexName: t.string, @@ -37,7 +39,19 @@ const ResultDocumentOptional = t.partial({ export const ResultDocument = t.intersection([ResultDocumentInterface, ResultDocumentOptional]); export type ResultDocument = t.TypeOf; -export const PostResultBody = ResultDocument; +export const PostIndexResultBody = ResultDocument; + +export const GetIndexResultsLatestParams = t.type({ pattern: t.string }); +export type GetIndexResultsLatestParams = t.TypeOf; -export const GetResultParams = t.type({ pattern: t.string }); -export type GetResultParams = t.TypeOf; +export const GetIndexResultsParams = t.type({ + pattern: t.string, +}); + +export const GetIndexResultsQuery = t.partial({ + size: StringToPositiveNumber, + from: StringToPositiveNumber, + startDate: t.string, + endDate: t.string, + outcome: t.union([t.literal('pass'), t.literal('fail')]), +}); From e8cdde2fb63338f02c6f3b086ef59804f9ea75b1 Mon Sep 17 00:00:00 2001 From: elena-shostak <165678770+elena-shostak@users.noreply.github.com> Date: Wed, 29 May 2024 15:55:21 +0200 Subject: [PATCH 14/95] [Spaces] Added disabled features back to mappings (#184195) ## Summary We aggregate on disabledFeatures in [Spaces Usage Collector](https://github.com/elastic/kibana/blob/5e95a7679681467b763b106ee5a03d0af643c8bc/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#L38), but field was removed from mappings. Added `disabledFeatures` back to mappings. ### How to Test 1. Create a couple of spaces with disabled features. ``` POST kbn:/api/spaces/space { "name": "my-space-1", "id": "my-space-1", "description": "a description", "color": "#5c5959", "disabledFeatures": ["canvas", "discover"] } POST kbn:/api/spaces/space { "name": "my-space-2", "id": "my-space-2", "description": "a description", "color": "#5c5959", "disabledFeatures": ["savedObjectsManagement", "canvas"] } ``` 2. Make a request to stats endpoint and check that `disabledFeatures` counters. ``` POST kbn:/internal/telemetry/clusters/_stats { "unencrypted": true, "refreshCache": true } ``` ### Checklist - [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) __Fixes: https://github.com/elastic/kibana/issues/184194__ ## Release note Added `disabledFeatures` back to mappings, so it can be aggregated on. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../current_fields.json | 1 + .../current_mappings.json | 3 + .../check_registered_types.test.ts | 2 +- .../group3/migration_from_older_v1.test.ts | 4 +- .../spaces/server/saved_objects/mappings.ts | 3 + .../saved_objects_service.test.ts | 8 +- .../saved_objects/saved_objects_service.ts | 10 +++ .../spaces_api_integration/common/config.ts | 1 + .../spaces_api_integration/common/services.ts | 1 + .../spaces_only/config.ts | 6 +- .../spaces_only/telemetry/index.ts | 15 ++++ .../spaces_only/telemetry/telemetry.ts | 87 +++++++++++++++++++ 12 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 x-pack/test/spaces_api_integration/spaces_only/telemetry/index.ts create mode 100644 x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index e743f325ff441..c6f25e7452bfc 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -932,6 +932,7 @@ ], "slo-settings": [], "space": [ + "disabledFeatures", "name", "solution" ], diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 3e38e78694dad..76d4b7a4197be 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -3058,6 +3058,9 @@ "space": { "dynamic": false, "properties": { + "disabledFeatures": { + "type": "keyword" + }, "name": { "fields": { "keyword": { 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 be06461d0015d..907afad243ac3 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 @@ -149,7 +149,7 @@ describe('checking migration metadata changes on all registered SO types', () => "siem-ui-timeline-pinned-event": "082daa3ce647b33873f6abccf340bdfa32057c8d", "slo": "9a9995e4572de1839651c43b5fc4dc8276bb5815", "slo-settings": "f6b5ed339470a6a2cda272bde1750adcf504a11b", - "space": "d38fa4bc669b9b1d6ec86aac2983d4c6675723ed", + "space": "953a72d8962d829e7ea465849297c5e44d8e9a2d", "spaces-usage-stats": "3abca98713c52af8b30300e386c7779b3025a20e", "synthetics-monitor": "5ceb25b6249bd26902c9b34273c71c3dce06dbea", "synthetics-param": "3ebb744e5571de678b1312d5c418c8188002cf5e", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts index 186a90e47da71..d32c2f0902b4e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts @@ -139,9 +139,7 @@ describe('migrating from 7.3.0-xpack which used v1 migrations', () => { typeof modelVersions === 'function' ? modelVersions() : modelVersions ?? {}; Object.entries(modelVersionCreateSchemas).forEach(([key, modelVersion]) => { - if (modelVersion.schemas?.create) { - migrationsKeys.push(modelVersionToVirtualVersion(key)); - } + migrationsKeys.push(modelVersionToVirtualVersion(key)); }); const highestVersion = migrationsKeys.sort(Semver.compare).reverse()[0]; diff --git a/x-pack/plugins/spaces/server/saved_objects/mappings.ts b/x-pack/plugins/spaces/server/saved_objects/mappings.ts index 6f4313c3b1ed5..9422109e64984 100644 --- a/x-pack/plugins/spaces/server/saved_objects/mappings.ts +++ b/x-pack/plugins/spaces/server/saved_objects/mappings.ts @@ -22,6 +22,9 @@ export const SpacesSavedObjectMappings = deepFreeze({ solution: { type: 'keyword', }, + disabledFeatures: { + type: 'keyword', + }, }, } as const); diff --git a/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.test.ts b/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.test.ts index c32fb2bc2854f..55a745afa3a00 100644 --- a/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.test.ts +++ b/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.test.ts @@ -25,7 +25,13 @@ describe('SpacesSavedObjectsService', () => { 1, expect.objectContaining({ name: 'space', - mappings: expect.any(Object), + mappings: expect.objectContaining({ + properties: expect.objectContaining({ + disabledFeatures: expect.any(Object), + name: expect.any(Object), + solution: expect.any(Object), + }), + }), schemas: { '8.8.0': expect.any(Object) }, }) ); diff --git a/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.ts b/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.ts index 1cdfa00d63238..eb038d03e21aa 100644 --- a/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.ts +++ b/x-pack/plugins/spaces/server/saved_objects/saved_objects_service.ts @@ -54,6 +54,16 @@ export class SpacesSavedObjectsService { }), }, }, + 2: { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + disabledFeatures: { type: 'keyword' }, + }, + }, + ], + }, }, }); diff --git a/x-pack/test/spaces_api_integration/common/config.ts b/x-pack/test/spaces_api_integration/common/config.ts index 3e0cd4b0a38bb..216292e3887e8 100644 --- a/x-pack/test/spaces_api_integration/common/config.ts +++ b/x-pack/test/spaces_api_integration/common/config.ts @@ -44,6 +44,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) esArchiver: config.kibana.functional.get('services.esArchiver'), kibanaServer: config.kibana.functional.get('services.kibanaServer'), spaces: config.xpack.api.get('services.spaces'), + usageAPI: config.xpack.api.get('services.usageAPI'), }, junit: { reportName: 'X-Pack Spaces API Integration Tests -- ' + name, diff --git a/x-pack/test/spaces_api_integration/common/services.ts b/x-pack/test/spaces_api_integration/common/services.ts index 55ff083dd03dc..aa150c7a22603 100644 --- a/x-pack/test/spaces_api_integration/common/services.ts +++ b/x-pack/test/spaces_api_integration/common/services.ts @@ -10,5 +10,6 @@ import { services as apiIntegrationServices } from '../../api_integration/servic export const services = { ...commonServices, + usageAPI: apiIntegrationServices.usageAPI, supertestWithoutAuth: apiIntegrationServices.supertestWithoutAuth, }; diff --git a/x-pack/test/spaces_api_integration/spaces_only/config.ts b/x-pack/test/spaces_api_integration/spaces_only/config.ts index 620f989bd977f..fa5d6310fd60f 100644 --- a/x-pack/test/spaces_api_integration/spaces_only/config.ts +++ b/x-pack/test/spaces_api_integration/spaces_only/config.ts @@ -8,4 +8,8 @@ import { createTestConfig } from '../common/config'; // eslint-disable-next-line import/no-default-export -export default createTestConfig('spaces_only', { disabledPlugins: ['security'], license: 'basic' }); +export default createTestConfig('spaces_only', { + disabledPlugins: ['security'], + license: 'basic', + testFiles: [require.resolve('./telemetry'), require.resolve('./apis')], +}); diff --git a/x-pack/test/spaces_api_integration/spaces_only/telemetry/index.ts b/x-pack/test/spaces_api_integration/spaces_only/telemetry/index.ts new file mode 100644 index 0000000000000..d2cd3fb8a4d6e --- /dev/null +++ b/x-pack/test/spaces_api_integration/spaces_only/telemetry/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 '../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function spacesOnlyTestSuite({ loadTestFile }: FtrProviderContext) { + describe('spaces telemetry data', function () { + loadTestFile(require.resolve('./telemetry')); + }); +} diff --git a/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts b/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts new file mode 100644 index 0000000000000..d5d72e6eb8a99 --- /dev/null +++ b/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts @@ -0,0 +1,87 @@ +/* + * 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 '../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService }: FtrProviderContext) { + const spacesService = getService('spaces'); + const usageAPI = getService('usageAPI'); + + describe('Verify disabledFeatures telemetry payloads', async () => { + beforeEach(async () => { + await spacesService.create({ + id: 'space-1', + name: 'space-1', + description: 'This is your space-1!', + color: '#00bfb3', + disabledFeatures: ['canvas', 'maps'], + }); + + await spacesService.create({ + id: 'space-2', + name: 'space-2', + description: 'This is your space-2!', + color: '#00bfb3', + disabledFeatures: ['savedObjectsManagement', 'canvas', 'maps'], + }); + }); + + afterEach(async () => { + await spacesService.delete('space-1'); + await spacesService.delete('space-2'); + }); + + it('includes only disabledFeatures findings', async () => { + const [{ stats }] = await usageAPI.getTelemetryStats({ + unencrypted: true, + refreshCache: true, + }); + + expect(stats.stack_stats.kibana.plugins.spaces.disabledFeatures).to.eql({ + guidedOnboardingFeature: 0, + actions: 0, + observabilityAIAssistant: 0, + aiAssistantManagementSelection: 0, + savedObjectsTagging: 0, + graph: 0, + rulesSettings: 0, + maintenanceWindow: 0, + stackAlerts: 0, + generalCases: 0, + maps: 2, + canvas: 2, + ml: 0, + fleetv2: 0, + fleet: 0, + osquery: 0, + observabilityCases: 0, + uptime: 0, + slo: 0, + infrastructure: 0, + logs: 0, + monitoring: 0, + apm: 0, + enterpriseSearch: 0, + siem: 0, + securitySolutionCases: 0, + securitySolutionAssistant: 0, + discover: 0, + visualize: 0, + dashboard: 0, + dev_tools: 0, + advancedSettings: 0, + indexPatterns: 0, + filesManagement: 0, + filesSharedImage: 0, + savedObjectsManagement: 1, + savedQueryManagement: 0, + }); + }); + }); +} From 17789e13808fbf5e5de1d9393eb164133bc59636 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 29 May 2024 09:02:32 -0500 Subject: [PATCH 15/95] Update ftr drivers (#184263) --- package.json | 8 ++-- yarn.lock | 115 +++++++++++++++++++-------------------------------- 2 files changed, 46 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index 83a1ff90c7f12..52d8957790206 100644 --- a/package.json +++ b/package.json @@ -1517,7 +1517,7 @@ "@types/redux-actions": "^2.6.1", "@types/resolve": "^1.20.1", "@types/seedrandom": ">=2.0.0 <4.0.0", - "@types/selenium-webdriver": "^4.1.21", + "@types/selenium-webdriver": "^4.1.22", "@types/semver": "^7", "@types/set-value": "^2.0.0", "@types/sinon": "^7.0.13", @@ -1569,7 +1569,7 @@ "buildkite-test-collector": "^1.7.0", "callsites": "^3.1.0", "chance": "1.0.18", - "chromedriver": "^124.0.3", + "chromedriver": "^125.0.2", "clean-webpack-plugin": "^3.0.0", "cli-progress": "^3.12.0", "cli-table3": "^0.6.1", @@ -1615,7 +1615,7 @@ "file-loader": "^4.2.0", "find-cypress-specs": "^1.41.4", "form-data": "^4.0.0", - "geckodriver": "^4.3.3", + "geckodriver": "^4.4.0", "gulp-brotli": "^3.0.0", "gulp-postcss": "^9.0.1", "gulp-terser": "^2.1.0", @@ -1688,7 +1688,7 @@ "rxjs-marbles": "^7.0.1", "sass-embedded": "^1.71.1", "sass-loader": "^10.5.1", - "selenium-webdriver": "^4.18.1", + "selenium-webdriver": "^4.21.0", "sharp": "0.32.6", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/yarn.lock b/yarn.lock index 38f897f6dbf58..4a15fffc8d967 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10614,10 +10614,10 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== -"@types/selenium-webdriver@^4.1.21": - version "4.1.21" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.21.tgz#79fe31faf9953a4143c3e32944d98d5146bbe185" - integrity sha512-QGURnImvxYlIQz5DVhvHdqpYNLBjhJ2Vm+cnQI2G9QZzkWlZm0LkLcvDcHp+qE6N2KBz4CeuvXgPO7W3XQ0Tyw== +"@types/selenium-webdriver@^4.1.22": + version "4.1.22" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.22.tgz#344519b90727eb713e1ce6d2e0198eb0b4f8f316" + integrity sha512-MCL4l7q8dwxejr2Q2NXLyNwHWMPdlWE0Kpn6fFwJtvkJF7PTkG5jkvbH/X1IAAQxgt/L1dA8u2GtDeekvSKvOA== dependencies: "@types/ws" "*" @@ -12689,14 +12689,6 @@ binary-search@^1.3.3, binary-search@^1.3.5: resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - bitmap-sdf@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" @@ -13048,11 +13040,6 @@ buffer-from@~0.1.1: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" integrity sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg== -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -13083,11 +13070,6 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== - buildkite-test-collector@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/buildkite-test-collector/-/buildkite-test-collector-1.7.0.tgz#3fdd753b185045c7aed0136a0e0713a77313164b" @@ -13431,13 +13413,6 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== - dependencies: - traverse ">=0.3.0 <0.4" - chalk@2.4.2, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -13591,10 +13566,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^124.0.3: - version "124.0.3" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-124.0.3.tgz#2818408353ee97005acb887d9f488fe34d5c6d10" - integrity sha512-k6Xu9fwDMgi//bGHB944QMmDHF0BBWGk4PAyVZBEuP6wnZMfQP4V6Sv+l/nuAPA006RllS6X07ZpjPwRPS4BaA== +chromedriver@^125.0.2: + version "125.0.2" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-125.0.2.tgz#e8d399a8f45aa0958dd0a3662d9175d25520ec18" + integrity sha512-H2mIy3r//bIGVouQQrp2UzS93cjGCV2f+I6qNimAOyIiWkaKCiLEuDMQnuC21rewo/UuyOA8CDqa4a7RIT/8EQ== dependencies: "@testim/chrome-version" "^1.1.4" axios "^1.6.7" @@ -17973,18 +17948,18 @@ gauge@^3.0.0: strip-ansi "^6.0.1" wide-align "^1.1.2" -geckodriver@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-4.3.3.tgz#c74cce91acdc1e057f4dfc6bb3ae069a7f910411" - integrity sha512-we2c2COgxFkLVuoknJNx+ioP+7VDq0sr6SCqWHTzlA4kzIbzR0EQ1Pps34s8WrsOnQqPC8a4sZV9dRPROOrkSg== +geckodriver@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-4.4.0.tgz#c2703841e59dd95ee1f1a29b9d9b3cfb38da7c0d" + integrity sha512-Y/Np2VkAhBkJoFAIY3pKH3rICUcR5rH9VD6EHwh0CqUIh6Opzr/NFwfcQenYfbRT/659R15/35LpA1s6h9wPPg== dependencies: "@wdio/logger" "^8.28.0" decamelize "^6.0.0" http-proxy-agent "^7.0.2" https-proxy-agent "^7.0.4" node-fetch "^3.3.2" - tar-fs "^3.0.5" - unzipper "^0.10.14" + tar-fs "^3.0.6" + unzipper "^0.11.4" which "^4.0.0" gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: @@ -21508,11 +21483,6 @@ linkify-it@^5.0.0: dependencies: uc.micro "^2.0.0" -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== - listr2@^3.8.3: version "3.10.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.10.0.tgz#58105a53ed7fa1430d1b738c6055ef7bb006160f" @@ -27624,14 +27594,14 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.18.1.tgz#bcd19048b4aba5411edb7b5266d9390578fc7fed" - integrity sha512-uP4OJ5wR4+VjdTi5oi/k8oieV2fIhVdVuaOPrklKghgS59w7Zz3nGa5gcG73VcU9EBRv5IZEBRhPr7qFJAj5mQ== +selenium-webdriver@^4.21.0: + version "4.21.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.21.0.tgz#d38aebfc34770421a880afcfdb7bd8fe85ce9174" + integrity sha512-WaEJHZjOWNth1QG5FEpxpREER0qptZBMonFU6GtAqdCNLJVxbtC3E7oS/I/+Q1sf1W032Wg0Ebk+m46lANOXyQ== dependencies: jszip "^3.10.1" - tmp "^0.2.1" - ws ">=8.14.2" + tmp "^0.2.3" + ws ">=8.16.0" selfsigned@^2.0.1: version "2.0.1" @@ -27818,7 +27788,7 @@ set-value@^4.1.0: is-plain-object "^2.0.4" is-primitive "^3.0.1" -setimmediate@^1.0.4, setimmediate@^1.0.5, setimmediate@~1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -29327,7 +29297,7 @@ tape@^5.0.1: string.prototype.trim "^1.2.1" through "^2.3.8" -tar-fs@3.0.5, tar-fs@^3.0.4, tar-fs@^3.0.5: +tar-fs@3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.5.tgz#f954d77767e4e6edf973384e1eb95f8f81d64ed9" integrity sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg== @@ -29348,6 +29318,17 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^3.0.4, tar-fs@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^2.1.1" + bare-path "^2.1.0" + tar-stream@^2.1.4, tar-stream@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -29640,12 +29621,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1, tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" +tmp@^0.2.3, tmp@~0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== tmpl@1.0.5: version "1.0.5" @@ -29778,11 +29757,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== - traverse@^0.6.6, traverse@~0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" @@ -30444,21 +30418,16 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== -unzipper@^0.10.14: - version "0.10.14" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.14.tgz#d2b33c977714da0fbc0f82774ad35470a7c962b1" - integrity sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g== +unzipper@^0.11.4: + version "0.11.6" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.11.6.tgz#05b9954320ab30c9398b1638db791c112f919075" + integrity sha512-anERl79akvqLbAxfjIFe4hK0wsi0fH4uGLwNEl4QEnG+KKs3QQeApYgOS/f6vH2EdACUlZg35psmd/3xL2duFQ== dependencies: big-integer "^1.6.17" - binary "~0.3.0" bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" duplexer2 "~0.1.4" fstream "^1.0.12" graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" update-browserslist-db@^1.0.13: version "1.0.13" @@ -31839,7 +31808,7 @@ write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@8.17.0, ws@>=8.14.2, ws@^8.2.3, ws@^8.4.2, ws@^8.9.0: +ws@8.17.0, ws@>=8.16.0, ws@^8.2.3, ws@^8.4.2, ws@^8.9.0: version "8.17.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== From 74bf81663cfb99b435da54c318ec234b72493605 Mon Sep 17 00:00:00 2001 From: Tomasz Kajtoch Date: Wed, 29 May 2024 16:04:28 +0200 Subject: [PATCH 16/95] chore: upgrade `@elastic/eui` to v94.5.2 (#184421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `v94.5.1` ⏩ `v94.5.2` _[Questions? Please see our Kibana upgrade FAQ.](https://github.com/elastic/eui/blob/main/wiki/eui-team-processes/upgrading-kibana.md#faq-for-kibana-teams)_ --- ## [`v94.5.2`](https://github.com/elastic/eui/releases/v94.5.2) **Bug fixes** - Fixed `EuiDatePicker` to more gracefully handle incorrectly formatted `selected` Moment dates, instead of simply crashing ([#7784](https://github.com/elastic/eui/pull/7784)) - Fixed `EuiFlexGroup` and `EuiFlexItem` types to correctly accept global attribute props and simplify type resolution when used with `styled()`-like wrappers ([#7792](https://github.com/elastic/eui/pull/7792)) --- 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 52d8957790206..bc8ee19406ac1 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.13.0", "@elastic/ems-client": "8.5.1", - "@elastic/eui": "94.5.1", + "@elastic/eui": "94.5.2", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index a69a93bb8b351..d4734866b548f 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -86,7 +86,7 @@ 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.1': ['Elastic License 2.0'], - '@elastic/eui@94.5.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@94.5.2': ['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 '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/yarn.lock b/yarn.lock index 4a15fffc8d967..3366cf8c58830 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1735,10 +1735,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@94.5.1": - version "94.5.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.5.1.tgz#cdaab02483a419bfc910be9d75a310b60141a611" - integrity sha512-VopgWoljYAkhrK602vP9QJSbGcGVTT57YkWjAGHVV57YRdKJWXvHt3sbBUdangquxYj4ZC2GXM81p7mMxiCOXA== +"@elastic/eui@94.5.2": + version "94.5.2" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.5.2.tgz#f26a94343b92388f9e18be9e4bb5659957e92d44" + integrity sha512-rSheSetb35YbyfLGmLE4vLYgvNbQERHb5k3abKce+mo19cuvQZxuRj1b87N6B4ZSe1zvipGyvfuvFMp2p2spdQ== dependencies: "@hello-pangea/dnd" "^16.6.0" "@types/lodash" "^4.14.202" From d39739ee85792cdb88d9791eb506edacc6a99bac Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Wed, 29 May 2024 16:06:43 +0200 Subject: [PATCH 17/95] [Dataset quality] Move page to stack management > Data (#184122) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Relates to https://github.com/elastic/kibana/issues/183406. ## 📝 Summary This PR creates a new plugin `data_quality` in order to register dataset quality as a Stack management page under data section. For now there is no reference to this new page in the sideNav in stateful or serverless. In order to navigate to this new page you can use the url `/app/management/data/data_quality` Changes included in this PR: - New plugin created - Plugin registered in stack management, data section - Dataset quality plugin is instantiated and the state is in sync with URL - Removed references to dataset quality in Logs explorer ## 🎥 Demo https://github.com/elastic/kibana/assets/1313018/501c9c47-4a1b-4f91-9be6-d022a821e88e ## 🙅🏼 Missing - Dataset quality locator - There are still references to logs explorer (table and flyout) that will be handled in a follow up PR. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + docs/developer/plugin-list.asciidoc | 4 + package.json | 1 + packages/deeplinks/management/deep_links.ts | 1 + packages/kbn-optimizer/limits.yml | 1 + .../management_sidebar_nav.tsx | 7 +- tsconfig.base.json | 2 + x-pack/.i18nrc.json | 1 + x-pack/plugins/data_quality/README.md | 2 + x-pack/plugins/data_quality/common/index.ts | 15 ++ .../data_quality/common/url_schema/common.ts | 8 + .../data_quality/common/url_schema/index.ts | 9 ++ .../common/url_schema}/url_schema_v1.ts | 0 .../common/utils/deep_compact_object.ts | 15 ++ x-pack/plugins/data_quality/kibana.jsonc | 24 +++ .../data_quality/public/application.tsx | 63 ++++++++ x-pack/plugins/data_quality/public/index.ts | 13 ++ x-pack/plugins/data_quality/public/plugin.ts | 56 +++++++ .../public/routes/dataset_quality/context.tsx | 78 ++++++++++ .../public/routes/dataset_quality/index.tsx | 65 ++++++++ .../routes/dataset_quality}/url_schema_v1.ts | 3 +- .../url_state_storage_service.ts | 55 +++++++ .../data_quality/public/routes/index.tsx | 8 + x-pack/plugins/data_quality/public/types.ts | 24 +++ .../public/utils/kbn_url_state_context.ts | 35 +++++ .../public/utils/use_breadcrumbs.tsx | 25 +++ .../data_quality/public/utils/use_kibana.tsx | 53 +++++++ .../server/index.ts} | 7 +- x-pack/plugins/data_quality/server/plugin.ts | 35 +++++ x-pack/plugins/data_quality/server/types.ts | 12 ++ x-pack/plugins/data_quality/tsconfig.json | 29 ++++ .../common/index.ts | 2 - .../locators/dataset_quality_locator.ts | 29 ---- .../common/locators/index.ts | 3 - .../common/locators/locators.test.ts | 40 ----- .../common/locators/types.ts | 4 - .../construct_dataset_quality_locator_path.ts | 47 ------ .../common/locators/utils/index.ts | 1 - .../common/translations.ts | 7 - .../common/url_schema/common.ts | 1 - .../common/url_schema/index.ts | 6 +- .../observability_logs_explorer/kibana.jsonc | 3 +- .../observability_logs_explorer.tsx | 7 +- .../components/dataset_quality_link.tsx | 98 ------------ .../public/plugin.ts | 7 - .../routes/main/dataset_quality_route.tsx | 108 ------------- .../public/routes/main/index.tsx | 1 - .../dataset_quality/src/controller_service.ts | 70 --------- .../dataset_quality/src/provider.ts | 30 ---- .../dataset_quality/src/state_machine.ts | 146 ------------------ .../dataset_quality/src/types.ts | 54 ------- .../src/url_state_storage_service.ts | 75 --------- .../public/types.ts | 2 - .../observability_logs_explorer/tsconfig.json | 1 - .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../page_objects/dataset_quality.ts | 10 +- x-pack/test/tsconfig.json | 3 +- yarn.lock | 4 + 60 files changed, 659 insertions(+), 755 deletions(-) create mode 100755 x-pack/plugins/data_quality/README.md create mode 100644 x-pack/plugins/data_quality/common/index.ts create mode 100644 x-pack/plugins/data_quality/common/url_schema/common.ts create mode 100644 x-pack/plugins/data_quality/common/url_schema/index.ts rename x-pack/plugins/{observability_solution/observability_logs_explorer/common/url_schema/dataset_quality => data_quality/common/url_schema}/url_schema_v1.ts (100%) create mode 100644 x-pack/plugins/data_quality/common/utils/deep_compact_object.ts create mode 100644 x-pack/plugins/data_quality/kibana.jsonc create mode 100644 x-pack/plugins/data_quality/public/application.tsx create mode 100644 x-pack/plugins/data_quality/public/index.ts create mode 100644 x-pack/plugins/data_quality/public/plugin.ts create mode 100644 x-pack/plugins/data_quality/public/routes/dataset_quality/context.tsx create mode 100644 x-pack/plugins/data_quality/public/routes/dataset_quality/index.tsx rename x-pack/plugins/{observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src => data_quality/public/routes/dataset_quality}/url_schema_v1.ts (92%) create mode 100644 x-pack/plugins/data_quality/public/routes/dataset_quality/url_state_storage_service.ts create mode 100644 x-pack/plugins/data_quality/public/routes/index.tsx create mode 100644 x-pack/plugins/data_quality/public/types.ts create mode 100644 x-pack/plugins/data_quality/public/utils/kbn_url_state_context.ts create mode 100644 x-pack/plugins/data_quality/public/utils/use_breadcrumbs.tsx create mode 100644 x-pack/plugins/data_quality/public/utils/use_kibana.tsx rename x-pack/plugins/{observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/defaults.ts => data_quality/server/index.ts} (59%) create mode 100644 x-pack/plugins/data_quality/server/plugin.ts create mode 100644 x-pack/plugins/data_quality/server/types.ts create mode 100644 x-pack/plugins/data_quality/tsconfig.json delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/dataset_quality_locator.ts delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_dataset_quality_locator_path.ts delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/components/dataset_quality_link.tsx delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/dataset_quality_route.tsx delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/controller_service.ts delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/provider.ts delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/state_machine.ts delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/types.ts delete mode 100644 x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_state_storage_service.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 479cf4473b1d3..8a09ab169b3b4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -337,6 +337,7 @@ x-pack/plugins/dashboard_enhanced @elastic/kibana-presentation src/plugins/dashboard @elastic/kibana-presentation x-pack/packages/kbn-data-forge @elastic/obs-ux-management-team src/plugins/data @elastic/kibana-visualizations @elastic/kibana-data-discovery +x-pack/plugins/data_quality @elastic/obs-ux-logs-team test/plugin_functional/plugins/data_search @elastic/kibana-data-discovery packages/kbn-data-service @elastic/kibana-visualizations @elastic/kibana-data-discovery packages/kbn-data-stream-adapter @elastic/security-threat-hunting-explore diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 5b6b7e4014bc7..178aa842fb2a8 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -531,6 +531,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/data_quality/README.md[dataQuality] +|Page where users can see the quality of their log datasets. + + |{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/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. diff --git a/package.json b/package.json index bc8ee19406ac1..46a7cbc47311d 100644 --- a/package.json +++ b/package.json @@ -391,6 +391,7 @@ "@kbn/dashboard-plugin": "link:src/plugins/dashboard", "@kbn/data-forge": "link:x-pack/packages/kbn-data-forge", "@kbn/data-plugin": "link:src/plugins/data", + "@kbn/data-quality-plugin": "link:x-pack/plugins/data_quality", "@kbn/data-search-plugin": "link:test/plugin_functional/plugins/data_search", "@kbn/data-service": "link:packages/kbn-data-service", "@kbn/data-stream-adapter": "link:packages/kbn-data-stream-adapter", diff --git a/packages/deeplinks/management/deep_links.ts b/packages/deeplinks/management/deep_links.ts index bb0dda17f6ce9..b5770256cd71d 100644 --- a/packages/deeplinks/management/deep_links.ts +++ b/packages/deeplinks/management/deep_links.ts @@ -34,6 +34,7 @@ export type ManagementId = | 'cases' | 'cross_cluster_replication' | 'dataViews' + | 'data_quality' | 'filesManagement' | 'license_management' | 'index_lifecycle_management' diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 47d3d0c55c290..a4e08a8b20a81 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -28,6 +28,7 @@ pageLoadAssetSize: dashboard: 52967 dashboardEnhanced: 65646 data: 454087 + dataQuality: 19384 datasetQuality: 50624 dataViewEditor: 28082 dataViewFieldEditor: 27000 diff --git a/src/plugins/management/public/components/management_sidebar_nav/management_sidebar_nav.tsx b/src/plugins/management/public/components/management_sidebar_nav/management_sidebar_nav.tsx index 1dfe5ef633d71..d6aaf8e657ad9 100644 --- a/src/plugins/management/public/components/management_sidebar_nav/management_sidebar_nav.tsx +++ b/src/plugins/management/public/components/management_sidebar_nav/management_sidebar_nav.tsx @@ -32,13 +32,16 @@ export const managementSidebarNav = ({ const sortedManagementSections = sortBy(managementSections, 'order'); return sortedManagementSections.reduce>>((acc, section) => { - const apps = sortBy(section.getAppsEnabled(), 'order'); + const apps = sortBy( + section.getAppsEnabled().filter((app) => !app.hideFromSidebar), + 'order' + ); if (apps.length) { if (!section.hideFromSidebar) { acc.push({ ...createNavItem(section, { - items: appsToNavItems(apps.filter((app) => !app.hideFromSidebar)), + items: appsToNavItems(apps), }), }); } diff --git a/tsconfig.base.json b/tsconfig.base.json index 12d8ad5d63ae1..9b141fb1991cf 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -668,6 +668,8 @@ "@kbn/data-forge/*": ["x-pack/packages/kbn-data-forge/*"], "@kbn/data-plugin": ["src/plugins/data"], "@kbn/data-plugin/*": ["src/plugins/data/*"], + "@kbn/data-quality-plugin": ["x-pack/plugins/data_quality"], + "@kbn/data-quality-plugin/*": ["x-pack/plugins/data_quality/*"], "@kbn/data-search-plugin": ["test/plugin_functional/plugins/data_search"], "@kbn/data-search-plugin/*": ["test/plugin_functional/plugins/data_search/*"], "@kbn/data-service": ["packages/kbn-data-service"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 36885e2574f63..2de23279fac72 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -24,6 +24,7 @@ "xpack.csp": "plugins/cloud_security_posture", "xpack.customBranding": "plugins/custom_branding", "xpack.dashboard": "plugins/dashboard_enhanced", + "xpack.dataQuality": "plugins/data_quality", "xpack.datasetQuality": "plugins/observability_solution/dataset_quality", "xpack.discover": "plugins/discover_enhanced", "xpack.crossClusterReplication": "plugins/cross_cluster_replication", diff --git a/x-pack/plugins/data_quality/README.md b/x-pack/plugins/data_quality/README.md new file mode 100755 index 0000000000000..31582a332a2fd --- /dev/null +++ b/x-pack/plugins/data_quality/README.md @@ -0,0 +1,2 @@ +# dataQuality +Page where users can see the quality of their log datasets. diff --git a/x-pack/plugins/data_quality/common/index.ts b/x-pack/plugins/data_quality/common/index.ts new file mode 100644 index 0000000000000..25831a8bd3d3c --- /dev/null +++ b/x-pack/plugins/data_quality/common/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 { i18n } from '@kbn/i18n'; + +export const PLUGIN_ID = 'data_quality'; +export const PLUGIN_NAME = i18n.translate('xpack.dataQuality.name', { + defaultMessage: 'Logs data quality', +}); + +export { DATA_QUALITY_URL_STATE_KEY, datasetQualityUrlSchemaV1 } from './url_schema'; diff --git a/x-pack/plugins/data_quality/common/url_schema/common.ts b/x-pack/plugins/data_quality/common/url_schema/common.ts new file mode 100644 index 0000000000000..cf7998f4a1a54 --- /dev/null +++ b/x-pack/plugins/data_quality/common/url_schema/common.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 const DATA_QUALITY_URL_STATE_KEY = 'pageState'; diff --git a/x-pack/plugins/data_quality/common/url_schema/index.ts b/x-pack/plugins/data_quality/common/url_schema/index.ts new file mode 100644 index 0000000000000..d3b092e0b0ac8 --- /dev/null +++ b/x-pack/plugins/data_quality/common/url_schema/index.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. + */ + +export { DATA_QUALITY_URL_STATE_KEY } from './common'; +export * as datasetQualityUrlSchemaV1 from './url_schema_v1'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/dataset_quality/url_schema_v1.ts b/x-pack/plugins/data_quality/common/url_schema/url_schema_v1.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/dataset_quality/url_schema_v1.ts rename to x-pack/plugins/data_quality/common/url_schema/url_schema_v1.ts diff --git a/x-pack/plugins/data_quality/common/utils/deep_compact_object.ts b/x-pack/plugins/data_quality/common/utils/deep_compact_object.ts new file mode 100644 index 0000000000000..eed8b1b83e1f4 --- /dev/null +++ b/x-pack/plugins/data_quality/common/utils/deep_compact_object.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 { isEmpty, isPlainObject, isUndefined } from 'lodash'; + +export const deepCompactObject = >(obj: Value): Value => + Object.fromEntries( + Object.entries(obj) + .map(([key, value]) => [key, isPlainObject(value) ? deepCompactObject(value) : value]) + .filter(([, value]) => !isUndefined(value) && !(isPlainObject(value) && isEmpty(value))) + ); diff --git a/x-pack/plugins/data_quality/kibana.jsonc b/x-pack/plugins/data_quality/kibana.jsonc new file mode 100644 index 0000000000000..2ca3c71168d52 --- /dev/null +++ b/x-pack/plugins/data_quality/kibana.jsonc @@ -0,0 +1,24 @@ +{ + "type": "plugin", + "id": "@kbn/data-quality-plugin", + "owner": "@elastic/obs-ux-logs-team", + "plugin": { + "id": "dataQuality", + "server": true, + "browser": true, + "configPath": ["xpack", "data_quality"], + "requiredPlugins": [ + "datasetQuality", + "management", + "features", + ], + "optionalPlugins": [], + "requiredBundles": [ + "kibanaReact", + "kibanaUtils", + ], + "extraPublicDirs": [ + "common", + ] + } +} diff --git a/x-pack/plugins/data_quality/public/application.tsx b/x-pack/plugins/data_quality/public/application.tsx new file mode 100644 index 0000000000000..32ddc64eb00e1 --- /dev/null +++ b/x-pack/plugins/data_quality/public/application.tsx @@ -0,0 +1,63 @@ +/* + * 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 { CoreStart } from '@kbn/core/public'; +import { ManagementAppMountParams } from '@kbn/management-plugin/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import { Route, Router, Routes } from '@kbn/shared-ux-router'; +import { KbnUrlStateStorageFromRouterProvider } from './utils/kbn_url_state_context'; +import { useKibanaContextForPluginProvider } from './utils/use_kibana'; +import { AppPluginStartDependencies, DataQualityPluginStart } from './types'; +import { DatasetQualityRoute } from './routes'; + +export const renderApp = ( + core: CoreStart, + plugins: AppPluginStartDependencies, + pluginStart: DataQualityPluginStart, + params: ManagementAppMountParams +) => { + ReactDOM.render( + , + params.element + ); + + return () => { + ReactDOM.unmountComponentAtNode(params.element); + }; +}; + +interface AppProps { + core: CoreStart; + plugins: AppPluginStartDependencies; + pluginStart: DataQualityPluginStart; + params: ManagementAppMountParams; +} + +const App = ({ core, plugins, pluginStart, params }: AppProps) => { + const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider( + core, + plugins, + pluginStart, + params + ); + + return ( + + + + + + } /> + + + + + + ); +}; diff --git a/x-pack/plugins/data_quality/public/index.ts b/x-pack/plugins/data_quality/public/index.ts new file mode 100644 index 0000000000000..233886ab18d7b --- /dev/null +++ b/x-pack/plugins/data_quality/public/index.ts @@ -0,0 +1,13 @@ +/* + * 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 { DataQualityPlugin } from './plugin'; + +export function plugin() { + return new DataQualityPlugin(); +} +export type { DataQualityPluginSetup, DataQualityPluginStart } from './types'; diff --git a/x-pack/plugins/data_quality/public/plugin.ts b/x-pack/plugins/data_quality/public/plugin.ts new file mode 100644 index 0000000000000..7063b39b09233 --- /dev/null +++ b/x-pack/plugins/data_quality/public/plugin.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 { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; +import { ManagementAppMountParams } from '@kbn/management-plugin/public'; +import { + DataQualityPluginSetup, + DataQualityPluginStart, + AppPluginStartDependencies, + AppPluginSetupDependencies, +} from './types'; +import { PLUGIN_ID, PLUGIN_NAME } from '../common'; + +export class DataQualityPlugin + implements + Plugin< + DataQualityPluginSetup, + DataQualityPluginStart, + AppPluginSetupDependencies, + AppPluginStartDependencies + > +{ + public setup( + core: CoreSetup, + plugins: AppPluginSetupDependencies + ): DataQualityPluginSetup { + const { management } = plugins; + + management.sections.section.data.registerApp({ + id: PLUGIN_ID, + title: PLUGIN_NAME, + order: 2, + async mount(params: ManagementAppMountParams) { + const [{ renderApp }, [coreStart, pluginsStartDeps, pluginStart]] = await Promise.all([ + import('./application'), + core.getStartServices(), + ]); + + return renderApp(coreStart, pluginsStartDeps, pluginStart, params); + }, + hideFromSidebar: true, + }); + + return {}; + } + + public start(_core: CoreStart): DataQualityPluginStart { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/data_quality/public/routes/dataset_quality/context.tsx b/x-pack/plugins/data_quality/public/routes/dataset_quality/context.tsx new file mode 100644 index 0000000000000..faa43d90de2db --- /dev/null +++ b/x-pack/plugins/data_quality/public/routes/dataset_quality/context.tsx @@ -0,0 +1,78 @@ +/* + * 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 { IToasts } from '@kbn/core-notifications-browser'; +import { DatasetQualityPluginStart } from '@kbn/dataset-quality-plugin/public'; +import { DatasetQualityController } from '@kbn/dataset-quality-plugin/public/controller'; +import { IKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; +import React, { createContext, useContext, useEffect, useState } from 'react'; +import { + getDatasetQualityStateFromUrl, + updateUrlFromDatasetQualityState, +} from './url_state_storage_service'; + +const DatasetQualityContext = createContext<{ controller?: DatasetQualityController }>({}); + +interface ContextProps { + children: JSX.Element; + urlStateStorageContainer: IKbnUrlStateStorage; + toastsService: IToasts; + datasetQuality: DatasetQualityPluginStart; +} + +export function DatasetQualityContextProvider({ + children, + urlStateStorageContainer, + toastsService, + datasetQuality, +}: ContextProps) { + const [controller, setController] = useState(); + + useEffect(() => { + async function getDatasetQualityController() { + const initialState = getDatasetQualityStateFromUrl({ + urlStateStorageContainer, + toastsService, + }); + + const datasetQualityController = await datasetQuality.createDatasetQualityController({ + initialState, + }); + datasetQualityController.service.start(); + setController(datasetQualityController); + + const datasetQualityStateSubscription = datasetQualityController.state$.subscribe((state) => { + updateUrlFromDatasetQualityState({ + urlStateStorageContainer, + datasetQualityState: state, + }); + }); + + return () => { + datasetQualityController.service.stop(); + datasetQualityStateSubscription.unsubscribe(); + }; + } + getDatasetQualityController(); + }, [datasetQuality, toastsService, urlStateStorageContainer]); + + return ( + + {children} + + ); +} + +export const useDatasetQualityContext = () => { + const context = useContext(DatasetQualityContext); + if (context === undefined) { + throw new Error( + 'useDatasetQualityContext must be used within a ' + ); + } + return context; +}; diff --git a/x-pack/plugins/data_quality/public/routes/dataset_quality/index.tsx b/x-pack/plugins/data_quality/public/routes/dataset_quality/index.tsx new file mode 100644 index 0000000000000..6dfb2a5d052fe --- /dev/null +++ b/x-pack/plugins/data_quality/public/routes/dataset_quality/index.tsx @@ -0,0 +1,65 @@ +/* + * 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 { EuiEmptyPrompt, EuiLoadingLogo } from '@elastic/eui'; +import { DatasetQualityController } from '@kbn/dataset-quality-plugin/public/controller'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { PLUGIN_NAME } from '../../../common'; +import { useKbnUrlStateStorageFromRouterContext } from '../../utils/kbn_url_state_context'; +import { useBreadcrumbs } from '../../utils/use_breadcrumbs'; +import { useKibanaContextForPlugin } from '../../utils/use_kibana'; +import { DatasetQualityContextProvider, useDatasetQualityContext } from './context'; + +export const DatasetQualityRoute = () => { + const urlStateStorageContainer = useKbnUrlStateStorageFromRouterContext(); + const { + services: { chrome, datasetQuality, notifications, appParams }, + } = useKibanaContextForPlugin(); + + useBreadcrumbs(PLUGIN_NAME, appParams, chrome); + + return ( + + + + ); +}; + +const ConnectedContent = React.memo(() => { + const { controller } = useDatasetQualityContext(); + + return controller ? ( + + ) : ( + <> + } + title={ + + } + /> + + ); +}); + +const InitializedContent = React.memo( + ({ datasetQualityController }: { datasetQualityController: DatasetQualityController }) => { + const { + services: { datasetQuality }, + } = useKibanaContextForPlugin(); + + return ; + } +); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_schema_v1.ts b/x-pack/plugins/data_quality/public/routes/dataset_quality/url_schema_v1.ts similarity index 92% rename from x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_schema_v1.ts rename to x-pack/plugins/data_quality/public/routes/dataset_quality/url_schema_v1.ts index d49ab302e1908..3ede6fc145186 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_schema_v1.ts +++ b/x-pack/plugins/data_quality/public/routes/dataset_quality/url_schema_v1.ts @@ -10,7 +10,8 @@ import { DatasetQualityPublicStateUpdate, } from '@kbn/dataset-quality-plugin/public/controller'; import * as rt from 'io-ts'; -import { datasetQualityUrlSchemaV1, deepCompactObject } from '../../../../common'; +import { deepCompactObject } from '../../../common/utils/deep_compact_object'; +import { datasetQualityUrlSchemaV1 } from '../../../common/url_schema'; export const getStateFromUrlValue = ( urlValue: datasetQualityUrlSchemaV1.UrlSchema diff --git a/x-pack/plugins/data_quality/public/routes/dataset_quality/url_state_storage_service.ts b/x-pack/plugins/data_quality/public/routes/dataset_quality/url_state_storage_service.ts new file mode 100644 index 0000000000000..22a7ed6225fcf --- /dev/null +++ b/x-pack/plugins/data_quality/public/routes/dataset_quality/url_state_storage_service.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IToasts } from '@kbn/core-notifications-browser'; +import { DatasetQualityPublicState } from '@kbn/dataset-quality-plugin/public/controller'; +import { createPlainError, formatErrors } from '@kbn/io-ts-utils'; +import { IKbnUrlStateStorage, withNotifyOnErrors } from '@kbn/kibana-utils-plugin/public'; +import * as Either from 'fp-ts/lib/Either'; +import * as rt from 'io-ts'; +import { DATA_QUALITY_URL_STATE_KEY } from '../../../common/url_schema'; +import * as urlSchemaV1 from './url_schema_v1'; + +export const updateUrlFromDatasetQualityState = ({ + urlStateStorageContainer, + datasetQualityState, +}: { + urlStateStorageContainer: IKbnUrlStateStorage; + datasetQualityState?: DatasetQualityPublicState; +}) => { + if (!datasetQualityState) { + return; + } + + const encodedUrlStateValues = urlSchemaV1.stateFromUntrustedUrlRT.encode(datasetQualityState); + + urlStateStorageContainer.set(DATA_QUALITY_URL_STATE_KEY, encodedUrlStateValues, { + replace: true, + }); +}; + +export const getDatasetQualityStateFromUrl = ({ + toastsService, + urlStateStorageContainer, +}: { + toastsService: IToasts; + urlStateStorageContainer: IKbnUrlStateStorage; +}): Partial | undefined => { + const urlStateValues = + urlStateStorageContainer.get(DATA_QUALITY_URL_STATE_KEY) ?? undefined; + + const stateValuesE = rt + .union([rt.undefined, urlSchemaV1.stateFromUntrustedUrlRT]) + .decode(urlStateValues); + + if (Either.isLeft(stateValuesE)) { + withNotifyOnErrors(toastsService).onGetError(createPlainError(formatErrors(stateValuesE.left))); + return undefined; + } else { + return stateValuesE.right; + } +}; diff --git a/x-pack/plugins/data_quality/public/routes/index.tsx b/x-pack/plugins/data_quality/public/routes/index.tsx new file mode 100644 index 0000000000000..1a8591d0d3c86 --- /dev/null +++ b/x-pack/plugins/data_quality/public/routes/index.tsx @@ -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 * from './dataset_quality'; diff --git a/x-pack/plugins/data_quality/public/types.ts b/x-pack/plugins/data_quality/public/types.ts new file mode 100644 index 0000000000000..7e695b9a20d08 --- /dev/null +++ b/x-pack/plugins/data_quality/public/types.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 { DatasetQualityPluginStart } from '@kbn/dataset-quality-plugin/public'; +import { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DataQualityPluginSetup {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DataQualityPluginStart {} + +export interface AppPluginSetupDependencies { + management: ManagementSetup; +} + +export interface AppPluginStartDependencies { + datasetQuality: DatasetQualityPluginStart; + management: ManagementStart; +} diff --git a/x-pack/plugins/data_quality/public/utils/kbn_url_state_context.ts b/x-pack/plugins/data_quality/public/utils/kbn_url_state_context.ts new file mode 100644 index 0000000000000..167af63d0d9e6 --- /dev/null +++ b/x-pack/plugins/data_quality/public/utils/kbn_url_state_context.ts @@ -0,0 +1,35 @@ +/* + * 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 { createKbnUrlStateStorage, withNotifyOnErrors } from '@kbn/kibana-utils-plugin/public'; +import createContainer from 'constate'; +import { useState } from 'react'; +import { useKibanaContextForPlugin } from './use_kibana'; + +const useKbnUrlStateStorageFromRouter = () => { + const { + services: { + appParams: { history }, + notifications: { toasts }, + uiSettings, + }, + } = useKibanaContextForPlugin(); + + const [urlStateStorage] = useState(() => + createKbnUrlStateStorage({ + history, + useHash: uiSettings.get('state:storeInSessionStorage'), + useHashQuery: false, + ...withNotifyOnErrors(toasts), + }) + ); + + return urlStateStorage; +}; + +export const [KbnUrlStateStorageFromRouterProvider, useKbnUrlStateStorageFromRouterContext] = + createContainer(useKbnUrlStateStorageFromRouter); diff --git a/x-pack/plugins/data_quality/public/utils/use_breadcrumbs.tsx b/x-pack/plugins/data_quality/public/utils/use_breadcrumbs.tsx new file mode 100644 index 0000000000000..3bf83bcf03352 --- /dev/null +++ b/x-pack/plugins/data_quality/public/utils/use_breadcrumbs.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ChromeStart } from '@kbn/core-chrome-browser'; + +import { ManagementAppMountParams } from '@kbn/management-plugin/public'; +import { useEffect } from 'react'; + +export const useBreadcrumbs = ( + breadcrumb: string, + params: ManagementAppMountParams, + chromeService: ChromeStart +) => { + const { docTitle } = chromeService; + + docTitle.change(breadcrumb); + + useEffect(() => { + params.setBreadcrumbs([{ text: breadcrumb }]); + }, [breadcrumb, params]); +}; diff --git a/x-pack/plugins/data_quality/public/utils/use_kibana.tsx b/x-pack/plugins/data_quality/public/utils/use_kibana.tsx new file mode 100644 index 0000000000000..78dab20ccf68a --- /dev/null +++ b/x-pack/plugins/data_quality/public/utils/use_kibana.tsx @@ -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 { CoreStart } from '@kbn/core/public'; +import { + createKibanaReactContext, + KibanaReactContextValue, + useKibana, +} from '@kbn/kibana-react-plugin/public'; +import { ManagementAppMountParams } from '@kbn/management-plugin/public'; +import { useMemo } from 'react'; +import { AppPluginStartDependencies, DataQualityPluginStart } from '../types'; + +export type PluginKibanaContextValue = CoreStart & + AppPluginStartDependencies & + DataQualityPluginStart & { + appParams: ManagementAppMountParams; + }; + +export const createKibanaContextForPlugin = ( + core: CoreStart, + plugins: AppPluginStartDependencies, + pluginStart: DataQualityPluginStart, + appParams: ManagementAppMountParams +) => { + return createKibanaReactContext({ + ...core, + ...plugins, + ...pluginStart, + appParams, + }); +}; + +export const useKibanaContextForPlugin = + useKibana as () => KibanaReactContextValue; + +export const useKibanaContextForPluginProvider = ( + core: CoreStart, + plugins: AppPluginStartDependencies, + pluginStart: DataQualityPluginStart, + appParams: ManagementAppMountParams +) => { + const { Provider } = useMemo( + () => createKibanaContextForPlugin(core, plugins, pluginStart, appParams), + [appParams, core, pluginStart, plugins] + ); + + return Provider; +}; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/defaults.ts b/x-pack/plugins/data_quality/server/index.ts similarity index 59% rename from x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/defaults.ts rename to x-pack/plugins/data_quality/server/index.ts index 364049ad3f1c2..2165ca23d9f2e 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/defaults.ts +++ b/x-pack/plugins/data_quality/server/index.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { CommonObservabilityDatasetQualityContext } from './types'; - -export const DEFAULT_CONTEXT: CommonObservabilityDatasetQualityContext = { - initialDatasetQualityState: {}, +export const plugin = async () => { + const { DataQualityPlugin } = await import('./plugin'); + return new DataQualityPlugin(); }; diff --git a/x-pack/plugins/data_quality/server/plugin.ts b/x-pack/plugins/data_quality/server/plugin.ts new file mode 100644 index 0000000000000..4977e6f09a5c1 --- /dev/null +++ b/x-pack/plugins/data_quality/server/plugin.ts @@ -0,0 +1,35 @@ +/* + * 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, Plugin } from '@kbn/core/server'; +import { PLUGIN_ID } from '../common'; + +import { Dependencies } from './types'; + +export class DataQualityPlugin implements Plugin { + public setup(coreSetup: CoreSetup, { features }: Dependencies) { + features.registerElasticsearchFeature({ + id: PLUGIN_ID, + management: { + data: [PLUGIN_ID], + }, + privileges: [ + { + ui: [], + requiredClusterPrivileges: [], + requiredIndexPrivileges: { + ['logs-*-*']: ['read'], + }, + }, + ], + }); + } + + public start() {} + + public stop() {} +} diff --git a/x-pack/plugins/data_quality/server/types.ts b/x-pack/plugins/data_quality/server/types.ts new file mode 100644 index 0000000000000..7ae5c3b36b2c2 --- /dev/null +++ b/x-pack/plugins/data_quality/server/types.ts @@ -0,0 +1,12 @@ +/* + * 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 { PluginSetupContract as FeaturesPluginSetup } from '@kbn/features-plugin/server'; + +export interface Dependencies { + features: FeaturesPluginSetup; +} diff --git a/x-pack/plugins/data_quality/tsconfig.json b/x-pack/plugins/data_quality/tsconfig.json new file mode 100644 index 0000000000000..0ad84ba9d1dd4 --- /dev/null +++ b/x-pack/plugins/data_quality/tsconfig.json @@ -0,0 +1,29 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*", + "public/**/*", + "server/**/*", + "../../../typings/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/dataset-quality-plugin", + "@kbn/i18n", + "@kbn/io-ts-utils", + "@kbn/kibana-react-plugin", + "@kbn/kibana-utils-plugin", + "@kbn/management-plugin", + "@kbn/react-kibana-context-render", + "@kbn/shared-ux-router", + "@kbn/core-notifications-browser", + "@kbn/i18n-react", + "@kbn/core-chrome-browser", + "@kbn/features-plugin", + ], + "exclude": ["target/**/*"] +} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts index 62dd4e0333896..fe0712ce338c2 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts @@ -12,9 +12,7 @@ export { } from './locators'; export { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, - OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, logsExplorerUrlSchemaV1, logsExplorerUrlSchemaV2, - datasetQualityUrlSchemaV1, } from './url_schema'; export { deepCompactObject } from './utils/deep_compact_object'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/dataset_quality_locator.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/dataset_quality_locator.ts deleted file mode 100644 index 33ea5616d2543..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/dataset_quality_locator.ts +++ /dev/null @@ -1,29 +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 type { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public'; -import { - DatasetQualityLocatorParams, - DATASET_QUALITY_LOCATOR_ID, -} from '@kbn/deeplinks-observability/locators'; -import { DatasetQualityLocatorDependencies } from './types'; -import { constructDatasetQualityLocatorPath } from './utils'; - -export type DatasetQualityLocator = LocatorPublic; - -export class DatasetQualityLocatorDefinition - implements LocatorDefinition -{ - public readonly id = DATASET_QUALITY_LOCATOR_ID; - - constructor(protected readonly deps: DatasetQualityLocatorDependencies) {} - - public readonly getLocation = async (params: DatasetQualityLocatorParams) => { - const { useHash } = this.deps; - return constructDatasetQualityLocatorPath({ useHash, locatorParams: params }); - }; -} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/index.ts index 0c7fda1cd0f70..6692c6d30cea9 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/index.ts @@ -9,9 +9,7 @@ export type { ObservabilityLogsExplorerLocationState } from '@kbn/deeplinks-obse import { AllDatasetsLocator } from './all_datasets_locator'; import { DataViewLocator } from './data_view_locator'; import { SingleDatasetLocator } from './single_dataset_locator'; -import { DatasetQualityLocator } from './dataset_quality_locator'; -export * from './dataset_quality_locator'; export * from './single_dataset_locator'; export * from './all_datasets_locator'; export * from './utils'; @@ -20,5 +18,4 @@ export interface ObservabilityLogsExplorerLocators { allDatasetsLocator: AllDatasetsLocator; dataViewLocator: DataViewLocator; singleDatasetLocator: SingleDatasetLocator; - datasetQualityLocator: DatasetQualityLocator; } diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts index 6761953c62325..0c38eed85694d 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts @@ -11,7 +11,6 @@ import { SingleDatasetLocatorParams, ObsLogsExplorerDataViewLocatorParams, } from '@kbn/deeplinks-observability/locators'; -import { DatasetQualityLocatorDefinition } from './dataset_quality_locator'; import { AllDatasetsLocatorDefinition } from './all_datasets_locator'; import { DataViewLocatorDefinition } from './data_view_locator'; import { SingleDatasetLocatorDefinition } from './single_dataset_locator'; @@ -24,13 +23,11 @@ const setup = async () => { const allDatasetsLocator = new AllDatasetsLocatorDefinition(dep); const dataViewLocator = new DataViewLocatorDefinition(dep); const singleDatasetLocator = new SingleDatasetLocatorDefinition(dep); - const datasetQualityLocator = new DatasetQualityLocatorDefinition(dep); return { allDatasetsLocator, dataViewLocator, singleDatasetLocator, - datasetQualityLocator, }; }; @@ -426,41 +423,4 @@ describe('Observability Logs Explorer Locators', () => { ); }); }); - - describe('Dataset Quality Locator', () => { - it('should create a link with correct path and no state', async () => { - const { datasetQualityLocator } = await setup(); - const location = await datasetQualityLocator.getLocation({}); - - expect(location).toMatchObject({ - app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, - path: '/dataset-quality?pageState=(v:1)', - state: {}, - }); - }); - - it('should create a link with correct timeRange', async () => { - const refresh = { - pause: false, - value: 0, - }; - const locatorParams = { - filters: { - timeRange: { - ...timeRange, - refresh, - }, - }, - }; - const { datasetQualityLocator } = await setup(); - - const location = await datasetQualityLocator.getLocation(locatorParams); - - expect(location).toMatchObject({ - app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, - path: '/dataset-quality?pageState=(filters:(timeRange:(from:now-30m,refresh:(pause:!f,value:0),to:now)),v:1)', - state: {}, - }); - }); - }); }); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/types.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/types.ts index b6b9364a2aee3..4c80bcf31c2a6 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/types.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/types.ts @@ -7,7 +7,3 @@ export interface ObsLogsExplorerLocatorDependencies { useHash: boolean; } - -export interface DatasetQualityLocatorDependencies { - useHash: boolean; -} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_dataset_quality_locator_path.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_dataset_quality_locator_path.ts deleted file mode 100644 index e38ffe33bc822..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_dataset_quality_locator_path.ts +++ /dev/null @@ -1,47 +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 { DatasetQualityLocatorParams } from '@kbn/deeplinks-observability/locators'; -import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/common'; -import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; -import { - OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, - datasetQualityUrlSchemaV1, -} from '../../url_schema'; -import { deepCompactObject } from '../../utils/deep_compact_object'; - -interface LocatorPathConstructionParams { - locatorParams: DatasetQualityLocatorParams; - useHash: boolean; -} - -export const constructDatasetQualityLocatorPath = async (params: LocatorPathConstructionParams) => { - const { - locatorParams: { filters }, - useHash, - } = params; - - const pageState = datasetQualityUrlSchemaV1.urlSchemaRT.encode( - deepCompactObject({ - v: 1, - filters, - }) - ); - - const path = setStateToKbnUrl( - OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, - pageState, - { useHash, storeInHashQuery: false }, - '/dataset-quality' - ); - - return { - app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, - path, - state: {}, - }; -}; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/index.ts index 23c6a9b59c2d2..6e5aad44fbe9a 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/index.ts @@ -6,4 +6,3 @@ */ export * from './construct_locator_path'; -export * from './construct_dataset_quality_locator_path'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/translations.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/translations.ts index 6b245fb7c7af7..0f054d6ccc705 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/translations.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/translations.ts @@ -54,13 +54,6 @@ export const feedbackLinkTitle = i18n.translate( } ); -export const datasetQualityLinkTitle = i18n.translate( - 'xpack.observabilityLogsExplorer.datasetQualityLinkTitle', - { - defaultMessage: 'Datasets', - } -); - export const createSLoLabel = i18n.translate('xpack.observabilityLogsExplorer.createSlo', { defaultMessage: 'Create SLO', }); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts index f1fd80cbb9b5e..22b00ded2e180 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts @@ -6,4 +6,3 @@ */ export const OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY = 'pageState'; -export const OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY = 'pageState'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts index 269b95778bafa..42d70d1549bb7 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts @@ -5,10 +5,6 @@ * 2.0. */ -export { - OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, - OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, -} from './common'; +export { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY } from './common'; export * as logsExplorerUrlSchemaV1 from './logs_explorer/url_schema_v1'; export * as logsExplorerUrlSchemaV2 from './logs_explorer/url_schema_v2'; -export * as datasetQualityUrlSchemaV1 from './dataset_quality/url_schema_v1'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc b/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc index bfb6a561a1db0..c153124e5bd68 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc @@ -19,8 +19,7 @@ "observabilityShared", "slo", "share", - "kibanaUtils", - "datasetQuality" + "kibanaUtils" ], "optionalPlugins": [ "serverless", diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/observability_logs_explorer.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/observability_logs_explorer.tsx index 3154c7c09cc8e..cdcb82635f068 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/observability_logs_explorer.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/observability_logs_explorer.tsx @@ -11,7 +11,7 @@ import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; import React from 'react'; import ReactDOM from 'react-dom'; -import { DatasetQualityRoute, ObservabilityLogsExplorerMainRoute } from '../routes/main'; +import { ObservabilityLogsExplorerMainRoute } from '../routes/main'; import { NotFoundPage } from '../routes/not_found'; import { ObservabilityLogsExplorerAppMountParameters, @@ -79,11 +79,6 @@ export const ObservabilityLogsExplorerApp = ({ exact={true} render={() => } /> - } - /> } /> diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/dataset_quality_link.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/dataset_quality_link.tsx deleted file mode 100644 index 5d74e6de37a19..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/dataset_quality_link.tsx +++ /dev/null @@ -1,98 +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 { EuiHeaderLink } from '@elastic/eui'; -import { - DatasetQualityLocatorParams, - DATASET_QUALITY_LOCATOR_ID, -} from '@kbn/deeplinks-observability/locators'; -import { LogsExplorerPublicState } from '@kbn/logs-explorer-plugin/public'; -import { getRouterLinkProps } from '@kbn/router-utils'; -import { BrowserUrlService } from '@kbn/share-plugin/public'; -import { MatchedStateFromActor } from '@kbn/xstate-utils'; -import { useActor } from '@xstate/react'; -import React from 'react'; -import { datasetQualityLinkTitle } from '../../common/translations'; -import { - ObservabilityLogsExplorerService, - useObservabilityLogsExplorerPageStateContext, -} from '../state_machines/observability_logs_explorer/src'; -import { useKibanaContextForPlugin } from '../utils/use_kibana'; - -export const ConnectedDatasetQualityLink = React.memo(() => { - const { - services: { - share: { url }, - }, - } = useKibanaContextForPlugin(); - const [pageState] = useActor(useObservabilityLogsExplorerPageStateContext()); - - if (pageState.matches({ initialized: 'validLogsExplorerState' })) { - return ; - } else { - return ; - } -}); - -type InitializedPageState = MatchedStateFromActor< - ObservabilityLogsExplorerService, - { initialized: 'validLogsExplorerState' } ->; - -const constructLocatorParams = ( - logsExplorerState: LogsExplorerPublicState -): DatasetQualityLocatorParams => { - const { time, refreshInterval } = logsExplorerState; - const locatorParams: DatasetQualityLocatorParams = { - filters: { - timeRange: { - ...(time ?? { from: 'now-24h', to: 'now' }), - refresh: refreshInterval ?? { pause: false, value: 60000 }, - }, - }, - }; - - return locatorParams; -}; - -export const DatasetQualityLink = React.memo( - ({ - urlService, - pageState, - }: { - urlService: BrowserUrlService; - pageState?: InitializedPageState; - }) => { - const locator = urlService.locators.get( - DATASET_QUALITY_LOCATOR_ID - ); - const locatorParams: DatasetQualityLocatorParams = pageState - ? constructLocatorParams(pageState.context.logsExplorerState) - : {}; - - const datasetQualityUrl = locator?.useUrl(locatorParams); - - const navigateToDatasetQuality = () => { - locator?.navigate(locatorParams); - }; - - const datasetQualityLinkProps = getRouterLinkProps({ - href: datasetQualityUrl, - onClick: navigateToDatasetQuality, - }); - - return ( - - {datasetQualityLinkTitle} - - ); - } -); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts index a014535fa10cf..906caf72a450a 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts @@ -16,7 +16,6 @@ import { import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; import { AllDatasetsLocatorDefinition, - DatasetQualityLocatorDefinition, ObservabilityLogsExplorerLocators, SingleDatasetLocatorDefinition, } from '../common/locators'; @@ -101,11 +100,6 @@ export class ObservabilityLogsExplorerPlugin useHash, }) ); - const datasetQualityLocator = share.url.locators.create( - new DatasetQualityLocatorDefinition({ - useHash, - }) - ); const dataViewLocator = share.url.locators.create( new DataViewLocatorDefinition({ @@ -120,7 +114,6 @@ export class ObservabilityLogsExplorerPlugin this.locators = { allDatasetsLocator, - datasetQualityLocator, dataViewLocator, singleDatasetLocator, }; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/dataset_quality_route.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/dataset_quality_route.tsx deleted file mode 100644 index 325da7a1ceb08..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/dataset_quality_route.tsx +++ /dev/null @@ -1,108 +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 { EuiEmptyPrompt, EuiLoadingLogo } from '@elastic/eui'; -import { CoreStart } from '@kbn/core/public'; -import { DatasetQualityPluginStart } from '@kbn/dataset-quality-plugin/public'; -import { DatasetQualityController } from '@kbn/dataset-quality-plugin/public/controller'; -import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { useLinkProps } from '@kbn/observability-shared-plugin/public'; -import { useActor } from '@xstate/react'; -import React from 'react'; -import { ObservabilityLogsExplorerPageTemplate } from '../../components/page_template'; -import { - ObservabilityDatasetQualityPageStateProvider, - useObservabilityDatasetQualityPageStateContext, -} from '../../state_machines/dataset_quality/src/provider'; -import { useBreadcrumbs } from '../../utils/breadcrumbs'; -import { useKbnUrlStateStorageFromRouterContext } from '../../utils/kbn_url_state_context'; -import { useKibanaContextForPlugin } from '../../utils/use_kibana'; - -export interface DatasetQualityRouteProps { - core: CoreStart; -} - -export const DatasetQualityRoute = () => { - const { services } = useKibanaContextForPlugin(); - const { datasetQuality, serverless, chrome, notifications } = services; - const logsExplorerLinkProps = useLinkProps({ app: OBSERVABILITY_LOGS_EXPLORER_APP_ID }); - - useBreadcrumbs( - [ - { - text: 'Datasets', - ...logsExplorerLinkProps, - }, - ], - chrome, - serverless - ); - - const urlStateStorageContainer = useKbnUrlStateStorageFromRouterContext(); - - return ( - - datasetQuality.createDatasetQualityController(initialState) - } - toasts={notifications.toasts} - urlStateStorageContainer={urlStateStorageContainer} - > - - - ); -}; - -const ConnectedContent = React.memo(() => { - const { - services: { datasetQuality }, - } = useKibanaContextForPlugin(); - - const [state] = useActor(useObservabilityDatasetQualityPageStateContext()); - - if (state.matches('initialized')) { - return ( - - ); - } else { - return ; - } -}); - -const InitializingContent = React.memo(() => ( - - } - title={ - - } - /> - -)); - -const InitializedContent = React.memo( - ({ - datasetQuality, - datasetQualityController, - }: { - datasetQuality: DatasetQualityPluginStart; - datasetQualityController: DatasetQualityController; - }) => { - return ( - - - - ); - } -); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/index.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/index.tsx index 9d755f302d162..889e340497cf9 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/index.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/index.tsx @@ -6,4 +6,3 @@ */ export * from './main_route'; -export * from './dataset_quality_route'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/controller_service.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/controller_service.ts deleted file mode 100644 index 9847b24fcd03c..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/controller_service.ts +++ /dev/null @@ -1,70 +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 { CreateDatasetQualityController } from '@kbn/dataset-quality-plugin/public/controller'; -import type { InvokeCreator } from 'xstate'; -import type { ObservabilityDatasetQualityContext, ObservabilityDatasetQualityEvent } from './types'; - -export const createController = - ({ - createDatasetQualityController, - }: { - createDatasetQualityController: CreateDatasetQualityController; - }): InvokeCreator => - (context, event) => - (send) => { - createDatasetQualityController({ - initialState: context.initialDatasetQualityState, - }).then((controller) => { - send({ - type: 'CONTROLLER_CREATED', - controller, - }); - }); - }; - -export const subscribeToDatasetQualityState: InvokeCreator< - ObservabilityDatasetQualityContext, - ObservabilityDatasetQualityEvent -> = (context, _event) => (send) => { - if (!('controller' in context)) { - throw new Error('Failed to subscribe to controller: no controller in context'); - } - - const { controller } = context; - - const subscription = controller.state$.subscribe({ - next: (state) => { - send({ type: 'DATASET_QUALITY_STATE_CHANGED', state }); - }, - }); - - controller.service.start(); - - return () => { - subscription.unsubscribe(); - controller.service.stop(); - }; -}; - -export const openDatasetFlyout = (context: ObservabilityDatasetQualityContext) => { - if (!('controller' in context)) { - throw new Error('Failed to subscribe to controller: no controller in context'); - } - - const { - controller, - initialDatasetQualityState: { flyout }, - } = context; - - if (flyout?.dataset) { - controller.service.send({ - type: 'OPEN_FLYOUT', - dataset: flyout.dataset, - }); - } -}; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/provider.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/provider.ts deleted file mode 100644 index e900e4851cfc3..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/provider.ts +++ /dev/null @@ -1,30 +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 { getDevToolsOptions } from '@kbn/xstate-utils'; -import { useInterpret } from '@xstate/react'; -import createContainer from 'constate'; -import { - createObservabilityDatasetQualityStateMachine, - ObservabilityDatasetQualityStateMachineDependencies, -} from './state_machine'; - -export const useObservabilityDatasetQualityPageState = ( - deps: ObservabilityDatasetQualityStateMachineDependencies -) => { - const observabilityDatasetQualityPageStateService = useInterpret( - () => createObservabilityDatasetQualityStateMachine(deps), - { devTools: getDevToolsOptions() } - ); - - return observabilityDatasetQualityPageStateService; -}; - -export const [ - ObservabilityDatasetQualityPageStateProvider, - useObservabilityDatasetQualityPageStateContext, -] = createContainer(useObservabilityDatasetQualityPageState); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/state_machine.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/state_machine.ts deleted file mode 100644 index 71e97192e07ec..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/state_machine.ts +++ /dev/null @@ -1,146 +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 { IToasts } from '@kbn/core-notifications-browser'; -import { CreateDatasetQualityController } from '@kbn/dataset-quality-plugin/public/controller'; -import { IKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; -import { actions, createMachine, InterpreterFrom } from 'xstate'; -import { - createController, - openDatasetFlyout, - subscribeToDatasetQualityState, -} from './controller_service'; -import { DEFAULT_CONTEXT } from './defaults'; -import { - ObservabilityDatasetQualityContext, - ObservabilityDatasetQualityEvent, - ObservabilityDatasetQualityTypeState, -} from './types'; -import { initializeFromUrl, updateUrlFromDatasetQualityState } from './url_state_storage_service'; - -export const createPureObservabilityDatasetQualityStateMachine = ( - initialContext: ObservabilityDatasetQualityContext -) => - /** @xstate-layout N4IgpgJg5mDOIC5QHkBGswCcBuBDVAlgDYEAuAngDID2UAogB4AOR1mWAdAK4B2BfpArhIAvSAGIA2gAYAuolBNqsMgWo8FIBogDMOjgFYAbAEZpAdgCcRgwBYAHAcsGANCHK7bHWztsGTRjomevbmRpYAvhFuaBg4+MRkVLSMLGyc-KrCBCL8UABimNQAtgAqBMVg+cSkWADKWNgEAMZg4gCSAHLtpe0AgpTtAFp0ACIA+vkASsgAsuO9s3ST7ZSldFPjdRsAau0AwnQy8kggSiqC6praCAC0ZvrhRua24Tp2jiZuHggATEb2Dj-aQ2PQmcEGSFRGLoRoJEgUGj0ZisdiYDiZQTZXI8ApFYoAVUwRA63V6A2GY0mM3mBKmlGOmnOqiupxutx0Rg49ksv2kBl+9hMQp0oV+30QBnsXgsAX8lhevx0lki0RAsThhARyWRaTRHGa7Fwglx+3UpCKRCIWHE+2QnVKM0olA2432UzofXWo0Zp2Zlw0bMQt0FHCMAN85jC9k5tl+cYlCFCJg4QRMxnM0lsZkcRmh6th8S1SSRqVRGQEQlEkG4PAA1jxqAB3HillHpTB1UjGtqUZAAcXGdAAGgAFPsezZ1Upe5b7AASfU6-bGvsUyhZgdANyVBg4JmzRl+UtFFks9nsiYh0n3tn59lM-2FNnzGqLiURKXb+sxVZyNbwEgIDbPV6m7WpxD7QcR3HZBJy2Gd1jdRdl1XOQmQ3ANrklUxDFCSxDwVX4TAIq9BXMIFnnTc9gXseMojVRsIDgTQ3zwYtP11ctMAwi41C3LRg3TFMnheN4Pn8RN7h0CjpDk6QDyFcxiOkX5VRhOJ2I-HUyw7Wtf2xSBeM3bCEAot4LyFHl42cEEpNsSxDHkkwlTMKwH2cV9Cy07UQO4jFK2xPJChKcpKmqIhak7RoWjAYysKDO57Bvayswc0EDxeMiuVscwdEFAUBRci9fi8zT4RLL9QPRAzRGC-EiSIeL+NMjkuXeNT3PDF5fFcdxEDjFNlNBSxwQvXKdDKzVtL8vTDTAY08jNHgLWoK0sGa1lt2DTkOGsJUHNGuSSJ8RMXhTEw8t8S61LkpwpvfXyqv82r-wgTaBPZOjvGSz49F5RxzEvfqEDMdMwzvBwAnMAwoxIh6fMqri9NesQIFrBtm1bZ6Oy7HsPta3wfukP7lQKoGr2fDhpEsTllNCAwdAUya1TYirON0n9AurdHAIIYCcbRPHagJxKjBp-cDCzA9LDuqxLEph9qdp55yMZhSDAYiIgA */ - createMachine< - ObservabilityDatasetQualityContext, - ObservabilityDatasetQualityEvent, - ObservabilityDatasetQualityTypeState - >( - { - context: initialContext, - predictableActionArguments: true, - id: 'ObservabilityDatasetQuality', - initial: 'initializingFromUrl', - states: { - initializingFromUrl: { - invoke: { - src: 'initializeFromUrl', - }, - on: { - INITIALIZED_FROM_URL: { - target: 'creatingController', - actions: ['storeInitialUrlState'], - }, - }, - }, - creatingController: { - invoke: { - src: 'createController', - }, - on: { - CONTROLLER_CREATED: { - target: 'initialized', - actions: ['storeController', 'openDatasetFlyout'], - }, - }, - }, - initialized: { - invoke: { - src: 'subscribeToDatasetQualityState', - }, - states: { - unknownDatasetQualityState: { - on: { - DATASET_QUALITY_STATE_CHANGED: { - target: 'validDatasetQualityState', - actions: ['storeDatasetQualityState', 'updateUrlFromDatasetQualityState'], - }, - }, - }, - validDatasetQualityState: { - on: { - DATASET_QUALITY_STATE_CHANGED: { - actions: ['storeDatasetQualityState', 'updateUrlFromDatasetQualityState'], - target: 'validDatasetQualityState', - internal: true, - }, - }, - }, - }, - initial: 'unknownDatasetQualityState', - }, - }, - }, - { - actions: { - storeController: actions.assign((_context, event) => { - return 'controller' in event && event.type === 'CONTROLLER_CREATED' - ? { controller: event.controller } - : {}; - }), - storeInitialUrlState: actions.assign((context, event) => { - return 'stateFromUrl' in event && event.type === 'INITIALIZED_FROM_URL' - ? { - initialDatasetQualityState: { - ...('initialDatasetQualityState' in context - ? context.initialDatasetQualityState - : {}), - ...event.stateFromUrl, - }, - } - : {}; - }), - storeDatasetQualityState: actions.assign((_context, event) => { - return 'state' in event && event.type === 'DATASET_QUALITY_STATE_CHANGED' - ? { datasetQualityState: event.state } - : {}; - }), - }, - } - ); - -export interface ObservabilityDatasetQualityStateMachineDependencies { - createDatasetQualityController: CreateDatasetQualityController; - initialContext?: ObservabilityDatasetQualityContext; - toasts: IToasts; - urlStateStorageContainer: IKbnUrlStateStorage; -} - -export const createObservabilityDatasetQualityStateMachine = ({ - initialContext = DEFAULT_CONTEXT, - toasts, - urlStateStorageContainer, - createDatasetQualityController, -}: ObservabilityDatasetQualityStateMachineDependencies) => - createPureObservabilityDatasetQualityStateMachine(initialContext).withConfig({ - actions: { - updateUrlFromDatasetQualityState: updateUrlFromDatasetQualityState({ - urlStateStorageContainer, - }), - openDatasetFlyout, - }, - services: { - createController: createController({ createDatasetQualityController }), - initializeFromUrl: initializeFromUrl({ urlStateStorageContainer, toastsService: toasts }), - subscribeToDatasetQualityState, - }, - }); - -export type ObservabilityDatasetQualityService = InterpreterFrom< - typeof createObservabilityDatasetQualityStateMachine ->; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/types.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/types.ts deleted file mode 100644 index 4fa864b35951e..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/types.ts +++ /dev/null @@ -1,54 +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 { - DatasetQualityController, - DatasetQualityPublicState, - DatasetQualityPublicStateUpdate, -} from '@kbn/dataset-quality-plugin/public/controller'; - -export type ObservabilityDatasetQualityContext = ObservabilityDatasetQualityTypeState['context']; - -export interface CommonObservabilityDatasetQualityContext { - initialDatasetQualityState: DatasetQualityPublicStateUpdate; -} - -export interface WithDatasetQualityState { - datasetQualityState: DatasetQualityPublicState; -} - -export interface WithController { - controller: DatasetQualityController; -} - -export type ObservabilityDatasetQualityEvent = - | { - type: 'INITIALIZED_FROM_URL'; - stateFromUrl?: DatasetQualityPublicStateUpdate; - } - | { - type: 'CONTROLLER_CREATED'; - controller: DatasetQualityController; - } - | { - type: 'DATASET_QUALITY_STATE_CHANGED'; - state: DatasetQualityPublicState; - }; - -export type ObservabilityDatasetQualityTypeState = - | { - value: 'initializingFromUrl' | 'creatingController'; - context: CommonObservabilityDatasetQualityContext; - } - | { - value: 'initialized' | { initialized: 'unknownDatasetQualityState' }; - context: CommonObservabilityDatasetQualityContext & WithController; - } - | { - value: { initialized: 'validDatasetQualityState' }; - context: CommonObservabilityDatasetQualityContext & WithDatasetQualityState & WithController; - }; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_state_storage_service.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_state_storage_service.ts deleted file mode 100644 index 43cbd834729fc..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/dataset_quality/src/url_state_storage_service.ts +++ /dev/null @@ -1,75 +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 { IToasts } from '@kbn/core-notifications-browser'; -import { createPlainError, formatErrors } from '@kbn/io-ts-utils'; -import { IKbnUrlStateStorage, withNotifyOnErrors } from '@kbn/kibana-utils-plugin/public'; -import * as Either from 'fp-ts/lib/Either'; -import * as rt from 'io-ts'; -import { InvokeCreator } from 'xstate'; -import { OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY } from '../../../../common'; -import type { ObservabilityDatasetQualityContext, ObservabilityDatasetQualityEvent } from './types'; -import * as urlSchemaV1 from './url_schema_v1'; - -interface ObservabilityDatasetQualityUrlStateDependencies { - toastsService: IToasts; - urlStateStorageContainer: IKbnUrlStateStorage; -} - -export const updateUrlFromDatasetQualityState = - ({ urlStateStorageContainer }: { urlStateStorageContainer: IKbnUrlStateStorage }) => - (context: ObservabilityDatasetQualityContext, event: ObservabilityDatasetQualityEvent) => { - if (!('datasetQualityState' in context)) { - return; - } - - const encodedUrlStateValues = urlSchemaV1.stateFromUntrustedUrlRT.encode( - context.datasetQualityState - ); - - urlStateStorageContainer.set( - OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, - encodedUrlStateValues, - { - replace: true, - } - ); - }; - -export const initializeFromUrl = - ({ - toastsService, - urlStateStorageContainer, - }: ObservabilityDatasetQualityUrlStateDependencies): InvokeCreator< - ObservabilityDatasetQualityContext, - ObservabilityDatasetQualityEvent - > => - (_context, _event) => - (send) => { - const urlStateValues = - urlStateStorageContainer.get(OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY) ?? - undefined; - - const stateValuesE = rt - .union([rt.undefined, urlSchemaV1.stateFromUntrustedUrlRT]) - .decode(urlStateValues); - - if (Either.isLeft(stateValuesE)) { - withNotifyOnErrors(toastsService).onGetError( - createPlainError(formatErrors(stateValuesE.left)) - ); - send({ - type: 'INITIALIZED_FROM_URL', - stateFromUrl: undefined, - }); - } else { - send({ - type: 'INITIALIZED_FROM_URL', - stateFromUrl: stateValuesE.right, - }); - } - }; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts index b62863cbb4783..d66a26a6b3c35 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts @@ -13,7 +13,6 @@ import { ServerlessPluginStart } from '@kbn/serverless/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; import { AppMountParameters, ScopedHistory } from '@kbn/core/public'; import { LogsSharedClientStartExports } from '@kbn/logs-shared-plugin/public'; -import { DatasetQualityPluginStart } from '@kbn/dataset-quality-plugin/public'; import { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public'; import { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui-plugin/public'; import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; @@ -54,7 +53,6 @@ export interface ObservabilityLogsExplorerStartDeps { dataViewEditor?: DataViewEditorStart; lens?: LensPublicStart; share: SharePluginStart; - datasetQuality: DatasetQualityPluginStart; } export type ObservabilityLogsExplorerHistory = diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json b/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json index c41cf932e9ece..f88b9de65d0c0 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json @@ -17,7 +17,6 @@ "@kbn/core-mount-utils-browser-internal", "@kbn/core-notifications-browser", "@kbn/data-plugin", - "@kbn/dataset-quality-plugin", "@kbn/deeplinks-observability", "@kbn/discover-plugin", "@kbn/i18n", diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5493da4a52b6f..45f91ad82c4ac 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -44884,7 +44884,6 @@ "xpack.observabilityLogsExplorer.appTitle": "Explorateur de logs", "xpack.observabilityLogsExplorer.betaBadgeDescription": "Il s'agit du stade bêta de l'application, qui est donc susceptible d'évoluer.", "xpack.observabilityLogsExplorer.betaBadgeTitle": "Bêta", - "xpack.observabilityLogsExplorer.datasetQuality.InitializingTitle": "Initialisation de la qualité de l'ensemble de données", "xpack.observabilityLogsExplorer.discoverLinkTitle": "Ouvrir dans Discover", "xpack.observabilityLogsExplorer.feedbackLinkTitle": "Donner un retour", "xpack.observabilityLogsExplorer.feedbackToast.buttonText": "Répondre à une enquête rapide", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index e1691ae0ab930..8074fc8815f89 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -44854,7 +44854,6 @@ "xpack.observabilityLogsExplorer.appTitle": "ログエクスプローラー", "xpack.observabilityLogsExplorer.betaBadgeDescription": "このアプリケーションはベータ版であるため、変更される場合があります。", "xpack.observabilityLogsExplorer.betaBadgeTitle": "ベータ", - "xpack.observabilityLogsExplorer.datasetQuality.InitializingTitle": "データセット品質を初期化しています", "xpack.observabilityLogsExplorer.discoverLinkTitle": "Discoverで開く", "xpack.observabilityLogsExplorer.feedbackLinkTitle": "フィードバックを作成する", "xpack.observabilityLogsExplorer.feedbackToast.buttonText": "簡単なアンケートに答える", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 70c4740f38375..0d52e86e5b9a3 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -44903,7 +44903,6 @@ "xpack.observabilityLogsExplorer.appTitle": "日志浏览器", "xpack.observabilityLogsExplorer.betaBadgeDescription": "此应用程序为公测版,因此可能会进行更改。", "xpack.observabilityLogsExplorer.betaBadgeTitle": "公测版", - "xpack.observabilityLogsExplorer.datasetQuality.InitializingTitle": "正在初始化数据集质量", "xpack.observabilityLogsExplorer.discoverLinkTitle": "在 Discover 中打开", "xpack.observabilityLogsExplorer.feedbackLinkTitle": "反馈", "xpack.observabilityLogsExplorer.feedbackToast.buttonText": "参加快速调查", diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index ba7a4241bdf8a..3a7911696b1b9 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -11,9 +11,9 @@ import expect from '@kbn/expect'; import { TimeUnitId } from '@elastic/eui'; import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; import { - OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY, + DATA_QUALITY_URL_STATE_KEY, datasetQualityUrlSchemaV1, -} from '@kbn/observability-logs-explorer-plugin/common'; +} from '@kbn/data-quality-plugin/common'; import { DEFAULT_DEGRADED_FIELD_SORT_DIRECTION, DEFAULT_DEGRADED_FIELD_SORT_FIELD, @@ -114,7 +114,7 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv pageState?: datasetQualityUrlSchemaV1.UrlSchema; } = {}) { const queryStringParams = querystring.stringify({ - [OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY]: rison.encode( + [DATA_QUALITY_URL_STATE_KEY]: rison.encode( datasetQualityUrlSchemaV1.urlSchemaRT.encode({ ...defaultPageState, ...pageState, @@ -123,8 +123,8 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv }); return PageObjects.common.navigateToUrlWithBrowserHistory( - 'observabilityLogsExplorer', - '/dataset-quality', + 'management', + '/data/data_quality', queryStringParams, { // the check sometimes is too slow for the page so it misses the point diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index d307c65c96742..10d864d304006 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -175,6 +175,7 @@ "@kbn/analytics-ftr-helpers-plugin", "@kbn/alerting-comparators", "@kbn/alerting-state-types", - "@kbn/reporting-server" + "@kbn/reporting-server", + "@kbn/data-quality-plugin" ] } diff --git a/yarn.lock b/yarn.lock index 3366cf8c58830..3272c5b492a28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4371,6 +4371,10 @@ version "0.0.0" uid "" +"@kbn/data-quality-plugin@link:x-pack/plugins/data_quality": + version "0.0.0" + uid "" + "@kbn/data-search-plugin@link:test/plugin_functional/plugins/data_search": version "0.0.0" uid "" From 8bbba600c19d0930d5b77872a1352d35ff8cfbc8 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 29 May 2024 16:13:54 +0200 Subject: [PATCH 18/95] [CI] Make cypress reporting more resilient (#184397) ## Summary cypress reporter will occasionally get an empty result object - it draws attention from other error messages in the stream, and allows misleading conclusions let's not fail reporting because of that, and hope that the real error will also surface. See: https://buildkite.com/elastic/kibana-pull-request/builds/212655#018fc04b-e385-4760-87db-41b65f86fb40 --------- Co-authored-by: Patryk Kopycinski --- .../security_solution/scripts/run_cypress/parallel.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts index 08c0846d2ce8e..4b0f586779270 100644 --- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts +++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts @@ -493,10 +493,15 @@ ${JSON.stringify(cyCustomEnv, null, 2)} (runResult) => !failedSpecFilePaths.includes(runResult.spec.absolute) ) ), - ...retryResults, + ..._.filter(retryResults, (retryResult) => !!retryResult), ] as CypressCommandLine.CypressRunResult[]; - renderSummaryTable(finalResults); + try { + renderSummaryTable(finalResults); + } catch (e) { + log.error('Failed to render summary table'); + log.error(e); + } const hasFailedTests = ( runResults: Array< From f7b9777f4030b0412e01bc940d15c6f29546e60c Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Wed, 29 May 2024 10:59:41 -0400 Subject: [PATCH 19/95] [Embeddables Rebuild] Fix sharing (#184264) Extends the usage of runtime state for backups to the snapshot sharing system. --- .../top_nav/share/show_share_modal.test.tsx | 58 +++++++++++ .../top_nav/share/show_share_modal.tsx | 53 ++++++---- .../top_nav/use_dashboard_menu_items.tsx | 3 +- .../create/create_dashboard.test.ts | 79 ++++++++++++++- .../embeddable/create/create_dashboard.ts | 96 +++++++++++++++---- .../public/services/data/data.stub.ts | 5 + 6 files changed, 255 insertions(+), 39 deletions(-) diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx index 9cdab72403e5b..7d716528148d1 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx @@ -76,6 +76,7 @@ describe('ShowShareModal', () => { return { isDirty: true, anchorElement: document.createElement('div'), + getDashboardState: () => ({} as DashboardContainerInput), }; }; @@ -140,4 +141,61 @@ describe('ShowShareModal', () => { ); }); }); + + it('applies unsaved panel state from backup service into the locator params', () => { + const unsavedDashboardState = { + panels: { + panel_1: { + gridData: { w: 0, h: 0, x: 0, y: 0, i: '0' }, + type: 'superType', + explicitInput: { + id: 'whatever', + changedKey1: 'not changed....', + }, + }, + }, + }; + const props = getPropsAndShare(unsavedDashboardState); + const getCurrentState: () => DashboardContainerInput = () => { + return { + panels: { + panel_1: { + gridData: { w: 0, h: 0, x: 0, y: 0, i: '0' }, + type: 'superType', + explicitInput: { + id: 'whatever', + changedKey1: 'NOT changed', + }, + }, + panel_2: { + gridData: { w: 0, h: 0, x: 0, y: 0, i: '0' }, + type: 'superType', + explicitInput: { + id: 'whatever2', + changedKey2: 'definitely NOT changed', + }, + }, + }, + } as unknown as DashboardContainerInput; + }; + pluginServices.getServices().dashboardBackup.getState = jest.fn().mockReturnValue({ + dashboardState: unsavedDashboardState, + panels: { + panel_1: { changedKey1: 'changed' }, + panel_2: { changedKey2: 'definitely changed' }, + }, + }); + props.getDashboardState = getCurrentState; + ShowShareModal(props); + expect(toggleShareMenuSpy).toHaveBeenCalledTimes(1); + const shareLocatorParams = ( + toggleShareMenuSpy.mock.calls[0][0].sharingData as { + locatorParams: { params: DashboardLocatorParams }; + } + ).locatorParams.params; + + expect(shareLocatorParams.panels).toBeDefined(); + expect(shareLocatorParams.panels![0].embeddableConfig.changedKey1).toBe('changed'); + expect(shareLocatorParams.panels![1].embeddableConfig.changedKey2).toBe('definitely changed'); + }); }); diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx index b60c389346638..c9c7891d6b352 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx @@ -6,25 +6,26 @@ * Side Public License, v 1. */ -import moment from 'moment'; -import React, { ReactElement, useState } from 'react'; -import { omit } from 'lodash'; - -import { i18n } from '@kbn/i18n'; import { EuiCheckboxGroup } from '@elastic/eui'; -import { QueryState } from '@kbn/data-plugin/common'; -import type { Capabilities } from '@kbn/core/public'; -import { ViewMode } from '@kbn/embeddable-plugin/public'; -import { getStateFromKbnUrl } from '@kbn/kibana-utils-plugin/public'; -import { setStateToKbnUrl, unhashUrl } from '@kbn/kibana-utils-plugin/public'; import type { SerializableControlGroupInput } from '@kbn/controls-plugin/common'; - +import type { Capabilities } from '@kbn/core/public'; +import { QueryState } from '@kbn/data-plugin/common'; import { DASHBOARD_APP_LOCATOR } from '@kbn/deeplinks-analytics'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { getStateFromKbnUrl, setStateToKbnUrl, unhashUrl } from '@kbn/kibana-utils-plugin/public'; +import { omit } from 'lodash'; +import moment from 'moment'; +import React, { ReactElement, useState } from 'react'; +import { + convertPanelMapToSavedPanels, + DashboardContainerInput, + DashboardPanelMap, +} from '../../../../common'; +import { DashboardLocatorParams } from '../../../dashboard_container'; +import { pluginServices } from '../../../services/plugin_services'; import { dashboardUrlParams } from '../../dashboard_router'; import { shareModalStrings } from '../../_dashboard_app_strings'; -import { pluginServices } from '../../../services/plugin_services'; -import { convertPanelMapToSavedPanels, DashboardPanelMap } from '../../../../common'; -import { DashboardLocatorParams } from '../../../dashboard_container'; const showFilterBarId = 'showFilterBar'; @@ -33,6 +34,7 @@ export interface ShowShareModalProps { savedObjectId?: string; dashboardTitle?: string; anchorElement: HTMLElement; + getDashboardState: () => DashboardContainerInput; } export const showPublicUrlSwitch = (anonymousUserCapabilities: Capabilities) => { @@ -48,6 +50,7 @@ export function ShowShareModal({ anchorElement, savedObjectId, dashboardTitle, + getDashboardState, }: ShowShareModalProps) { const { dashboardCapabilities: { createShortUrl: allowShortUrl }, @@ -123,12 +126,30 @@ export function ShowShareModal({ }; let unsavedStateForLocator: DashboardLocatorParams = {}; - const { dashboardState: unsavedDashboardState, panels } = + + const { dashboardState: unsavedDashboardState, panels: unsavedPanelStates } = dashboardBackup.getState(savedObjectId) ?? {}; + const latestPanels = getDashboardState().panels; + const unsavedPanelsMap = unsavedPanelStates + ? Object.entries(unsavedPanelStates).reduce((acc, [panelId, unsavedPanel]) => { + if (unsavedPanel && latestPanels?.[panelId]) { + acc[panelId] = { + ...latestPanels[panelId], + explicitInput: { + ...latestPanels?.[panelId].explicitInput, + ...unsavedPanel, + id: panelId, + }, + }; + } + return acc; + }, {} as DashboardPanelMap) + : {}; + const allPanels: DashboardPanelMap = { ...(unsavedDashboardState?.panels ?? {}), - ...((panels as DashboardPanelMap) ?? {}), + ...unsavedPanelsMap, }; if (unsavedDashboardState) { diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx index 85ebe38e8eecd..066ee2a018221 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx @@ -72,9 +72,10 @@ export const useDashboardMenuItems = ({ anchorElement, savedObjectId: lastSavedId, isDirty: Boolean(hasUnsavedChanges), + getDashboardState: () => dashboard.getState().explicitInput, }); }, - [dashboardTitle, hasUnsavedChanges, lastSavedId] + [dashboardTitle, hasUnsavedChanges, lastSavedId, dashboard] ); const maybeRedirect = useCallback( diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts index bfe29801b07fb..f20e9f8c46c1b 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts @@ -176,7 +176,7 @@ test('pulls state from backup which overrides state from saved object', async () ); }); -test('pulls state from creation options initial input which overrides all other state sources', async () => { +test('pulls state from override input which overrides all other state sources', async () => { pluginServices.getServices().dashboardContentManagement.loadDashboardState = jest .fn() .mockResolvedValue({ @@ -202,6 +202,83 @@ test('pulls state from creation options initial input which overrides all other ); }); +test('pulls panels from override input', async () => { + pluginServices.getServices().embeddable.reactEmbeddableRegistryHasKey = jest + .fn() + .mockImplementation((type: string) => type === 'reactEmbeddable'); + pluginServices.getServices().dashboardContentManagement.loadDashboardState = jest + .fn() + .mockResolvedValue({ + dashboardInput: { + ...DEFAULT_DASHBOARD_INPUT, + panels: { + ...DEFAULT_DASHBOARD_INPUT.panels, + someLegacyPanel: { + type: 'legacy', + gridData: { x: 0, y: 0, w: 0, h: 0, i: 'someLegacyPanel' }, + explicitInput: { + id: 'someLegacyPanel', + title: 'stateFromSavedObject', + }, + }, + someReactEmbeddablePanel: { + type: 'reactEmbeddable', + gridData: { x: 0, y: 0, w: 0, h: 0, i: 'someReactEmbeddablePanel' }, + explicitInput: { + id: 'someReactEmbeddablePanel', + title: 'stateFromSavedObject', + }, + }, + }, + }, + }); + const dashboard = await createDashboard( + { + useSessionStorageIntegration: true, + getInitialInput: () => ({ + ...DEFAULT_DASHBOARD_INPUT, + panels: { + ...DEFAULT_DASHBOARD_INPUT.panels, + someLegacyPanel: { + type: 'legacy', + gridData: { x: 0, y: 0, w: 0, h: 0, i: 'someLegacyPanel' }, + explicitInput: { + id: 'someLegacyPanel', + title: 'Look at me, I am the override now', + }, + }, + someReactEmbeddablePanel: { + type: 'reactEmbeddable', + gridData: { x: 0, y: 0, w: 0, h: 0, i: 'someReactEmbeddablePanel' }, + explicitInput: { + id: 'someReactEmbeddablePanel', + title: 'an elegant override, from a more civilized age', + }, + }, + }, + }), + }, + 0, + 'wow-such-id' + ); + expect(dashboard).toBeDefined(); + + // legacy panels should be completely overwritten directly in the explicitInput + expect(dashboard!.getState().explicitInput.panels.someLegacyPanel.explicitInput.title).toBe( + 'Look at me, I am the override now' + ); + + // React embeddable should still have the old state in their explicit input + expect( + dashboard!.getState().explicitInput.panels.someReactEmbeddablePanel.explicitInput.title + ).toBe('stateFromSavedObject'); + + // instead, the unsaved changes for React embeddables should be applied to the "restored runtime state" property of the Dashboard. + expect( + (dashboard!.restoredRuntimeState!.someReactEmbeddablePanel as { title: string }).title + ).toEqual('an elegant override, from a more civilized age'); +}); + test('applies filters and query from state to query service', async () => { const filters: Filter[] = [ { meta: { alias: 'test', disabled: false, negate: false, index: 'test' } }, diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index cd0d5e6fa23df..eb32bdc8057b2 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -33,7 +33,11 @@ import { BehaviorSubject, combineLatest, Subject } from 'rxjs'; import { map, distinctUntilChanged, startWith } from 'rxjs'; import { v4 } from 'uuid'; import { combineDashboardFiltersWithControlGroupFilters } from './controls/dashboard_control_group_integration'; -import { DashboardContainerInput, DashboardPanelState } from '../../../../common'; +import { + DashboardContainerInput, + DashboardPanelMap, + DashboardPanelState, +} from '../../../../common'; import { DEFAULT_DASHBOARD_INPUT, DEFAULT_PANEL_HEIGHT, @@ -48,7 +52,7 @@ import { import { pluginServices } from '../../../services/plugin_services'; import { runPanelPlacementStrategy } from '../../panel_placement/place_new_panel_strategies'; import { startDiffingDashboardState } from '../../state/diffing/dashboard_diffing_integration'; -import { DashboardPublicState } from '../../types'; +import { DashboardPublicState, UnsavedPanelState } from '../../types'; import { DashboardContainer } from '../dashboard_container'; import { DashboardCreationOptions } from '../dashboard_container_factory'; import { startSyncingDashboardControlGroup } from './controls/dashboard_control_group_integration'; @@ -160,6 +164,7 @@ export const initializeDashboard = async ({ dashboardBackup, embeddable: { getEmbeddableFactory }, dashboardCapabilities: { showWriteControls }, + embeddable: { reactEmbeddableRegistryHasKey }, data: { query: queryService, search: { session }, @@ -193,23 +198,17 @@ export const initializeDashboard = async ({ } // -------------------------------------------------------------------------------------- - // Gather input from session storage and local storage if integration is used. + // Combine input from saved object, and session storage // -------------------------------------------------------------------------------------- const dashboardBackupState = dashboardBackup.getState(loadDashboardReturn.dashboardId); + const runtimePanelsToRestore: UnsavedPanelState = useSessionStorageIntegration + ? dashboardBackupState?.panels ?? {} + : {}; + const sessionStorageInput = ((): Partial | undefined => { if (!useSessionStorageIntegration) return; return dashboardBackupState?.dashboardState; })(); - - if (useSessionStorageIntegration) { - untilDashboardReady().then((dashboardContainer) => { - dashboardContainer.restoredRuntimeState = dashboardBackupState?.panels; - }); - } - - // -------------------------------------------------------------------------------------- - // Combine input from saved object, session storage, & passed input to create initial input. - // -------------------------------------------------------------------------------------- const initialViewMode = (() => { if (loadDashboardReturn.managed || !showWriteControls) return ViewMode.VIEW; if ( @@ -222,16 +221,71 @@ export const initializeDashboard = async ({ return dashboardBackup.getViewMode(); })(); + const combinedSessionInput: DashboardContainerInput = { + ...DEFAULT_DASHBOARD_INPUT, + ...(loadDashboardReturn?.dashboardInput ?? {}), + ...sessionStorageInput, + }; + + // -------------------------------------------------------------------------------------- + // Combine input with overrides. + // -------------------------------------------------------------------------------------- const overrideInput = getInitialInput?.(); - const initialDashboardInput: DashboardContainerInput = omit( - cloneDeep({ - ...DEFAULT_DASHBOARD_INPUT, - ...(loadDashboardReturn?.dashboardInput ?? {}), - ...sessionStorageInput, + if (overrideInput?.panels) { + /** + * react embeddables and legacy embeddables share state very differently, so we need different + * treatment here. TODO remove this distinction when we remove the legacy embeddable system. + */ + const overridePanels: DashboardPanelMap = {}; + + for (const panel of Object.values(overrideInput?.panels)) { + if (reactEmbeddableRegistryHasKey(panel.type)) { + overridePanels[panel.explicitInput.id] = { + ...panel, + + /** + * here we need to keep the state of the panel that was already in the Dashboard if one exists. + * This is because this state will become the "last saved state" for this panel. + */ + ...(combinedSessionInput.panels[panel.explicitInput.id] ?? []), + }; + /** + * We also need to add the state of this react embeddable into the runtime state to be restored. + */ + runtimePanelsToRestore[panel.explicitInput.id] = panel.explicitInput; + } else { + /** + * if this is a legacy embeddable, the override state needs to completely overwrite the existing + * state for this panel. + */ + overridePanels[panel.explicitInput.id] = panel; + } + } - ...(initialViewMode ? { viewMode: initialViewMode } : {}), - ...overrideInput, - }), + /** + * If this is a React embeddable, we leave the "panel" state as-is and add this state to the + * runtime state to be restored on dashboard load. + */ + overrideInput.panels = overridePanels; + } + const combinedOverrideInput: DashboardContainerInput = { + ...combinedSessionInput, + ...(initialViewMode ? { viewMode: initialViewMode } : {}), + ...overrideInput, + }; + + // -------------------------------------------------------------------------------------- + // Set latest runtime state for react embeddables. + // -------------------------------------------------------------------------------------- + untilDashboardReady().then((dashboardContainer) => { + dashboardContainer.restoredRuntimeState = runtimePanelsToRestore; + }); + + // -------------------------------------------------------------------------------------- + // Combine input from saved object, session storage, & passed input to create initial input. + // -------------------------------------------------------------------------------------- + const initialDashboardInput: DashboardContainerInput = omit( + cloneDeep(combinedOverrideInput), 'controlGroupInput' ); const initialControlGroupInput: ControlGroupInput | {} = { diff --git a/src/plugins/dashboard/public/services/data/data.stub.ts b/src/plugins/dashboard/public/services/data/data.stub.ts index 3c29c8d2b5557..1bf68d7797940 100644 --- a/src/plugins/dashboard/public/services/data/data.stub.ts +++ b/src/plugins/dashboard/public/services/data/data.stub.ts @@ -8,6 +8,7 @@ // import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; import { PluginServiceFactory } from '@kbn/presentation-util-plugin/public'; import { DashboardDataService } from './types'; @@ -15,4 +16,8 @@ type DataServiceFactory = PluginServiceFactory; export const dataServiceFactory: DataServiceFactory = () => ({ ...dataPluginMock.createStartContract(), + dataViews: { + ...dataViewPluginMocks.createStartContract(), + defaultDataViewExists: async () => true, + }, }); From 88757a30a662034398f1d5782f1ad4d12bc15e9e Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 29 May 2024 17:03:11 +0200 Subject: [PATCH 20/95] Add `updated_by` to saved objects (#182687) ## Summary close https://github.com/elastic/kibana-team/issues/899 - Adds `updated_by` to saved object, similar to recently added `created_by` https://github.com/elastic/kibana/pull/179344 - Fixes `created_by` / `created_at` should be set during upsert - Improves functional tests coverage --- .buildkite/ftr_configs.yml | 1 + .../src/simple_saved_object.ts | 2 + .../src/lib/apis/bulk_create.ts | 2 + .../src/lib/apis/bulk_update.ts | 7 +- .../src/lib/apis/create.ts | 2 + .../src/lib/apis/find.test.ts | 1 + .../src/lib/apis/update.test.ts | 5 +- .../src/lib/apis/update.ts | 8 + .../src/lib/apis/utils/internal_utils.test.ts | 4 + .../src/lib/apis/utils/internal_utils.ts | 2 + .../lib/repository.security_extension.test.ts | 43 +++- .../src/lib/utils/included_fields.test.ts | 1 + .../src/lib/utils/included_fields.ts | 1 + .../src/serialization/serializer.test.ts | 22 +++ .../src/serialization/serializer.ts | 3 + .../src/validation/schema.ts | 1 + .../src/simple_saved_object.ts | 3 + .../src/simple_saved_object.mock.ts | 1 + .../src/server_types.ts | 2 + .../kibana_migrator.test.ts.snap | 3 + .../build_active_mappings.test.ts.snap | 6 + .../src/core/build_active_mappings.test.ts | 3 + .../src/core/build_active_mappings.ts | 3 + .../src/serialization.ts | 1 + .../src/saved_object_content_storage.ts | 2 + .../kbn-content-management-utils/src/types.ts | 1 + .../apis/content_management/created_by.ts | 8 +- .../apis/content_management/helpers.ts | 47 +++-- .../apis/content_management/index.ts | 1 + .../apis/content_management/updated_by.ts | 185 ++++++++++++++++++ .../user_profiles/apis/bulk_create.ts | 43 ++++ .../user_profiles/apis/bulk_update.ts | 94 +++++++++ .../user_profiles/apis/create.ts | 38 ++++ .../user_profiles/apis/index.ts | 25 +++ .../user_profiles/apis/update.ts | 136 +++++++++++++ .../user_profiles/config.ts | 11 ++ .../user_profiles/helpers.ts | 49 +++++ 37 files changed, 742 insertions(+), 25 deletions(-) create mode 100644 x-pack/test/api_integration/apis/content_management/updated_by.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_create.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_update.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/apis/create.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/apis/index.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/apis/update.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/config.ts create mode 100644 x-pack/test/saved_object_api_integration/user_profiles/helpers.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 052f6623dc1a6..b5e62a9c5c7b4 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -368,6 +368,7 @@ enabled: - x-pack/test/saved_object_api_integration/security_and_spaces/config_basic.ts - x-pack/test/saved_object_api_integration/security_and_spaces/config_trial.ts - x-pack/test/saved_object_api_integration/spaces_only/config.ts + - x-pack/test/saved_object_api_integration/user_profiles/config.ts - x-pack/test/saved_object_tagging/api_integration/security_and_spaces/config.ts - x-pack/test/saved_object_tagging/api_integration/tagging_api/config.ts - x-pack/test/saved_object_tagging/api_integration/tagging_usage_collection/config.ts diff --git a/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts b/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts index c5918ff16ce61..903c6e2ab5d97 100644 --- a/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts +++ b/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts @@ -42,6 +42,8 @@ export interface SimpleSavedObject { references: SavedObjectType['references']; /** The date this object was last updated */ updatedAt: SavedObjectType['updated_at']; + /** The user that last updated this object */ + updatedBy: SavedObjectType['updated_by']; /** The date this object was created */ createdAt: SavedObjectType['created_at']; /** The user that created this object */ diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts index c9b9fdfb768aa..e5f65665c6a25 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts @@ -85,6 +85,7 @@ export const performBulkCreate = async ( } = options; const time = getCurrentTime(); const createdBy = userHelper.getCurrentUserProfileUid(); + const updatedBy = createdBy; let preflightCheckIndexCounter = 0; const expectedResults = objects.map((object) => { @@ -234,6 +235,7 @@ export const performBulkCreate = async ( updated_at: time, created_at: time, ...(createdBy && { created_by: createdBy }), + ...(updatedBy && { updated_by: updatedBy }), references: object.references || [], originId, }) as SavedObjectSanitizedDoc; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.ts index d618bf7a2c82f..edaabbe7b5a7c 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_update.ts @@ -82,10 +82,12 @@ export const performBulkUpdate = async ( common: commonHelper, encryption: encryptionHelper, migration: migrationHelper, + user: userHelper, } = helpers; const { securityExtension } = extensions; const { migrationVersionCompatibility } = options; const namespace = commonHelper.getCurrentNamespace(options.namespace); + const updatedBy = userHelper.getCurrentUserProfileUid(); const time = getCurrentTime(); let bulkGetRequestIndexCounter = 0; @@ -120,6 +122,7 @@ export const performBulkUpdate = async ( const documentToSave = { [type]: attributes, updated_at: time, + updated_by: updatedBy, ...(Array.isArray(references) && { references }), }; @@ -304,6 +307,7 @@ export const performBulkUpdate = async ( namespaces, attributes: updatedAttributes, updated_at: time, + updated_by: updatedBy, ...(Array.isArray(documentToSave.references) && { references: documentToSave.references }), }); const updatedMigratedDocumentToSave = serializer.savedObjectToRaw( @@ -364,7 +368,7 @@ export const performBulkUpdate = async ( const { _seq_no: seqNo, _primary_term: primaryTerm } = rawResponse; // eslint-disable-next-line @typescript-eslint/naming-convention - const { [type]: attributes, references, updated_at } = documentToSave; + const { [type]: attributes, references, updated_at, updated_by } = documentToSave; const { originId } = rawMigratedUpdatedDoc._source; return { @@ -373,6 +377,7 @@ export const performBulkUpdate = async ( ...(namespaces && { namespaces }), ...(originId && { originId }), updated_at, + updated_by, version: encodeVersion(seqNo, primaryTerm), attributes, references, diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts index ebb6f8e59dbc7..e6e690da3004f 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts @@ -71,6 +71,7 @@ export const performCreate = async ( const time = getCurrentTime(); const createdBy = userHelper.getCurrentUserProfileUid(); + const updatedBy = createdBy; let savedObjectNamespace: string | undefined; let savedObjectNamespaces: string[] | undefined; let existingOriginId: string | undefined; @@ -136,6 +137,7 @@ export const performCreate = async ( created_at: time, updated_at: time, ...(createdBy && { created_by: createdBy }), + ...(updatedBy && { updated_by: updatedBy }), ...(Array.isArray(references) && { references }), }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts index a10d4e1f7a30a..755d535b3bd2b 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts @@ -149,6 +149,7 @@ describe('find', () => { 'typeMigrationVersion', 'managed', 'updated_at', + 'updated_by', 'created_at', 'created_by', 'originId', diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts index a5a2d82e2ac18..117a36d3960cf 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts @@ -43,6 +43,7 @@ import { createConflictErrorPayload, createGenericNotFoundErrorPayload, updateSuccess, + mockTimestampFieldsWithCreated, } from '../../test_helpers/repository.test.common'; describe('#update', () => { @@ -319,7 +320,7 @@ describe('#update', () => { const expected = { 'index-pattern': { description: 'bar', title: 'foo' }, type: 'index-pattern', - ...mockTimestampFields, + ...mockTimestampFieldsWithCreated, }; expect( (client.create.mock.calls[0][0] as estypes.CreateRequest).body! @@ -352,7 +353,7 @@ describe('#update', () => { multiNamespaceIsolatedType: { description: 'bar', title: 'foo' }, namespaces: ['default'], type: 'multiNamespaceIsolatedType', - ...mockTimestampFields, + ...mockTimestampFieldsWithCreated, }; expect( (client.create.mock.calls[0][0] as estypes.CreateRequest).body! diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.ts index 5c7eb11786db5..ee45ba5abf7bb 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.ts @@ -81,6 +81,7 @@ export const executeUpdate = async ( preflight: preflightHelper, migration: migrationHelper, validation: validationHelper, + user: userHelper, } = helpers; const { securityExtension } = extensions; const typeDefinition = registry.getType(type)!; @@ -151,6 +152,7 @@ export const executeUpdate = async ( // END ALL PRE_CLIENT CALL CHECKS && MIGRATE EXISTING DOC; const time = getCurrentTime(); + const updatedBy = userHelper.getCurrentUserProfileUid(); let updatedOrCreatedSavedObject: SavedObject; // `upsert` option set and document was not found -> we need to perform an upsert operation const shouldPerformUpsert = upsert && docNotFound; @@ -176,7 +178,9 @@ export const executeUpdate = async ( attributes: { ...(await encryptionHelper.optionallyEncryptAttributes(type, id, namespace, upsert)), }, + created_at: time, updated_at: time, + ...(updatedBy && { created_by: updatedBy, updated_by: updatedBy }), ...(Array.isArray(references) && { references }), }) as SavedObjectSanitizedDoc; validationHelper.validateObjectForCreate(type, migratedUpsert); @@ -232,7 +236,9 @@ export const executeUpdate = async ( updatedOrCreatedSavedObject = { id, type, + created_at: time, updated_at: time, + ...(updatedBy && { created_by: updatedBy, updated_by: updatedBy }), version: encodeHitVersion(createDocResponseBody), namespaces, ...(originId && { originId }), @@ -273,6 +279,7 @@ export const executeUpdate = async ( namespaces: savedObjectNamespaces, attributes: updatedAttributes, updated_at: time, + updated_by: updatedBy, ...(Array.isArray(references) && { references }), }); @@ -336,6 +343,7 @@ export const executeUpdate = async ( id, type, updated_at: time, + ...(updatedBy && { updated_by: updatedBy }), version: encodeHitVersion(indexDocResponseBody), namespaces, ...(originId && { originId }), diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts index bcc786aa8c340..42cb6137095ba 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts @@ -102,6 +102,8 @@ describe('#getSavedObjectFromSource', () => { const updated_at = 'updatedAt'; // eslint-disable-next-line @typescript-eslint/naming-convention const created_by = 'createdBy'; + // eslint-disable-next-line @typescript-eslint/naming-convention + const updated_by = 'updatedBy'; const managed = false; function createRawDoc( @@ -123,6 +125,7 @@ describe('#getSavedObjectFromSource', () => { originId, updated_at, created_by, + updated_by, ...namespaceAttrs, }, }; @@ -145,6 +148,7 @@ describe('#getSavedObjectFromSource', () => { references, type, updated_at, + updated_by, created_by, version: encodeHitVersion(doc), }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts index 379cd21337651..da5142bdde465 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts @@ -110,6 +110,7 @@ export function getSavedObjectFromSource( updated_at: updatedAt, created_at: createdAt, created_by: createdBy, + updated_by: updatedBy, coreMigrationVersion, typeMigrationVersion, managed, @@ -136,6 +137,7 @@ export function getSavedObjectFromSource( ...(updatedAt && { updated_at: updatedAt }), ...(createdAt && { created_at: createdAt }), ...(createdBy && { created_by: createdBy }), + ...(updatedBy && { updated_by: updatedBy }), version: encodeHitVersion(doc), attributes: doc._source[type], references: doc._source.references || [], diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts index 19062e0560243..74d0e85785e12 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts @@ -302,6 +302,20 @@ describe('SavedObjectsRepository Security Extension', () => { }) ); }); + + test(`adds updated_by to the saved object when the current user is available`, async () => { + const profileUid = 'profileUid'; + mockSecurityExt.getCurrentUser.mockImplementationOnce(() => + mockAuthenticatedUser({ profile_uid: profileUid }) + ); + + const result = await updateSuccess(client, repository, registry, type, id, attributes, { + namespace, + }); + + expect(result).not.toHaveProperty('created_by'); + expect(result.updated_by).toBe(profileUid); + }); }); describe('#create', () => { @@ -425,7 +439,7 @@ describe('SavedObjectsRepository Security Extension', () => { ); }); - test(`adds created_by to the saved object when the current user is available`, async () => { + test(`adds created_by, updated_by to the saved object when the current user is available`, async () => { const profileUid = 'profileUid'; mockSecurityExt.getCurrentUser.mockImplementationOnce(() => mockAuthenticatedUser({ profile_uid: profileUid }) @@ -434,14 +448,16 @@ describe('SavedObjectsRepository Security Extension', () => { namespace, }); expect(response.created_by).toBe(profileUid); + expect(response.updated_by).toBe(profileUid); }); - test(`keeps created_by empty if the current user is not available`, async () => { + test(`keeps created_by, updated_by empty if the current user is not available`, async () => { mockSecurityExt.getCurrentUser.mockImplementationOnce(() => null); const response = await repository.create(MULTI_NAMESPACE_CUSTOM_INDEX_TYPE, attributes, { namespace, }); expect(response).not.toHaveProperty('created_by'); + expect(response).not.toHaveProperty('updated_by'); }); }); @@ -1345,7 +1361,7 @@ describe('SavedObjectsRepository Security Extension', () => { }); }); - test(`adds created_by to the saved object when the current user is available`, async () => { + test(`adds created_by, updated_by to the saved object when the current user is available`, async () => { const profileUid = 'profileUid'; mockSecurityExt.getCurrentUser.mockImplementationOnce(() => mockAuthenticatedUser({ profile_uid: profileUid }) @@ -1353,13 +1369,19 @@ describe('SavedObjectsRepository Security Extension', () => { const response = await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); expect(response.saved_objects[0].created_by).toBe(profileUid); expect(response.saved_objects[1].created_by).toBe(profileUid); + + expect(response.saved_objects[0].updated_by).toBe(profileUid); + expect(response.saved_objects[1].updated_by).toBe(profileUid); }); - test(`keeps created_by empty if the current user is not available`, async () => { + test(`keeps created_by, updated_by empty if the current user is not available`, async () => { mockSecurityExt.getCurrentUser.mockImplementationOnce(() => null); const response = await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); expect(response.saved_objects[0]).not.toHaveProperty('created_by'); expect(response.saved_objects[1]).not.toHaveProperty('created_by'); + + expect(response.saved_objects[0]).not.toHaveProperty('updated_by'); + expect(response.saved_objects[1]).not.toHaveProperty('updated_by'); }); }); @@ -1512,6 +1534,19 @@ describe('SavedObjectsRepository Security Extension', () => { expect(typeMap).toBe(authMap); }); }); + + test(`adds updated_by to the saved object when the current user is available`, async () => { + const profileUid = 'profileUid'; + mockSecurityExt.getCurrentUser.mockImplementationOnce(() => + mockAuthenticatedUser({ profile_uid: profileUid }) + ); + + const objects = [obj1, obj2]; + const result = await bulkUpdateSuccess(client, repository, registry, objects, { namespace }); + + expect(result.saved_objects[0].updated_by).toBe(profileUid); + expect(result.saved_objects[1].updated_by).toBe(profileUid); + }); }); describe('#bulkDelete', () => { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts index b2bda0ec4007c..81033c0b5d7b2 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts @@ -22,6 +22,7 @@ describe('getRootFields', () => { "typeMigrationVersion", "managed", "updated_at", + "updated_by", "created_at", "created_by", "originId", diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts index c4d023d2b5fff..fdfae55787200 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts @@ -16,6 +16,7 @@ const ROOT_FIELDS = [ 'typeMigrationVersion', 'managed', 'updated_at', + 'updated_by', 'created_at', 'created_by', 'originId', diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts index 05fe2a1239976..2ab5be239b80d 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts @@ -297,6 +297,18 @@ describe('#rawToSavedObject', () => { expect(actual).toHaveProperty('updated_at', now); }); + test('if specified it copies the _source.updated_by property to updated_by', () => { + const updatedBy = 'elastic'; + const actual = singleNamespaceSerializer.rawToSavedObject({ + _id: 'foo:bar', + _source: { + type: 'foo', + updated_by: updatedBy, + }, + }); + expect(actual).toHaveProperty('updated_by', updatedBy); + }); + test('if specified it copies the _source.created_at property to created_at', () => { const now = Date(); const actual = singleNamespaceSerializer.rawToSavedObject({ @@ -341,6 +353,16 @@ describe('#rawToSavedObject', () => { expect(actual).not.toHaveProperty('created_at'); }); + test(`if _source.updated_by is unspecified it doesn't set updated_by`, () => { + const actual = singleNamespaceSerializer.rawToSavedObject({ + _id: 'foo:bar', + _source: { + type: 'foo', + }, + }); + expect(actual).not.toHaveProperty('updated_by'); + }); + test('if specified it copies the _source.originId property to originId', () => { const originId = 'baz'; const actual = singleNamespaceSerializer.rawToSavedObject({ diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts index 7faffa75d61ed..6448b87d39281 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts @@ -122,6 +122,7 @@ export class SavedObjectsSerializer implements ISavedObjectsSerializer { ...(coreMigrationVersion && { coreMigrationVersion }), ...(typeMigrationVersion != null ? { typeMigrationVersion } : {}), ...(_source.updated_at && { updated_at: _source.updated_at }), + ...(_source.updated_by && { updated_by: _source.updated_by }), ...(_source.created_at && { created_at: _source.created_at }), ...(_source.created_by && { created_by: _source.created_by }), ...(version && { version }), @@ -144,6 +145,7 @@ export class SavedObjectsSerializer implements ISavedObjectsSerializer { migrationVersion, // eslint-disable-next-line @typescript-eslint/naming-convention updated_at, + updated_by: updatedBy, created_at: createdAt, created_by: createdBy, version, @@ -164,6 +166,7 @@ export class SavedObjectsSerializer implements ISavedObjectsSerializer { ...(coreMigrationVersion && { coreMigrationVersion }), ...(typeMigrationVersion != null ? { typeMigrationVersion } : {}), ...(updated_at && { updated_at }), + ...(updatedBy && { updated_by: updatedBy }), ...(createdAt && { created_at: createdAt }), ...(createdBy && { created_by: createdBy }), }; diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts index 8a23defbbf267..952aff1d221ce 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts @@ -36,6 +36,7 @@ const baseSchema = schema.object({ coreMigrationVersion: schema.maybe(schema.string()), typeMigrationVersion: schema.maybe(schema.string()), updated_at: schema.maybe(schema.string()), + updated_by: schema.maybe(schema.string()), created_at: schema.maybe(schema.string()), created_by: schema.maybe(schema.string()), version: schema.maybe(schema.string()), diff --git a/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts b/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts index af830b2d6b68b..60d108c79981b 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts +++ b/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts @@ -33,6 +33,7 @@ export class SimpleSavedObjectImpl implements SimpleSavedObject public error: SavedObjectType['error']; public references: SavedObjectType['references']; public updatedAt: SavedObjectType['updated_at']; + public updatedBy: SavedObjectType['updated_by']; public createdAt: SavedObjectType['created_at']; public createdBy: SavedObjectType['created_by']; public namespaces: SavedObjectType['namespaces']; @@ -52,6 +53,7 @@ export class SimpleSavedObjectImpl implements SimpleSavedObject managed, namespaces, updated_at: updatedAt, + updated_by: updatedBy, created_at: createdAt, created_by: createdBy, }: SavedObjectType @@ -69,6 +71,7 @@ export class SimpleSavedObjectImpl implements SimpleSavedObject this.updatedAt = updatedAt; this.createdAt = createdAt; this.createdBy = createdBy; + this.updatedBy = updatedBy; if (error) { this.error = error; } diff --git a/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts b/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts index 288838b54ffcd..0ea364a925da7 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts @@ -45,6 +45,7 @@ const createSimpleSavedObjectMock = ( error: savedObject.error, references: savedObject.references, updatedAt: savedObject.updated_at, + updatedBy: savedObject.updated_by, createdAt: savedObject.created_at, createdBy: savedObject.created_by, namespaces: savedObject.namespaces, diff --git a/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts b/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts index f5a69f8a2ee86..09cb65c2f4d23 100644 --- a/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts +++ b/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts @@ -76,6 +76,8 @@ export interface SavedObject { created_by?: string; /** Timestamp of the last time this document had been updated. */ updated_at?: string; + /** The ID of the user who last updated this object. */ + updated_by?: string; /** Error associated with this object, populated if an operation failed for this object. */ error?: SavedObjectError; /** The data for a Saved Object is stored as an object in the `attributes` property. **/ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap index 2c25694a8c270..402826137b359 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap @@ -62,6 +62,9 @@ Object { "updated_at": Object { "type": "date", }, + "updated_by": Object { + "type": "keyword", + }, }, } `; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap index 13c6531ca969c..614f766133e19 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap @@ -54,6 +54,9 @@ Object { "updated_at": Object { "type": "date", }, + "updated_by": Object { + "type": "keyword", + }, }, } `; @@ -129,6 +132,9 @@ Object { "updated_at": Object { "type": "date", }, + "updated_by": Object { + "type": "keyword", + }, }, } `; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts index ea4ff84564006..498ec20453138 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts @@ -99,6 +99,9 @@ describe('getBaseMappings', () => { updated_at: { type: 'date', }, + updated_by: { + type: 'keyword', + }, created_at: { type: 'date', }, diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts index f5744669336b4..5525814c07238 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts @@ -62,6 +62,9 @@ export function getBaseMappings(): IndexMapping { updated_at: { type: 'date', }, + updated_by: { + type: 'keyword', + }, created_at: { type: 'date', }, diff --git a/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts b/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts index 514956e8dd7dc..fd61186128000 100644 --- a/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts +++ b/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts @@ -111,6 +111,7 @@ export interface SavedObjectDoc { typeMigrationVersion?: string; version?: string; updated_at?: string; + updated_by?: string; created_at?: string; created_by?: string; originId?: string; diff --git a/packages/kbn-content-management-utils/src/saved_object_content_storage.ts b/packages/kbn-content-management-utils/src/saved_object_content_storage.ts index 36d9979cfdc8a..25540c96e50c0 100644 --- a/packages/kbn-content-management-utils/src/saved_object_content_storage.ts +++ b/packages/kbn-content-management-utils/src/saved_object_content_storage.ts @@ -64,6 +64,7 @@ function savedObjectToItem( id, type, updated_at: updatedAt, + updated_by: updatedBy, created_at: createdAt, created_by: createdBy, attributes, @@ -78,6 +79,7 @@ function savedObjectToItem( id, type, managed, + updatedBy, updatedAt, createdAt, createdBy, diff --git a/packages/kbn-content-management-utils/src/types.ts b/packages/kbn-content-management-utils/src/types.ts index 6417d9af1e888..9c9da41f6e00a 100644 --- a/packages/kbn-content-management-utils/src/types.ts +++ b/packages/kbn-content-management-utils/src/types.ts @@ -202,6 +202,7 @@ export interface SOWithMetadata { createdAt?: string; updatedAt?: string; createdBy?: string; + updatedBy?: string; error?: { error: string; message: string; diff --git a/x-pack/test/api_integration/apis/content_management/created_by.ts b/x-pack/test/api_integration/apis/content_management/created_by.ts index 0dfe029bea869..0deb94f40dd3c 100644 --- a/x-pack/test/api_integration/apis/content_management/created_by.ts +++ b/x-pack/test/api_integration/apis/content_management/created_by.ts @@ -12,6 +12,7 @@ import { setupInteractiveUser, sampleDashboard, cleanupInteractiveUser, + LoginAsInteractiveUserResponse, } from './helpers'; export default function ({ getService }: FtrProviderContext) { @@ -32,11 +33,11 @@ export default function ({ getService }: FtrProviderContext) { describe('for interactive user', function () { const supertest = getService('supertestWithoutAuth'); - let sessionHeaders: { [key: string]: string } = {}; + let interactiveUser: LoginAsInteractiveUserResponse; before(async () => { await setupInteractiveUser({ getService }); - sessionHeaders = await loginAsInteractiveUser({ getService }); + interactiveUser = await loginAsInteractiveUser({ getService }); }); after(async () => { @@ -46,13 +47,14 @@ export default function ({ getService }: FtrProviderContext) { it('created_by is with profile_id', async () => { const createResponse = await supertest .post('/api/content_management/rpc/create') - .set(sessionHeaders) + .set(interactiveUser.headers) .set('kbn-xsrf', 'true') .send(sampleDashboard); expect(createResponse.status).to.be(200); expect(createResponse.body.result.result.item).to.be.ok(); expect(createResponse.body.result.result.item).to.have.key('createdBy'); + expect(createResponse.body.result.result.item.createdBy).to.be(interactiveUser.uid); }); }); }); diff --git a/x-pack/test/api_integration/apis/content_management/helpers.ts b/x-pack/test/api_integration/apis/content_management/helpers.ts index 81af941abfc6d..856fe98b108c3 100644 --- a/x-pack/test/api_integration/apis/content_management/helpers.ts +++ b/x-pack/test/api_integration/apis/content_management/helpers.ts @@ -21,10 +21,11 @@ export const sampleDashboard = { version: 2, }; -const usernameOrRole = 'content_manager_dashboard'; +const role = 'content_manager_dashboard'; +const users = ['content_manager_dashboard_1', 'content_manager_dashboard_2'] as const; export async function setupInteractiveUser({ getService }: Pick) { const security = getService('security'); - await security.role.create(usernameOrRole, { + await security.role.create(role, { elasticsearch: { cluster: [], indices: [], run_as: [] }, kibana: [ { @@ -35,27 +36,38 @@ export async function setupInteractiveUser({ getService }: Pick) { const security = getService('security'); - await security.user.delete(usernameOrRole); - await security.role.delete(usernameOrRole); + for (const user of users) { + await security.user.delete(user); + } + await security.role.delete(role); } +export interface LoginAsInteractiveUserResponse { + headers: { + Cookie: string; + }; + uid: string; +} export async function loginAsInteractiveUser({ getService, -}: Pick): Promise<{ - Cookie: string; -}> { + username = users[0], +}: Pick & { + username?: typeof users[number]; +}): Promise { const supertest = getService('supertestWithoutAuth'); const response = await supertest @@ -65,10 +77,15 @@ export async function loginAsInteractiveUser({ providerType: 'basic', providerName: 'basic', currentURL: '/', - params: { username: usernameOrRole, password: usernameOrRole }, + params: { username, password: username }, }) .expect(200); const cookie = parseCookie(response.header['set-cookie'][0])!.cookieString(); - return { Cookie: cookie }; + const { body: userWithProfileId } = await supertest + .get('/internal/security/me') + .set('Cookie', cookie) + .expect(200); + + return { headers: { Cookie: cookie }, uid: userWithProfileId.profile_uid }; } diff --git a/x-pack/test/api_integration/apis/content_management/index.ts b/x-pack/test/api_integration/apis/content_management/index.ts index 01967e73fae8d..50f4f798e841a 100644 --- a/x-pack/test/api_integration/apis/content_management/index.ts +++ b/x-pack/test/api_integration/apis/content_management/index.ts @@ -10,5 +10,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile, getService }: FtrProviderContext) { describe('content management', function () { loadTestFile(require.resolve('./created_by')); + loadTestFile(require.resolve('./updated_by')); }); } diff --git a/x-pack/test/api_integration/apis/content_management/updated_by.ts b/x-pack/test/api_integration/apis/content_management/updated_by.ts new file mode 100644 index 0000000000000..60821273b988a --- /dev/null +++ b/x-pack/test/api_integration/apis/content_management/updated_by.ts @@ -0,0 +1,185 @@ +/* + * 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'; +import { + loginAsInteractiveUser, + setupInteractiveUser, + sampleDashboard, + cleanupInteractiveUser, + LoginAsInteractiveUserResponse, +} from './helpers'; + +export default function ({ getService }: FtrProviderContext) { + describe('updated_by', function () { + describe('for not interactive user', function () { + const supertest = getService('supertest'); + it('updated_by is empty', async () => { + const createResponse = await supertest + .post('/api/content_management/rpc/create') + .set('kbn-xsrf', 'true') + .send(sampleDashboard); + + expect(createResponse.status).to.be(200); + expect(createResponse.body.result.result.item).to.be.ok(); + expect(createResponse.body.result.result.item).to.not.have.key('updatedBy'); + + const updateResponse = await supertest + .post('/api/content_management/rpc/update') + .set('kbn-xsrf', 'true') + .send({ + contentTypeId: sampleDashboard.contentTypeId, + version: sampleDashboard.version, + options: { + references: [], + mergeAttributes: false, + }, + id: createResponse.body.result.result.item.id, + data: { + title: 'updated title', + }, + }); + + expect(updateResponse.status).to.be(200); + expect(updateResponse.body.result.result.item).to.be.ok(); + + const getResponse = await supertest + .post('/api/content_management/rpc/get') + .set('kbn-xsrf', 'true') + .send({ + id: createResponse.body.result.result.item.id, + contentTypeId: sampleDashboard.contentTypeId, + version: sampleDashboard.version, + }); + + expect(getResponse.status).to.be(200); + expect(getResponse.body.result.result.item).to.be.ok(); + expect(getResponse.body.result.result.item).to.not.have.key('updatedBy'); + }); + }); + + describe('for interactive user', function () { + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const supertestWithAuth = getService('supertest'); + let interactiveUser: LoginAsInteractiveUserResponse; + let createResponse: any; + + before(async () => { + await setupInteractiveUser({ getService }); + interactiveUser = await loginAsInteractiveUser({ getService }); + }); + + beforeEach(async () => { + createResponse = await supertestWithoutAuth + .post('/api/content_management/rpc/create') + .set(interactiveUser.headers) + .set('kbn-xsrf', 'true') + .send(sampleDashboard); + }); + + after(async () => { + await cleanupInteractiveUser({ getService }); + }); + + it('updated_by is with profile_id', async () => { + expect(createResponse.status).to.be(200); + expect(createResponse.body.result.result.item).to.be.ok(); + expect(createResponse.body.result.result.item).to.have.key('updatedBy'); + expect(createResponse.body.result.result.item.updatedBy).to.be(interactiveUser.uid); + }); + + it('updated_by is empty after update with non interactive user', async () => { + const updateResponse = await supertestWithAuth + .post('/api/content_management/rpc/update') + .set('kbn-xsrf', 'true') + .send({ + contentTypeId: sampleDashboard.contentTypeId, + version: sampleDashboard.version, + options: { + references: [], + mergeAttributes: false, + }, + id: createResponse.body.result.result.item.id, + data: { + title: 'updated title', + }, + }); + + expect(updateResponse.status).to.be(200); + + const getResponse = await supertestWithAuth + .post('/api/content_management/rpc/get') + .set('kbn-xsrf', 'true') + .send({ + id: createResponse.body.result.result.item.id, + contentTypeId: sampleDashboard.contentTypeId, + version: sampleDashboard.version, + }); + + expect(getResponse.status).to.be(200); + expect(getResponse.body.result.result.item).to.be.ok(); + + const createdObject = createResponse.body.result.result.item; + const updatedObject = getResponse.body.result.result.item; + + expect(updatedObject).to.not.have.key('updatedBy'); + expect(updatedObject.createdBy).to.eql(createdObject.createdBy); + expect(updatedObject.createdAt).to.eql(createdObject.createdAt); + expect(updatedObject.updatedAt).to.be.greaterThan(createdObject.updatedAt); + }); + + it('updated_by is with profile_id of another user after update', async () => { + const interactiveUser2 = await loginAsInteractiveUser({ + getService, + username: 'content_manager_dashboard_2', + }); + + const updateResponse = await supertestWithoutAuth + .post('/api/content_management/rpc/update') + .set(interactiveUser2.headers) + .set('kbn-xsrf', 'true') + .send({ + contentTypeId: sampleDashboard.contentTypeId, + version: sampleDashboard.version, + options: { + references: [], + mergeAttributes: false, + }, + id: createResponse.body.result.result.item.id, + data: { + title: 'updated title', + }, + }); + + expect(updateResponse.status).to.be(200); + + const getResponse = await supertestWithAuth + .post('/api/content_management/rpc/get') + .set('kbn-xsrf', 'true') + .send({ + id: createResponse.body.result.result.item.id, + contentTypeId: sampleDashboard.contentTypeId, + version: sampleDashboard.version, + }); + + expect(getResponse.status).to.be(200); + expect(getResponse.body.result.result.item).to.be.ok(); + + const createdObject = createResponse.body.result.result.item; + const updatedObject = getResponse.body.result.result.item; + + expect(updatedObject).to.have.key('updatedBy'); + expect(updatedObject.updatedBy).to.not.eql(createdObject.updatedBy); + expect(updatedObject.createdBy).to.eql(interactiveUser.uid); + expect(updatedObject.updatedBy).to.eql(interactiveUser2.uid); + expect(updatedObject.createdAt).to.eql(createdObject.createdAt); + expect(updatedObject.updatedAt).to.be.greaterThan(createdObject.updatedAt); + }); + }); + }); +} diff --git a/x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_create.ts b/x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_create.ts new file mode 100644 index 0000000000000..b615df2b35bf2 --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_create.ts @@ -0,0 +1,43 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { loginAsInteractiveUser, LoginAsInteractiveUserResponse } from '../helpers'; +import { TEST_CASES } from '../../common/suites/create'; +import { AUTHENTICATION } from '../../common/lib/authentication'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertestWithoutAuth'); + describe('bulk_create', function () { + let interactiveUser: LoginAsInteractiveUserResponse; + + before(async () => { + interactiveUser = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_USER, + }); + }); + + it('created_by/updated_by is with profile_id', async () => { + const soType = TEST_CASES.NEW_SINGLE_NAMESPACE_OBJ.type; + const createResponse = await supertest + .post(`/api/saved_objects/_bulk_create`) + .set(interactiveUser.headers) + .send([ + { type: soType, attributes: { title: 'test' } }, + { type: soType, attributes: { title: 'test' } }, + ]); + + expect(createResponse.status).to.be(200); + const [so1, so2] = createResponse.body.saved_objects; + expect(so1.created_by).to.be(interactiveUser.uid); + expect(so1.updated_by).to.be(interactiveUser.uid); + expect(so2.created_by).to.be(interactiveUser.uid); + expect(so2.updated_by).to.be(interactiveUser.uid); + }); + }); +} diff --git a/x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_update.ts b/x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_update.ts new file mode 100644 index 0000000000000..f7b5098d921d6 --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/apis/bulk_update.ts @@ -0,0 +1,94 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { loginAsInteractiveUser } from '../helpers'; +import { TEST_CASES } from '../../common/suites/create'; +import { AUTHENTICATION } from '../../common/lib/authentication'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertestWithoutAuth'); + const esArchiver = getService('esArchiver'); + + describe('bulk_update', function () { + before(async () => { + await esArchiver.load( + 'x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces' + ); + }); + + after(async () => { + await esArchiver.unload( + 'x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces' + ); + }); + + it('updates updated_by with profile_id, created_by is untouched', async () => { + const { type, id } = TEST_CASES.SINGLE_NAMESPACE_DEFAULT_SPACE; + + // update with interactive user 1 + const interactiveUser1 = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_USER, + }); + const updateResponse1 = await supertest + .put(`/api/saved_objects/_bulk_update`) + .set(interactiveUser1.headers) + .send([{ id, type, attributes: { title: 'test' } }]); + + expect(updateResponse1.status).to.be(200); + expect(updateResponse1.body.saved_objects[0].updated_by).to.be(interactiveUser1.uid); + expect(updateResponse1.body.saved_objects[0].created_by).not.to.be.ok(); + + const getResponse1 = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser1.headers); + + expect(getResponse1.body.updated_by).to.be(interactiveUser1.uid); + expect(getResponse1.body.created_by).not.to.be.ok(); + + // update with interactive user 2 + const interactiveUser2 = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_DEFAULT_SPACE_ALL_USER, + }); + + const updateResponse2 = await supertest + .put(`/api/saved_objects/_bulk_update`) + .set(interactiveUser2.headers) + .send([{ type, id, attributes: { title: 'test 2' } }]); + + expect(updateResponse2.status).to.be(200); + expect(updateResponse2.body.saved_objects[0].updated_by).to.be(interactiveUser2.uid); + expect(updateResponse2.body.saved_objects[0].created_by).not.to.be.ok(); + + const getResponse2 = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers); + + expect(getResponse2.body.updated_by).to.be(interactiveUser2.uid); + expect(getResponse2.body.created_by).not.to.be.ok(); + + // update with "non-interactive" user, updated_by should become empty + const updateResponse3 = await supertest + .put(`/api/saved_objects/_bulk_update`) + .auth(AUTHENTICATION.KIBANA_RBAC_USER.username, AUTHENTICATION.KIBANA_RBAC_USER.password) + .send([{ type, id, attributes: { title: 'test 3' } }]); + + expect(updateResponse3.status).to.be(200); + expect(updateResponse3.body.saved_objects[0].updated_by).not.to.be.ok(); + expect(updateResponse3.body.saved_objects[0].created_by).not.to.be.ok(); + + const getResponse3 = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers); + + expect(getResponse3.body.updated_by).not.to.be.ok(); + expect(getResponse3.body.created_by).not.to.be.ok(); + }); + }); +} diff --git a/x-pack/test/saved_object_api_integration/user_profiles/apis/create.ts b/x-pack/test/saved_object_api_integration/user_profiles/apis/create.ts new file mode 100644 index 0000000000000..d8dbdf054e51c --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/apis/create.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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { loginAsInteractiveUser, LoginAsInteractiveUserResponse } from '../helpers'; +import { TEST_CASES } from '../../common/suites/create'; +import { AUTHENTICATION } from '../../common/lib/authentication'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertestWithoutAuth'); + describe('create', function () { + let interactiveUser: LoginAsInteractiveUserResponse; + + before(async () => { + interactiveUser = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_USER, + }); + }); + + it('created_by/updated_by is with profile_id', async () => { + const soType = TEST_CASES.NEW_SINGLE_NAMESPACE_OBJ.type; + const createResponse = await supertest + .post(`/api/saved_objects/${soType}`) + .set(interactiveUser.headers) + .send({ attributes: { title: 'test' } }); + + expect(createResponse.status).to.be(200); + const so = createResponse.body; + expect(so.created_by).to.be(interactiveUser.uid); + expect(so.updated_by).to.be(interactiveUser.uid); + }); + }); +} diff --git a/x-pack/test/saved_object_api_integration/user_profiles/apis/index.ts b/x-pack/test/saved_object_api_integration/user_profiles/apis/index.ts new file mode 100644 index 0000000000000..75c8c23a81aed --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/apis/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { createUsersAndRoles } from '../../common/lib/create_users_and_roles'; + +export default function ({ loadTestFile, getService }: FtrProviderContext) { + const es = getService('es'); + const supertest = getService('supertest'); + + describe('saved objects user profiles integration', function () { + before(async () => { + await createUsersAndRoles(es, supertest); + }); + + loadTestFile(require.resolve('./create')); + loadTestFile(require.resolve('./bulk_create')); + loadTestFile(require.resolve('./update')); + loadTestFile(require.resolve('./bulk_update')); + }); +} diff --git a/x-pack/test/saved_object_api_integration/user_profiles/apis/update.ts b/x-pack/test/saved_object_api_integration/user_profiles/apis/update.ts new file mode 100644 index 0000000000000..48f388003c4ad --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/apis/update.ts @@ -0,0 +1,136 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { loginAsInteractiveUser } from '../helpers'; +import { TEST_CASES } from '../../common/suites/create'; +import { AUTHENTICATION } from '../../common/lib/authentication'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertestWithoutAuth'); + const esArchiver = getService('esArchiver'); + + describe('update', function () { + before(async () => { + await esArchiver.load( + 'x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces' + ); + }); + + after(async () => { + await esArchiver.unload( + 'x-pack/test/saved_object_api_integration/common/fixtures/es_archiver/saved_objects/spaces' + ); + }); + + it('updates updated_by with profile_id, created_by is untouched', async () => { + const { type, id } = TEST_CASES.SINGLE_NAMESPACE_DEFAULT_SPACE; + + // update with interactive user 1 + const interactiveUser1 = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_USER, + }); + const updateResponse1 = await supertest + .put(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser1.headers) + .send({ attributes: { title: 'test' } }); + + expect(updateResponse1.status).to.be(200); + expect(updateResponse1.body.updated_by).to.be(interactiveUser1.uid); + expect(updateResponse1.body.created_by).not.to.be.ok(); + + const getResponse1 = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser1.headers); + + expect(getResponse1.body.updated_by).to.be(interactiveUser1.uid); + expect(getResponse1.body.created_by).not.to.be.ok(); + + // update with interactive user 2 + const interactiveUser2 = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_DEFAULT_SPACE_ALL_USER, + }); + + const updateResponse2 = await supertest + .put(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers) + .send({ attributes: { title: 'test 2' } }); + + expect(updateResponse2.status).to.be(200); + expect(updateResponse2.body.updated_by).to.be(interactiveUser2.uid); + expect(updateResponse2.body.created_by).not.to.be.ok(); + + const getResponse2 = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers); + + expect(getResponse2.body.updated_by).to.be(interactiveUser2.uid); + expect(getResponse2.body.created_by).not.to.be.ok(); + + // update with "non-interactive" user, updated_by should become empty + const updateResponse3 = await supertest + .put(`/api/saved_objects/${type}/${id}`) + .auth(AUTHENTICATION.KIBANA_RBAC_USER.username, AUTHENTICATION.KIBANA_RBAC_USER.password) + .send({ attributes: { title: 'test 3' } }); + + expect(updateResponse3.status).to.be(200); + expect(updateResponse3.body.updated_by).not.to.be.ok(); + expect(updateResponse3.body.created_by).not.to.be.ok(); + + const getResponse3 = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers); + + expect(getResponse3.body.updated_by).not.to.be.ok(); + expect(getResponse3.body.created_by).not.to.be.ok(); + }); + + it('upsert sets created_by and updated_by', async () => { + const { type } = TEST_CASES.SINGLE_NAMESPACE_DEFAULT_SPACE; + const id = `some-new-id-${Date.now()}`; + + // upsert with interactive user 1 + const interactiveUser1 = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_USER, + }); + const upsertResponse = await supertest + .put(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser1.headers) + .send({ attributes: { title: 'updated' }, upsert: { title: 'upserted' } }); + + expect(upsertResponse.status).to.be(200); + expect(upsertResponse.body.attributes.title).to.be('upserted'); + expect(upsertResponse.body.updated_by).to.be(interactiveUser1.uid); + expect(upsertResponse.body.created_by).to.be(interactiveUser1.uid); + + // update with interactive user 2 + const interactiveUser2 = await loginAsInteractiveUser({ + getService, + ...AUTHENTICATION.KIBANA_RBAC_DEFAULT_SPACE_ALL_USER, + }); + + const updateResponse = await supertest + .put(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers) + .send({ attributes: { title: 'updated' }, upsert: { title: 'upserted' } }); + + expect(updateResponse.status).to.be(200); + expect(updateResponse.body.attributes.title).to.be('updated'); + expect(updateResponse.body.updated_by).to.be(interactiveUser2.uid); + expect(updateResponse.body.created_by).not.to.be.ok(); + + const getResponse = await supertest + .get(`/api/saved_objects/${type}/${id}`) + .set(interactiveUser2.headers); + expect(getResponse.body.updated_by).to.be(interactiveUser2.uid); + expect(getResponse.body.created_by).to.be(interactiveUser1.uid); + }); + }); +} diff --git a/x-pack/test/saved_object_api_integration/user_profiles/config.ts b/x-pack/test/saved_object_api_integration/user_profiles/config.ts new file mode 100644 index 0000000000000..228d67d316059 --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/config.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. + */ + +import { createTestConfig } from '../common/config'; + +// eslint-disable-next-line import/no-default-export +export default createTestConfig('user_profiles', { license: 'basic' }); diff --git a/x-pack/test/saved_object_api_integration/user_profiles/helpers.ts b/x-pack/test/saved_object_api_integration/user_profiles/helpers.ts new file mode 100644 index 0000000000000..223ade8d7cc02 --- /dev/null +++ b/x-pack/test/saved_object_api_integration/user_profiles/helpers.ts @@ -0,0 +1,49 @@ +/* + * 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 { parse as parseCookie } from 'tough-cookie'; +import { FtrProviderContext } from '../common/ftr_provider_context'; + +export interface LoginAsInteractiveUserResponse { + headers: { + Cookie: string; + }; + uid: string; +} + +export async function loginAsInteractiveUser({ + getService, + username, + password, +}: Pick & { + username: string; + password: string; +}): Promise { + const supertest = getService('supertestWithoutAuth'); + + const response = await supertest + .post('/internal/security/login') + .set('kbn-xsrf', 'xxx') + .send({ + providerType: 'basic', + providerName: 'basic', + currentURL: '/', + params: { + username, + password, + }, + }) + .expect(200); + const cookie = parseCookie(response.header['set-cookie'][0])!.cookieString(); + + const { body: userWithProfileId } = await supertest + .get('/internal/security/me') + .set('Cookie', cookie) + .expect(200); + + return { headers: { Cookie: cookie }, uid: userWithProfileId.profile_uid }; +} From 1d57047f5cf68192d201bd633f1b037b3daaffd5 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 29 May 2024 17:05:08 +0200 Subject: [PATCH 21/95] [Synthetics] Decouple synthetics settings from uptime (#184009) ## Summary Fixes https://github.com/elastic/kibana/issues/183916 Decouple synthetics settings from uptime , since uptime isn't available in serverless !! ### Test cases - [ ] Make sure synthetics settings continue to work as expected in serverless/stateful - [ ] Make sure uptime settings continues to work as expected in serverless/stateful - [ ] if User have uptime settings saved, those should be copied over to synthetics first time --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../current_fields.json | 1 + .../current_mappings.json | 4 + .../check_registered_types.test.ts | 1 + .../group3/type_registrations.test.ts | 1 + .../group5/dot_kibana_split.test.ts | 1 + .../common/constants/settings_defaults.ts | 1 - .../common/constants/synthetics/rest_api.ts | 2 +- .../common/runtime_types/dynamic_settings.ts | 1 - .../alert_rules/tls_rule/tls_rule_executor.ts | 2 +- .../synthetics/server/constants/settings.ts | 1 - .../synthetics/server/feature.ts | 13 ++- .../lib/requests/get_network_events.test.ts | 2 +- .../synthetics/server/lib.test.ts | 6 +- .../synthetics/server/lib.ts | 34 ++------ .../synthetics/server/plugin.ts | 4 +- .../default_alerts/default_alert_service.ts | 2 +- .../synthetics/server/routes/index.ts | 6 ++ .../routes/settings/dynamic_settings.ts | 82 +++++++++++++++++++ .../server/runtime_types/settings.ts | 1 - .../server/saved_objects/saved_objects.ts | 71 ++++++++++------ .../saved_objects/synthetics_settings.ts | 33 ++++++++ .../server/saved_objects/uptime_settings.ts | 9 -- .../server/synthetics_route_wrapper.ts | 1 + .../observability/synthetics_rule.ts | 2 - .../api_integration/apis/uptime/rest/index.ts | 10 +-- x-pack/test/functional/apps/uptime/index.ts | 4 +- .../test/functional/apps/uptime/settings.ts | 4 +- .../functional/services/uptime/settings.ts | 2 +- 28 files changed, 208 insertions(+), 93 deletions(-) create mode 100644 x-pack/plugins/observability_solution/synthetics/server/routes/settings/dynamic_settings.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_settings.ts delete mode 100644 x-pack/plugins/observability_solution/synthetics/server/saved_objects/uptime_settings.ts diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index c6f25e7452bfc..5300aa8d4cd80 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -937,6 +937,7 @@ "solution" ], "spaces-usage-stats": [], + "synthetics-dynamic-settings": [], "synthetics-monitor": [ "alert", "alert.status", diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 76d4b7a4197be..628dd5c6dbc16 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -3079,6 +3079,10 @@ "dynamic": false, "properties": {} }, + "synthetics-dynamic-settings": { + "dynamic": false, + "properties": {} + }, "synthetics-monitor": { "dynamic": false, "properties": { 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 907afad243ac3..5e98b0d0245ca 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 @@ -151,6 +151,7 @@ describe('checking migration metadata changes on all registered SO types', () => "slo-settings": "f6b5ed339470a6a2cda272bde1750adcf504a11b", "space": "953a72d8962d829e7ea465849297c5e44d8e9a2d", "spaces-usage-stats": "3abca98713c52af8b30300e386c7779b3025a20e", + "synthetics-dynamic-settings": "4b40a93eb3e222619bf4e7fe34a9b9e7ab91a0a7", "synthetics-monitor": "5ceb25b6249bd26902c9b34273c71c3dce06dbea", "synthetics-param": "3ebb744e5571de678b1312d5c418c8188002cf5e", "synthetics-privates-locations": "f53d799d5c9bc8454aaa32c6abc99a899b025d5c", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index 712ddd4bca932..2c85df9e6d50e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -140,6 +140,7 @@ const previouslyRegisteredTypes = [ 'upgrade-assistant-reindex-operation', 'upgrade-assistant-telemetry', 'uptime-dynamic-settings', + 'synthetics-dynamic-settings', 'uptime-synthetics-api-key', 'url', 'usage-counters', diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts index dcb40a3b07621..0ad0e283711a2 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts @@ -270,6 +270,7 @@ describe('split .kibana index into multiple system indices', () => { "slo-settings", "space", "spaces-usage-stats", + "synthetics-dynamic-settings", "synthetics-monitor", "synthetics-param", "synthetics-privates-locations", diff --git a/x-pack/plugins/observability_solution/synthetics/common/constants/settings_defaults.ts b/x-pack/plugins/observability_solution/synthetics/common/constants/settings_defaults.ts index d5385ada22337..aa32449713be8 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/constants/settings_defaults.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/constants/settings_defaults.ts @@ -8,7 +8,6 @@ import { DynamicSettings } from '../runtime_types'; export const DYNAMIC_SETTINGS_DEFAULTS: DynamicSettings = { - heartbeatIndices: 'heartbeat-*', certAgeThreshold: 730, certExpirationThreshold: 30, defaultConnectors: [], diff --git a/x-pack/plugins/observability_solution/synthetics/common/constants/synthetics/rest_api.ts b/x-pack/plugins/observability_solution/synthetics/common/constants/synthetics/rest_api.ts index 54a88e9a15f1d..0003360c707b6 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/constants/synthetics/rest_api.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/constants/synthetics/rest_api.ts @@ -52,5 +52,5 @@ export enum SYNTHETICS_API_URLS { SYNTHETICS_MONITORS_PROJECT_UPDATE = '/api/synthetics/project/{projectName}/monitors/_bulk_update', SYNTHETICS_MONITORS_PROJECT_DELETE = '/api/synthetics/project/{projectName}/monitors/_bulk_delete', - DYNAMIC_SETTINGS = `/api/uptime/settings`, + DYNAMIC_SETTINGS = `/api/synthetics/settings`, } diff --git a/x-pack/plugins/observability_solution/synthetics/common/runtime_types/dynamic_settings.ts b/x-pack/plugins/observability_solution/synthetics/common/runtime_types/dynamic_settings.ts index 67d4a2826982b..8dc2405085bb5 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/runtime_types/dynamic_settings.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/runtime_types/dynamic_settings.ts @@ -28,7 +28,6 @@ export const DynamicSettingsSaveCodec = t.intersection([ export const DynamicSettingsCodec = t.intersection([ t.strict({ - heartbeatIndices: t.string, certAgeThreshold: t.number, certExpirationThreshold: t.number, defaultConnectors: t.array(t.string), diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/tls_rule_executor.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/tls_rule_executor.ts index e2f9f4c95cc63..5c6d634783bce 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/tls_rule_executor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/tls_rule_executor.ts @@ -89,7 +89,7 @@ export class TLSRuleExecutor { async getExpiredCertificates() { const { enabledMonitorQueryIds } = await this.getMonitors(); - const dynamicSettings = await savedObjectsAdapter.getUptimeDynamicSettings(this.soClient); + const dynamicSettings = await savedObjectsAdapter.getSyntheticsDynamicSettings(this.soClient); const expiryThreshold = this.params.certExpirationThreshold ?? diff --git a/x-pack/plugins/observability_solution/synthetics/server/constants/settings.ts b/x-pack/plugins/observability_solution/synthetics/server/constants/settings.ts index 777d75b01a3eb..0d8b9a2695f27 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/constants/settings.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/constants/settings.ts @@ -8,7 +8,6 @@ import { DynamicSettingsAttributes } from '../runtime_types/settings'; export const DYNAMIC_SETTINGS_DEFAULTS: DynamicSettingsAttributes = { - heartbeatIndices: 'heartbeat-*', certAgeThreshold: 730, certExpirationThreshold: 30, defaultConnectors: [], diff --git a/x-pack/plugins/observability_solution/synthetics/server/feature.ts b/x-pack/plugins/observability_solution/synthetics/server/feature.ts index 951fdaf33c536..44a337074bac8 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/feature.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/feature.ts @@ -15,7 +15,10 @@ import { syntheticsMonitorType, syntheticsParamType } from '../common/types/save import { SYNTHETICS_RULE_TYPES } from '../common/constants/synthetics_alerts'; import { privateLocationsSavedObjectName } from '../common/saved_objects/private_locations'; import { PLUGIN } from '../common/constants/plugin'; -import { settingsObjectType } from './saved_objects/uptime_settings'; +import { + syntheticsSettingsObjectType, + uptimeSettingsObjectType, +} from './saved_objects/synthetics_settings'; import { syntheticsApiKeyObjectType } from './saved_objects/service_api_key'; const UPTIME_RULE_TYPES = [ @@ -63,11 +66,13 @@ export const uptimeFeature = { api: ['uptime-read', 'uptime-write', 'lists-all', 'rac'], savedObject: { all: [ - settingsObjectType, + syntheticsSettingsObjectType, syntheticsMonitorType, syntheticsApiKeyObjectType, privateLocationsSavedObjectName, syntheticsParamType, + // uptime settings object is also registered here since feature is shared between synthetics and uptime + uptimeSettingsObjectType, ], read: [], }, @@ -92,10 +97,12 @@ export const uptimeFeature = { all: [], read: [ syntheticsParamType, - settingsObjectType, + syntheticsSettingsObjectType, syntheticsMonitorType, syntheticsApiKeyObjectType, privateLocationsSavedObjectName, + // uptime settings object is also registered here since feature is shared between synthetics and uptime + uptimeSettingsObjectType, ], }, alerting: { diff --git a/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_network_events.test.ts b/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_network_events.test.ts index e8202e748bd03..c7bdafc6ceca0 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_network_events.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/legacy_uptime/lib/requests/get_network_events.test.ts @@ -213,7 +213,7 @@ describe('getNetworkEvents', () => { "size": 1000, "track_total_hits": true, }, - "index": "heartbeat-*", + "index": "synthetics-*", }, Object { "meta": true, diff --git a/x-pack/plugins/observability_solution/synthetics/server/lib.test.ts b/x-pack/plugins/observability_solution/synthetics/server/lib.test.ts index 4bc18d3dc5b18..8dbcdaf58514b 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/lib.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/lib.test.ts @@ -42,7 +42,7 @@ describe('UptimeEsClient', () => { expect(esClient.search).toHaveBeenCalledWith( { - index: 'heartbeat-*', + index: 'synthetics-*', ...mockSearchParams, }, { meta: true } @@ -72,7 +72,7 @@ describe('UptimeEsClient', () => { await expect(uptimeEsClient.search(mockSearchParams)).rejects.toThrow(mockError); expect(esClient.search).toHaveBeenCalledWith( { - index: 'heartbeat-*', + index: 'synthetics-*', ...mockSearchParams, }, { meta: true } @@ -90,7 +90,7 @@ describe('UptimeEsClient', () => { expect(esClient.count).toHaveBeenCalledWith(mockCountParams, { meta: true }); expect(result).toEqual({ - indices: 'heartbeat-*', + indices: 'synthetics-*', result: { body: {}, headers: { diff --git a/x-pack/plugins/observability_solution/synthetics/server/lib.ts b/x-pack/plugins/observability_solution/synthetics/server/lib.ts index 78d88ff6bf51b..9aed13371bc58 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/lib.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/lib.ts @@ -18,9 +18,8 @@ import { RequestStatus } from '@kbn/inspector-plugin/common'; import { InspectResponse } from '@kbn/observability-plugin/typings/common'; import { enableInspectEsQueries } from '@kbn/observability-plugin/common'; import { getInspectResponse } from '@kbn/observability-shared-plugin/common'; -import { SYNTHETICS_API_URLS } from '../common/constants'; +import { SYNTHETICS_API_URLS, SYNTHETICS_INDEX_PATTERN } from '../common/constants'; import { SyntheticsServerSetup } from './types'; -import { savedObjectsAdapter } from './saved_objects/saved_objects'; export interface CountResponse { result: { @@ -41,7 +40,6 @@ export class UptimeEsClient { isDev: boolean; request?: KibanaRequest; baseESClient: ElasticsearchClient; - heartbeatIndices: string; isInspectorEnabled?: Promise; inspectableEsQueries: InspectResponse = []; uiSettings?: CoreRequestHandlerContext['uiSettings']; @@ -57,34 +55,24 @@ export class UptimeEsClient { heartbeatIndices?: string; } ) { - const { isDev = false, uiSettings, request, heartbeatIndices = '' } = options ?? {}; + const { isDev = false, uiSettings, request } = options ?? {}; this.uiSettings = uiSettings; this.baseESClient = esClient; this.savedObjectsClient = savedObjectsClient; this.request = request; - this.heartbeatIndices = heartbeatIndices; this.isDev = isDev; this.inspectableEsQueries = []; this.getInspectEnabled().catch(() => {}); } - async initSettings() { - const self = this; - const heartbeatIndices = await this.getIndices(); - self.heartbeatIndices = heartbeatIndices || ''; - } - async search( params: TParams, - operationName?: string, - index?: string + operationName?: string ): Promise<{ body: ESSearchResponse }> { let res: any; let esError: any; - await this.initSettings(); - - const esParams = { index: index ?? this.heartbeatIndices, ...params }; + const esParams = { index: SYNTHETICS_INDEX_PATTERN, ...params }; const startTime = process.hrtime(); const startTimeNow = Date.now(); @@ -132,9 +120,7 @@ export class UptimeEsClient { let res: any; let esError: any; - await this.initSettings(); - - const esParams = { index: this.heartbeatIndices, ...params }; + const esParams = { index: SYNTHETICS_INDEX_PATTERN, ...params }; const startTime = process.hrtime(); try { @@ -159,7 +145,7 @@ export class UptimeEsClient { throw esError; } - return { result: res, indices: this.heartbeatIndices }; + return { result: res, indices: SYNTHETICS_INDEX_PATTERN }; } getSavedObjectsClient() { return this.savedObjectsClient; @@ -185,14 +171,6 @@ export class UptimeEsClient { } return this.isInspectorEnabled; } - - async getIndices() { - if (this.heartbeatIndices) { - return this.heartbeatIndices; - } - const settings = await savedObjectsAdapter.getUptimeDynamicSettings(this.savedObjectsClient); - return settings?.heartbeatIndices || ''; - } } export function createEsParams(params: T): T { diff --git a/x-pack/plugins/observability_solution/synthetics/server/plugin.ts b/x-pack/plugins/observability_solution/synthetics/server/plugin.ts index 91331dd124cf1..56d333780a3f0 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/plugin.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/plugin.ts @@ -25,7 +25,7 @@ import { SyntheticsMonitorClient } from './synthetics_service/synthetics_monitor import { initSyntheticsServer } from './server'; import { uptimeFeature } from './feature'; -import { registerUptimeSavedObjects, savedObjectsAdapter } from './saved_objects/saved_objects'; +import { registerUptimeSavedObjects } from './saved_objects/saved_objects'; import { UptimeConfig } from '../common/config'; import { SyntheticsService } from './synthetics_service/synthetics_service'; import { syntheticsServiceApiKey } from './saved_objects/service_api_key'; @@ -48,8 +48,6 @@ export class Plugin implements PluginType { public setup(core: CoreSetup, plugins: SyntheticsPluginsSetupDependencies) { const config = this.initContext.config.get(); - savedObjectsAdapter.config = config; - const { ruleDataService } = plugins.ruleRegistry; const ruleDataClient = ruleDataService.initializeIndex({ diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts index 1526a78cbf75f..38606b4d2865f 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts @@ -196,7 +196,7 @@ export class DefaultAlertService { async getActionConnectors() { const actionsClient = (await this.context.actions)?.getActionsClient(); - const settings = await savedObjectsAdapter.getUptimeDynamicSettings(this.soClient); + const settings = await savedObjectsAdapter.getSyntheticsDynamicSettings(this.soClient); let actionConnectors: FindActionResult[] = []; try { actionConnectors = await actionsClient.getAll(); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/index.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/index.ts index 467c5aeb5cd13..c97abe44a6c5a 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/index.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/index.ts @@ -5,6 +5,10 @@ * 2.0. */ +import { + createGetDynamicSettingsRoute, + createPostDynamicSettingsRoute, +} from './settings/dynamic_settings'; import { getSyntheticsParamsRoute } from './settings/params/params'; import { editSyntheticsParamsRoute } from './settings/params/edit_param'; import { getConnectorTypesRoute } from './default_alerts/get_connector_types'; @@ -95,6 +99,8 @@ export const syntheticsAppRestApiRoutes: SyntheticsRestApiRouteFactory[] = [ getSyntheticsSuggestionsRoute, getActionConnectorsRoute, getConnectorTypesRoute, + createGetDynamicSettingsRoute, + createPostDynamicSettingsRoute, ]; export const syntheticsAppPublicRestApiRoutes: SyntheticsRestApiRouteFactory[] = [ diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/dynamic_settings.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/dynamic_settings.ts new file mode 100644 index 0000000000000..07641ef826de3 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/dynamic_settings.ts @@ -0,0 +1,82 @@ +/* + * 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 { schema } from '@kbn/config-schema'; +import { savedObjectsAdapter } from '../../saved_objects'; +import { SyntheticsRestApiRouteFactory } from '../types'; +import { DynamicSettings } from '../../../common/runtime_types'; +import { DynamicSettingsAttributes } from '../../runtime_types/settings'; +import { SYNTHETICS_API_URLS } from '../../../common/constants'; + +export const createGetDynamicSettingsRoute: SyntheticsRestApiRouteFactory< + DynamicSettings +> = () => ({ + method: 'GET', + path: SYNTHETICS_API_URLS.DYNAMIC_SETTINGS, + validate: false, + handler: async ({ savedObjectsClient }) => { + const dynamicSettingsAttributes: DynamicSettingsAttributes = + await savedObjectsAdapter.getSyntheticsDynamicSettings(savedObjectsClient); + return fromAttribute(dynamicSettingsAttributes); + }, +}); + +export const createPostDynamicSettingsRoute: SyntheticsRestApiRouteFactory = () => ({ + method: 'PUT', + path: SYNTHETICS_API_URLS.DYNAMIC_SETTINGS, + validate: { + body: DynamicSettingsSchema, + }, + writeAccess: true, + handler: async ({ savedObjectsClient, request }): Promise => { + const newSettings = request.body; + const prevSettings = await savedObjectsAdapter.getSyntheticsDynamicSettings(savedObjectsClient); + + const attr = await savedObjectsAdapter.setSyntheticsDynamicSettings(savedObjectsClient, { + ...prevSettings, + ...newSettings, + } as DynamicSettingsAttributes); + + return fromAttribute(attr as DynamicSettingsAttributes); + }, +}); + +const fromAttribute = (attr: DynamicSettingsAttributes) => { + return { + certExpirationThreshold: attr.certExpirationThreshold, + certAgeThreshold: attr.certAgeThreshold, + defaultConnectors: attr.defaultConnectors, + defaultEmail: attr.defaultEmail, + }; +}; + +export const VALUE_MUST_BE_AN_INTEGER = i18n.translate( + 'xpack.synthetics.settings.invalid.nanError', + { + defaultMessage: 'Value must be an integer.', + } +); + +export const validateInteger = (value: number): string | undefined => { + if (value % 1) { + return VALUE_MUST_BE_AN_INTEGER; + } +}; + +export const DynamicSettingsSchema = schema.object({ + certAgeThreshold: schema.maybe(schema.number({ min: 1, validate: validateInteger })), + certExpirationThreshold: schema.maybe(schema.number({ min: 1, validate: validateInteger })), + defaultConnectors: schema.maybe(schema.arrayOf(schema.string())), + defaultEmail: schema.maybe( + schema.object({ + to: schema.arrayOf(schema.string()), + cc: schema.maybe(schema.arrayOf(schema.string())), + bcc: schema.maybe(schema.arrayOf(schema.string())), + }) + ), +}); diff --git a/x-pack/plugins/observability_solution/synthetics/server/runtime_types/settings.ts b/x-pack/plugins/observability_solution/synthetics/server/runtime_types/settings.ts index 8f5ad64910558..4aff410088683 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/runtime_types/settings.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/runtime_types/settings.ts @@ -19,7 +19,6 @@ const DefaultEmailCodec = t.intersection([ export const DynamicSettingsAttributesCodec = t.intersection([ t.strict({ - heartbeatIndices: t.string, certAgeThreshold: t.number, certExpirationThreshold: t.number, defaultConnectors: t.array(t.string), diff --git a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/saved_objects.ts b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/saved_objects.ts index 9d77a7b6dd359..886aed93b7b0a 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/saved_objects.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/saved_objects.ts @@ -12,6 +12,13 @@ import { } from '@kbn/core/server'; import { EncryptedSavedObjectsPluginSetup } from '@kbn/encrypted-saved-objects-plugin/server'; +import { + syntheticsSettings, + syntheticsSettingsObjectId, + syntheticsSettingsObjectType, + uptimeSettingsObjectId, + uptimeSettingsObjectType, +} from './synthetics_settings'; import { SYNTHETICS_SECRET_ENCRYPTED_TYPE, syntheticsParamSavedObjectType, @@ -19,19 +26,12 @@ import { import { PRIVATE_LOCATIONS_SAVED_OBJECT_TYPE } from './private_locations'; import { DYNAMIC_SETTINGS_DEFAULT_ATTRIBUTES } from '../constants/settings'; import { DynamicSettingsAttributes } from '../runtime_types/settings'; -import { UptimeConfig } from '../../common/config'; -import { settingsObjectId, settingsObjectType } from './uptime_settings'; import { getSyntheticsMonitorSavedObjectType, SYNTHETICS_MONITOR_ENCRYPTED_TYPE, } from './synthetics_monitor'; import { syntheticsServiceApiKey } from './service_api_key'; -export type UMSavedObjectsQueryFn = ( - client: SavedObjectsClientContract, - params?: P -) => Promise | T; - export const registerUptimeSavedObjects = ( savedObjectsService: SavedObjectsServiceSetup, encryptedSavedObjects: EncryptedSavedObjectsPluginSetup @@ -41,6 +41,7 @@ export const registerUptimeSavedObjects = ( savedObjectsService.registerType(getSyntheticsMonitorSavedObjectType(encryptedSavedObjects)); savedObjectsService.registerType(syntheticsServiceApiKey); savedObjectsService.registerType(syntheticsParamSavedObjectType); + savedObjectsService.registerType(syntheticsSettings); encryptedSavedObjects.registerType({ type: syntheticsServiceApiKey.name, @@ -52,33 +53,49 @@ export const registerUptimeSavedObjects = ( encryptedSavedObjects.registerType(SYNTHETICS_SECRET_ENCRYPTED_TYPE); }; -export interface UMSavedObjectsAdapter { - config: UptimeConfig | null; - getUptimeDynamicSettings: UMSavedObjectsQueryFn; - setUptimeDynamicSettings: UMSavedObjectsQueryFn; -} - -export const savedObjectsAdapter: UMSavedObjectsAdapter = { - config: null, - getUptimeDynamicSettings: async (client) => { +export const savedObjectsAdapter = { + getSyntheticsDynamicSettings: async ( + client: SavedObjectsClientContract + ): Promise => { try { - const obj = await client.get(settingsObjectType, settingsObjectId); + const obj = await client.get( + syntheticsSettingsObjectType, + syntheticsSettingsObjectId + ); return obj?.attributes ?? DYNAMIC_SETTINGS_DEFAULT_ATTRIBUTES; } catch (getErr) { - const config = savedObjectsAdapter.config; if (SavedObjectsErrorHelpers.isNotFoundError(getErr)) { - if (config?.index) { - return { ...DYNAMIC_SETTINGS_DEFAULT_ATTRIBUTES, heartbeatIndices: config.index }; - } - return DYNAMIC_SETTINGS_DEFAULT_ATTRIBUTES; + // If the object doesn't exist, check to see if uptime settings exist + return getUptimeDynamicSettings(client); } throw getErr; } }, - setUptimeDynamicSettings: async (client, settings: DynamicSettingsAttributes | undefined) => { - await client.create(settingsObjectType, settings, { - id: settingsObjectId, - overwrite: true, - }); + setSyntheticsDynamicSettings: async ( + client: SavedObjectsClientContract, + settings: DynamicSettingsAttributes + ) => { + const settingsObject = await client.create( + syntheticsSettingsObjectType, + settings, + { + id: syntheticsSettingsObjectId, + overwrite: true, + } + ); + + return settingsObject.attributes; }, }; + +const getUptimeDynamicSettings = async (client: SavedObjectsClientContract) => { + try { + const obj = await client.get( + uptimeSettingsObjectType, + uptimeSettingsObjectId + ); + return obj?.attributes ?? DYNAMIC_SETTINGS_DEFAULT_ATTRIBUTES; + } catch (getErr) { + return DYNAMIC_SETTINGS_DEFAULT_ATTRIBUTES; + } +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_settings.ts b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_settings.ts new file mode 100644 index 0000000000000..63deacf534c99 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_settings.ts @@ -0,0 +1,33 @@ +/* + * 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 { SavedObjectsType } from '@kbn/core-saved-objects-server'; + +export const uptimeSettingsObjectType = 'uptime-dynamic-settings'; +export const uptimeSettingsObjectId = 'uptime-dynamic-settings-singleton'; + +export const syntheticsSettingsObjectType = 'synthetics-dynamic-settings'; +export const syntheticsSettingsObjectId = 'synthetics-dynamic-settings-singleton'; + +export const syntheticsSettings: SavedObjectsType = { + name: syntheticsSettingsObjectType, + hidden: false, + namespaceType: 'single', + mappings: { + dynamic: false, + properties: {}, + }, + management: { + importableAndExportable: true, + icon: 'uptimeApp', + getTitle: () => + i18n.translate('xpack.synthetics.settings.index', { + defaultMessage: 'Synthetics settings', + }), + }, +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/uptime_settings.ts b/x-pack/plugins/observability_solution/synthetics/server/saved_objects/uptime_settings.ts deleted file mode 100644 index 93cde59a25369..0000000000000 --- a/x-pack/plugins/observability_solution/synthetics/server/saved_objects/uptime_settings.ts +++ /dev/null @@ -1,9 +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 const settingsObjectType = 'uptime-dynamic-settings'; -export const settingsObjectId = 'uptime-dynamic-settings-singleton'; diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts index e58aae2ccd121..a796d881562c3 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_route_wrapper.ts @@ -95,6 +95,7 @@ export const syntheticsRouteWrapper: SyntheticsRouteWrapper = ( }); } } + server.logger.error(e); throw e; } }, diff --git a/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts b/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts index dcc227761d581..15113c2c1cd08 100644 --- a/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts +++ b/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts @@ -39,7 +39,6 @@ export default function ({ getService }: FtrProviderContext) { .put(SYNTHETICS_API_URLS.DYNAMIC_SETTINGS) .set('kbn-xsrf', 'true') .send({ - heartbeatIndices: 'heartbeat-*', certExpirationThreshold: 30, certAgeThreshold: 730, defaultConnectors: testActions.slice(0, 2), @@ -79,7 +78,6 @@ export default function ({ getService }: FtrProviderContext) { .put(SYNTHETICS_API_URLS.DYNAMIC_SETTINGS) .set('kbn-xsrf', 'true') .send({ - heartbeatIndices: 'heartbeat-*', certExpirationThreshold: 30, certAgeThreshold: 730, defaultConnectors: testActions, diff --git a/x-pack/test/api_integration/apis/uptime/rest/index.ts b/x-pack/test/api_integration/apis/uptime/rest/index.ts index 1c0a39b02dde5..b1d1d3774c8f8 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/index.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/index.ts @@ -6,9 +6,9 @@ */ import { - settingsObjectId, - settingsObjectType, -} from '@kbn/synthetics-plugin/server/saved_objects/uptime_settings'; + uptimeSettingsObjectId, + uptimeSettingsObjectType, +} from '@kbn/synthetics-plugin/server/saved_objects/synthetics_settings'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, loadTestFile }: FtrProviderContext) { @@ -19,8 +19,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { beforeEach('clear settings', async () => { try { await server.savedObjects.delete({ - type: settingsObjectType, - id: settingsObjectId, + type: uptimeSettingsObjectType, + id: uptimeSettingsObjectId, }); } catch (e) { // a 404 just means the doc is already missing diff --git a/x-pack/test/functional/apps/uptime/index.ts b/x-pack/test/functional/apps/uptime/index.ts index 323c00a20da67..b4e1b7ebc3e94 100644 --- a/x-pack/test/functional/apps/uptime/index.ts +++ b/x-pack/test/functional/apps/uptime/index.ts @@ -6,9 +6,9 @@ */ import { - settingsObjectId, settingsObjectType, -} from '@kbn/synthetics-plugin/server/saved_objects/uptime_settings'; + settingsObjectId, +} from '@kbn/uptime-plugin/server/legacy_uptime/lib/saved_objects/uptime_settings'; import { FtrProviderContext } from '../../ftr_provider_context'; const ARCHIVE = 'x-pack/test/functional/es_archives/uptime/full_heartbeat'; diff --git a/x-pack/test/functional/apps/uptime/settings.ts b/x-pack/test/functional/apps/uptime/settings.ts index 585de566f2aba..5beace54c1b06 100644 --- a/x-pack/test/functional/apps/uptime/settings.ts +++ b/x-pack/test/functional/apps/uptime/settings.ts @@ -6,8 +6,8 @@ */ import expect from '@kbn/expect'; -import { DynamicSettings } from '@kbn/synthetics-plugin/common/runtime_types'; -import { DYNAMIC_SETTINGS_DEFAULTS } from '@kbn/synthetics-plugin/common/constants'; +import { DynamicSettings } from '@kbn/uptime-plugin/common/runtime_types'; +import { DYNAMIC_SETTINGS_DEFAULTS } from '@kbn/uptime-plugin/common/constants'; import { FtrProviderContext } from '../../ftr_provider_context'; import { makeChecks } from '../../../api_integration/apis/uptime/rest/helper/make_checks'; diff --git a/x-pack/test/functional/services/uptime/settings.ts b/x-pack/test/functional/services/uptime/settings.ts index 84a94cd6f7243..46d8041b4028d 100644 --- a/x-pack/test/functional/services/uptime/settings.ts +++ b/x-pack/test/functional/services/uptime/settings.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { DynamicSettings } from '@kbn/synthetics-plugin/common/runtime_types'; +import { DynamicSettings } from '@kbn/uptime-plugin/common/runtime_types'; import { FtrProviderContext } from '../../ftr_provider_context'; export function UptimeSettingsProvider({ getService }: FtrProviderContext) { From a42f6a716f3642dd090cd638daa94c9d9a3444ea Mon Sep 17 00:00:00 2001 From: Rickyanto Ang Date: Wed, 29 May 2024 08:09:02 -0700 Subject: [PATCH 22/95] [Cloud Security][Serverless] Added Cloud Security and Cloud Defend Plugins into Excluded Package list for Observability project in Serverless (#184186) ## Summary Added CSP and Cloud Defend plugins into Exclude Package list for oblt projects in Serverless Co-authored-by: Maxim Kholod --- config/serverless.oblt.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 7d15e2f5673e9..0d1add8e63f95 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -53,6 +53,8 @@ xpack.fleet.internal.registry.excludePackages: [ # Security integrations 'endpoint', 'beaconing', + 'cloud_security_posture', + 'cloud_defend', 'security_detection_engine', # Removed in 8.11 integrations From 60f5ebee256e9fa8373d2adf89946fc3718b774f Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Wed, 29 May 2024 18:12:34 +0300 Subject: [PATCH 23/95] [Cases] Fix `useGetCaseConnectors` flaky test (#184430) ## Summary Following @JiaweiWu advice I replaced `waitForNextUpdate` with `waitFor`. Fixes: https://github.com/elastic/kibana/issues/174356 ### Checklist Delete any items that are not applicable to this PR. - [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) --- .../containers/use_get_case_connectors.test.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/cases/public/containers/use_get_case_connectors.test.tsx b/x-pack/plugins/cases/public/containers/use_get_case_connectors.test.tsx index 802ea2d163d87..e73012f83f729 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case_connectors.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case_connectors.test.tsx @@ -15,8 +15,7 @@ import { useGetCaseConnectors } from './use_get_case_connectors'; jest.mock('./api'); jest.mock('../common/lib/kibana'); -// FLAKY: https://github.com/elastic/kibana/issues/174356 -describe.skip('useGetCaseConnectors', () => { +describe('useGetCaseConnectors', () => { const caseId = 'test-id'; const abortCtrl = new AbortController(); const addSuccess = jest.fn(); @@ -31,11 +30,13 @@ describe.skip('useGetCaseConnectors', () => { it('calls getCaseConnectors with correct arguments', async () => { const spyOnGetCases = jest.spyOn(api, 'getCaseConnectors'); - const { waitForNextUpdate } = renderHook(() => useGetCaseConnectors(caseId), { + const { waitFor } = renderHook(() => useGetCaseConnectors(caseId), { wrapper: appMockRender.AppWrapper, }); - await waitForNextUpdate(); + await waitFor(() => { + expect(spyOnGetCases).toHaveBeenCalled(); + }); expect(spyOnGetCases).toBeCalledWith('test-id', abortCtrl.signal); }); @@ -49,11 +50,12 @@ describe.skip('useGetCaseConnectors', () => { const addError = jest.fn(); (useToasts as jest.Mock).mockReturnValue({ addSuccess, addError }); - const { waitForNextUpdate } = renderHook(() => useGetCaseConnectors(caseId), { + const { waitFor } = renderHook(() => useGetCaseConnectors(caseId), { wrapper: appMockRender.AppWrapper, }); - await waitForNextUpdate(); - expect(addError).toHaveBeenCalled(); + await waitFor(() => { + expect(addError).toHaveBeenCalled(); + }); }); }); From 4741e291bd093537d8d04c2edae27b13d1e0cb9d Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Wed, 29 May 2024 09:42:19 -0600 Subject: [PATCH 24/95] [a11y] use alt text to convey stream entry within log stream (#183666) ## Summary Closes https://github.com/elastic/observability-dev/issues/3349 ### 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) --- .../logs_shared/public/components/loading/index.tsx | 2 +- .../components/logging/log_text_stream/loading_item_view.tsx | 1 + .../public/components/logging/log_text_stream/log_date_row.tsx | 2 +- .../components/logging/log_text_stream/log_text_separator.tsx | 2 +- .../logging/log_text_stream/scrollable_log_text_stream_view.tsx | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/loading/index.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/loading/index.tsx index ca032885a8958..15003d046e900 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/loading/index.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/loading/index.tsx @@ -20,7 +20,7 @@ export class LogsSharedLoadingPanel extends React.PureComponent + diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/loading_item_view.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/loading_item_view.tsx index 9cd7c91250528..f4497154dcd56 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/loading_item_view.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/loading_item_view.tsx @@ -206,6 +206,7 @@ const ProgressCta: React.FC = ({ }} iconType={iconType} size="s" + role="cell" > diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_date_row.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_date_row.tsx index 9bc6e29429ce5..3808af4d9d24e 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_date_row.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_date_row.tsx @@ -27,7 +27,7 @@ export const LogDateRow: React.FC = ({ time }) => { - + ); diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_text_separator.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_text_separator.tsx index 72c6c742ea29e..2c06cca214ec7 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_text_separator.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_text_separator.tsx @@ -16,7 +16,7 @@ export const LogTextSeparator: FC> = ({ children }) = {children} - + ); diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx index 1f97abcda9b15..959a2d99924db 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx @@ -157,7 +157,7 @@ export class ScrollableLogTextStreamView extends React.PureComponent< const hasContextAction = !!setContextEntry; return ( - + {isReloading && (!isStreaming || !hasItems) ? ( Date: Wed, 29 May 2024 16:48:49 +0100 Subject: [PATCH 25/95] [Entity Analytics] Add more logging to flaky test (#183753) ## Summary Closes https://github.com/elastic/kibana/issues/181402 (for now) This test has only failed once so far, there is nothing obvious in the logs as to why the transform is in a stopped state, I have added some more logging so we can dig further if it fails again. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../risk_scoring_task/task_execution.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts index b575da1e4bbad..bcdcd9085a7c1 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts @@ -111,7 +111,14 @@ export default ({ getService }: FtrProviderContext): void => { transform_id: 'risk_score_latest_transform_default', }); - expect(transformStats.transforms[0].state).to.eql('started'); + expect(transformStats.transforms.length).to.eql(1); + const latestTransform = transformStats.transforms[0]; + if (latestTransform.state !== 'started') { + log.error('Transform state is not started, logging the transform'); + log.info(`latestTransform: ${JSON.stringify(latestTransform)}`); + } + + expect(latestTransform.state).to.eql('started'); }); describe('@skipInServerlessMKI disabling and re-enabling the risk engine', () => { From f2a4bba137e93ad4fd5438c56b96dd02727e1a27 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 29 May 2024 09:02:51 -0700 Subject: [PATCH 26/95] [HTTP/OAS] Add description for task manager health API (#184249) --- x-pack/plugins/task_manager/server/routes/health.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/x-pack/plugins/task_manager/server/routes/health.ts b/x-pack/plugins/task_manager/server/routes/health.ts index 013fa1e4a06aa..23539da937f93 100644 --- a/x-pack/plugins/task_manager/server/routes/health.ts +++ b/x-pack/plugins/task_manager/server/routes/health.ts @@ -129,6 +129,10 @@ export function healthRoute(params: HealthRouteParams): { // Uncomment when we determine that we can restrict API usage to Global admins based on telemetry // options: { tags: ['access:taskManager'] }, validate: false, + options: { + access: 'public', + description: `Get task manager health`, + }, }, async function ( context: RequestHandlerContext, From 12f35c9a3109ce113b2bfda72da40d3ae4ecd337 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Date: Wed, 29 May 2024 09:15:40 -0700 Subject: [PATCH 27/95] [Security Solution] [Grouping] Re-add support to custom Group By title in the useGetGroupSelector hook (#184165) ## Summary This PR fixes a regression from PR #180016 where the support to the custom title on the `useGetGroupSelector` hook was dropped and the Findings DataTables was displaying "Group alerts by" instead of "Group findings by". Unit tests were added to prevent further regressions. ## Screenshots ![image](https://github.com/elastic/kibana/assets/19270322/97ac29f7-d314-4df9-a4d8-9a11b198f021) ![image](https://github.com/elastic/kibana/assets/19270322/6e6a3eef-fd4e-4619-a460-a3b0fb46ec37) ![image](https://github.com/elastic/kibana/assets/19270322/e6bcd40c-45e6-4444-8905-7c7c2c900926) --- .../src/components/group_selector/index.test.tsx | 8 ++++++++ .../src/hooks/use_get_group_selector.test.tsx | 11 +++++++++++ .../kbn-grouping/src/hooks/use_get_group_selector.tsx | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/kbn-grouping/src/components/group_selector/index.test.tsx b/packages/kbn-grouping/src/components/group_selector/index.test.tsx index 9f09e3b26ea49..861c77d80bafe 100644 --- a/packages/kbn-grouping/src/components/group_selector/index.test.tsx +++ b/packages/kbn-grouping/src/components/group_selector/index.test.tsx @@ -73,6 +73,14 @@ describe('group selector', () => { const { getByTestId } = render(); expect(getByTestId('group-selector-dropdown').textContent).toBe('Group alerts by: Rule name'); }); + it('Sets the Group by title from the title prop', () => { + const { getByTestId } = render( + + ); + expect(getByTestId('group-selector-dropdown').textContent).toBe( + 'Group custom property by: Rule name' + ); + }); it('Presents correct option when group selector dropdown is clicked', () => { const { getByTestId } = render(); fireEvent.click(getByTestId('group-selector-dropdown')); diff --git a/packages/kbn-grouping/src/hooks/use_get_group_selector.test.tsx b/packages/kbn-grouping/src/hooks/use_get_group_selector.test.tsx index 1ebd2b5a18174..0448ed6df6194 100644 --- a/packages/kbn-grouping/src/hooks/use_get_group_selector.test.tsx +++ b/packages/kbn-grouping/src/hooks/use_get_group_selector.test.tsx @@ -376,6 +376,17 @@ describe('Group Selector Hooks', () => { type: ActionType.updateGroupOptions, }); }); + + it('Supports custom group by title', () => { + const result = renderHook(() => + useGetGroupSelector({ + ...defaultArgs, + title: 'Group custom property by', + }) + ); + + expect(result.result.current.props.title).toEqual('Group custom property by'); + }); }); describe('useGetGroupSelectorStateless', () => { diff --git a/packages/kbn-grouping/src/hooks/use_get_group_selector.tsx b/packages/kbn-grouping/src/hooks/use_get_group_selector.tsx index 14f010640ef12..2bb7423c3bd93 100644 --- a/packages/kbn-grouping/src/hooks/use_get_group_selector.tsx +++ b/packages/kbn-grouping/src/hooks/use_get_group_selector.tsx @@ -211,8 +211,9 @@ export const useGetGroupSelector = ({ fields, maxGroupingLevels, options, + title, }} /> ); - }, [groupingId, fields, maxGroupingLevels, onChange, selectedGroups, options]); + }, [groupingId, fields, maxGroupingLevels, onChange, selectedGroups, options, title]); }; From 58f1c67a50f1b38ae61b42d65707bcd6f05cc9fb Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Wed, 29 May 2024 10:18:19 -0600 Subject: [PATCH 28/95] [Discover] fix flaky test (#184180) ## Summary Fix https://github.com/elastic/kibana/issues/183493 Fix https://github.com/elastic/kibana/issues/183479 Flaky test runner: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6079 --- test/functional/page_objects/discover_page.ts | 4 +++- .../functional/test_suites/common/discover/esql/_esql_view.ts | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index 9d02198ea5926..9263e34f96158 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -509,7 +509,9 @@ export class DiscoverPageObject extends FtrService { } public showsErrorCallout() { - return this.testSubjects.existOrFail('discoverErrorCalloutTitle'); + this.retry.try(async () => { + await this.testSubjects.existOrFail('discoverErrorCalloutTitle'); + }); } public getDiscoverErrorMessage() { diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 29bbc4b3c3e9c..a836d14b35125 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -35,8 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', }; - // Failing: See https://github.com/elastic/kibana/issues/183493 - describe.skip('discover esql view', async function () { + describe('discover esql view', async function () { before(async () => { await kibanaServer.savedObjects.cleanStandardList(); log.debug('load kibana index with default index pattern'); From cd9cd89bbfacc64ac0cd8c448a7f9b0ba1fee2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Wed, 29 May 2024 18:21:35 +0200 Subject: [PATCH 29/95] [Search] Add example status for OpenText Documentum (#184426) ## Summary Adds example status for OpenText Documentum connector Screenshot 2024-05-29 at 14 35 55 Screenshot 2024-05-29 at 14 36 05 ### 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) - [ ] [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)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../enterprise_search/common/constants.ts | 3 ++ .../connector_configuration.tsx | 30 +++++++++++++++++ .../components/connector_detail/overview.tsx | 33 ++++++++++++++++++- .../select_connector/connector_checkable.tsx | 18 ++++++++-- .../applications/shared/constants/labels.ts | 7 ++++ 5 files changed, 88 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index b0b2b83326f2f..8f49e3cae3c02 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -243,3 +243,6 @@ export const PLUGIN_ID = 'enterpriseSearch'; export const CONNECTOR_NATIVE_TYPE = 'native'; export const CONNECTOR_CLIENTS_TYPE = 'connector_clients'; + +// TODO remove this once the connector service types are no longer in "example" state +export const EXAMPLE_CONNECTOR_SERVICE_TYPES = ['opentext_documentum']; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx index 27e620730222b..6032230205523 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx @@ -28,6 +28,8 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { ConnectorConfigurationComponent, ConnectorStatus } from '@kbn/search-connectors'; +import { EXAMPLE_CONNECTOR_SERVICE_TYPES } from '../../../../../common/constants'; + import { Status } from '../../../../../common/types/api'; import { BetaConnectorCallout } from '../../../shared/beta/beta_connector_callout'; import { useCloudDetails } from '../../../shared/cloud_details/cloud_details'; @@ -95,6 +97,34 @@ export const ConnectorConfiguration: React.FC = () => { return ( <> + { + // TODO remove this callout when example status is removed + connector && + connector.service_type && + EXAMPLE_CONNECTOR_SERVICE_TYPES.includes(connector.service_type) && ( + <> + + + + + + + + + ) + } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx index 1931f0f945505..53dc7a601ad28 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx @@ -15,7 +15,10 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../../common/constants'; +import { + ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, + EXAMPLE_CONNECTOR_SERVICE_TYPES, +} from '../../../../../common/constants'; import { docLinks } from '../../../shared/doc_links'; import { generateEncodedPath } from '../../../shared/encode_path_params'; @@ -42,6 +45,34 @@ export const ConnectorDetailOverview: React.FC = () => { return ( <> + { + // TODO remove this callout when example status is removed + connector && + connector.service_type && + EXAMPLE_CONNECTOR_SERVICE_TYPES.includes(connector.service_type) && ( + <> + + + + + + + + + ) + } {error && ( <> = ({ )} - {isTechPreview && ( + {EXAMPLE_CONNECTOR_SERVICE_TYPES.includes(serviceType) && ( + + + {EXAMPLE_CONNECTOR_LABEL} + + + )} + {isTechPreview && !EXAMPLE_CONNECTOR_SERVICE_TYPES.includes(serviceType) && ( diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts b/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts index ec2a53757d17b..33db1e29e5161 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts @@ -53,3 +53,10 @@ export const CONNECTOR_CLIENT_LABEL = i18n.translate( defaultMessage: 'Connector Client', } ); + +export const EXAMPLE_CONNECTOR_LABEL = i18n.translate( + 'xpack.enterpriseSearch.exampleConnectorLabel', + { + defaultMessage: 'Example', + } +); From d381e6e1e794cede6e0e09832426fcdb5d7c2b91 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Wed, 29 May 2024 09:38:20 -0700 Subject: [PATCH 30/95] [EuiCollapsibleNavBeta] Fix `@ts-ignore` TODOs (#184382) ## Summary Fixes several `@ts-ignore TODO`s added in a previous EUI upgrade. The primary source of typescript errors comes from the fact that type-wise, `EuiCollapsibleNavItem` wants **either** `items/accordionProps` or `href/linkProps` but **not both**. See the following ExclusiveUnion logic: https://github.com/elastic/eui/blob/7209db96ee8ca6088b783db65e3c993de4e0a1f2/packages/eui/src/components/collapsible_nav_beta/collapsible_nav_item/collapsible_nav_item.tsx#L63-L102 ### Checklist - [x] Existing tests/CI passes --- .../ui/components/navigation_section_ui.tsx | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx index 1fc4601b50b91..37297e3f25c0e 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx @@ -307,9 +307,6 @@ const nodeToEuiCollapsibleNavProps = ( }; } - // Render as an accordion or a link (handled by EUI) depending if - // "items" is undefined or not. If it is undefined --> a link, otherwise an - // accordion is rendered. if (navNode.renderItem) { return { items: [ @@ -322,19 +319,20 @@ const nodeToEuiCollapsibleNavProps = ( } const items: Array = [ - // @ts-ignore - TODO { id, path, isSelected, - linkProps, onClick, - href, icon: navNode.icon, title: navNode.title, - items: subItems, ['data-test-subj']: dataTestSubj, iconProps: { size: treeDepth === 0 ? 'm' : 's' }, + + // Render as an accordion or a link (handled by EUI) depending if + // "items" is undefined or not. If it is undefined --> a link, otherwise an + // accordion is rendered. + ...(subItems ? { items: subItems } : { href, linkProps }), }, ]; @@ -558,22 +556,47 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) ): EuiCollapsibleNavSubItemProps[] | undefined => { if (!_items) return; - return _items.map((item) => { + return _items.map(({ path, ...item }) => { if (item.renderItem) { return item; } - // @ts-ignore - TODO - const parsed: EuiCollapsibleNavSubItemProps = { - ...item, - items: serializeAccordionItems(item.items), - accordionProps: - item.items !== undefined - ? getAccordionProps(item.path ?? item.id!, { - onClick: item.onClick, - ...item.accordionProps, - }) - : undefined, - }; + + const itemsSerialized: EuiCollapsibleNavSubItemProps['items'] = serializeAccordionItems( + item.items + ); + + const accordionProps = + itemsSerialized === undefined + ? undefined + : getAccordionProps(path ?? item.id!, { + onClick: item.onClick, + ...item.accordionProps, + }); + + // The EuiCollapsibleNavSubItemProps can have *either* href/linkProps or items/accordionProps/isCollapsible. Mixing them is not allowed + // See ExclusiveUnion type in EUI repo at eui/src/components/collapsible_nav_beta/collapsible_nav_item/collapsible_nav_item.tsx#L63-L102 + const { + href, + linkProps, + isCollapsible, + items: __items, + accordionProps: __accordionProps, + ...rest + } = item; + + const parsed: EuiCollapsibleNavSubItemProps = itemsSerialized + ? { + ...rest, + items: itemsSerialized, + accordionProps, + isCollapsible, + } + : { + ...rest, + href, + linkProps, + }; + return parsed; }); }; @@ -584,14 +607,19 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) if (!isVisible) { return null; } + if (!subItems) { + return ; + } return ( - // @ts-ignore - TODO ); }); From 848510dc5fb6f5f6761667f9777defb41b2788c4 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Wed, 29 May 2024 18:48:51 +0200 Subject: [PATCH 31/95] [KQL] Remove unnecessary contrived wildcard match_all handling (#184351) ## Summary The following code was was introduced in https://github.com/elastic/kibana/pull/96902: https://github.com/elastic/kibana/blob/69b28f317b07af12fa346571b04b411a6130b25f/packages/kbn-es-query/src/kuery/functions/is.ts#L109-L112 As far as I can tell it was really just added to ensure that a contrived behavior stayed exactly the same after the optimization that PR made. I thought it was related to the case where we have a query like `*` or `*:*` (in other words, a query that matches all documents) but we are already handling that in this code: https://github.com/elastic/kibana/blob/69b28f317b07af12fa346571b04b411a6130b25f/packages/kbn-es-query/src/kuery/functions/is.ts#L62-L68 As we are moving to a scenario where we expect the field list passed to this code to be a subset of the entire list of fields (see https://github.com/elastic/kibana/pull/183694), this condition and the corresponding contrived test are removed in this PR. ### Checklist - [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 --- .../kbn-es-query/src/kuery/functions/is.test.ts | 13 ------------- packages/kbn-es-query/src/kuery/functions/is.ts | 5 ----- 2 files changed, 18 deletions(-) diff --git a/packages/kbn-es-query/src/kuery/functions/is.test.ts b/packages/kbn-es-query/src/kuery/functions/is.test.ts index 1b94562c6e99f..0d36bd4fc76db 100644 --- a/packages/kbn-es-query/src/kuery/functions/is.test.ts +++ b/packages/kbn-es-query/src/kuery/functions/is.test.ts @@ -74,19 +74,6 @@ describe('kuery functions', () => { expect(result).toEqual(expected); }); - test('should return an ES match_all query for queries that match all fields and values', () => { - const expected = { - match_all: {}, - }; - const node = nodeTypes.function.buildNode('is', 'n*', '*') as KqlIsFunctionNode; - const result = is.toElasticsearchQuery(node, { - ...indexPattern, - fields: indexPattern.fields.filter((field) => field.name.startsWith('n')), - }); - - expect(result).toEqual(expected); - }); - test('should return an ES match_all query for * queries without an index pattern', () => { const expected = { match_all: {}, diff --git a/packages/kbn-es-query/src/kuery/functions/is.ts b/packages/kbn-es-query/src/kuery/functions/is.ts index 46a6acfc56ff9..ef411b46c9c68 100644 --- a/packages/kbn-es-query/src/kuery/functions/is.ts +++ b/packages/kbn-es-query/src/kuery/functions/is.ts @@ -106,11 +106,6 @@ export function toElasticsearchQuery( }); } - // Special case for wildcards where there are no fields or all fields share the same prefix - if (isExistsQuery && (!fields?.length || fields?.length === indexPattern?.fields.length)) { - return { match_all: {} }; - } - const queries = fields!.reduce((accumulator: any, field: DataViewFieldBase) => { const isKeywordField = field.esTypes?.length === 1 && field.esTypes.includes('keyword'); const wrapWithNestedQuery = (query: any) => { From a5613515ee9a2bbfae3f8cdd817cb05dbe23843e Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Wed, 29 May 2024 12:50:35 -0400 Subject: [PATCH 32/95] Upgrade octokit/rest to 17.11.2 (#176224) ## Summary Bumps `@octokit/rest` to version `17.11.2` --- package.json | 2 +- src/dev/github/search_and_save_pr_list.ts | 4 +- yarn.lock | 118 +++++++++------------- 3 files changed, 52 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 46a7cbc47311d..096c76042f828 100644 --- a/package.json +++ b/package.json @@ -1373,7 +1373,7 @@ "@kbn/whereis-pkg-cli": "link:packages/kbn-whereis-pkg-cli", "@kbn/yarn-lock-validator": "link:packages/kbn-yarn-lock-validator", "@mapbox/vector-tile": "1.3.1", - "@octokit/rest": "^16.35.0", + "@octokit/rest": "^17.11.2", "@parcel/watcher": "^2.1.0", "@redocly/cli": "^1.12.0", "@statoscope/webpack-plugin": "^5.28.2", diff --git a/src/dev/github/search_and_save_pr_list.ts b/src/dev/github/search_and_save_pr_list.ts index ff5ae8fb67bcc..a07a5bbe94ab4 100644 --- a/src/dev/github/search_and_save_pr_list.ts +++ b/src/dev/github/search_and_save_pr_list.ts @@ -51,12 +51,12 @@ export async function savePrsToCsv( 'GET /search/issues', { q, per_page: perPage }, (response) => - response.data.map((item: Octokit.SearchIssuesAndPullRequestsResponseItemsItem) => { + response.data.map((item) => { return { title: item.title, url: item.html_url, releaseLabel: item.labels - .filter((label) => label.name.trim().startsWith('release_note')) + .filter((label) => label.name?.trim().startsWith('release_note')) .map((label) => label.name) .join(','), } as PR; diff --git a/yarn.lock b/yarn.lock index 3272c5b492a28..5d161d64b442e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7204,6 +7204,18 @@ dependencies: "@octokit/types" "^6.0.3" +"@octokit/core@^2.4.3": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.4.tgz#f7fbf8e4f86c5cc2497a8887ba2561ec8d358054" + integrity sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/graphql" "^4.3.1" + "@octokit/request" "^5.4.0" + "@octokit/types" "^5.0.0" + before-after-hook "^2.1.0" + universal-user-agent "^5.0.0" + "@octokit/core@^4.2.1": version "4.2.4" resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" @@ -7235,6 +7247,15 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" +"@octokit/graphql@^4.3.1": + version "4.5.8" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.8.tgz#d42373633c3015d0eafce64a8ce196be167fdd9b" + integrity sha512-WnCtNXWOrupfPJgXe+vSmprZJUr0VIu14G58PMlkWGj3cH+KLZEfKMmbUQ6C3Wwx6fdhzVW1CD5RTnBdUHxhhA== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.0" + universal-user-agent "^6.0.0" + "@octokit/graphql@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.0.tgz#2cc6eb3bf8e0278656df1a7d0ca0d7591599e3b3" @@ -7254,12 +7275,12 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.0.0.tgz#f43d765b3c7533fd6fb88f3f25df079c24fccf69" integrity sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw== -"@octokit/plugin-paginate-rest@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" - integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q== +"@octokit/plugin-paginate-rest@^2.2.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.7.0.tgz#6bb7b043c246e0654119a6ec4e72a172c9e2c7f3" + integrity sha512-+zARyncLjt9b0FjqPAbJo4ss7HOlBi1nprq+cPlw5vu2+qjy7WvlXhtXFdRHQbSL1Pt+bfAKaLADEkkvg8sP8w== dependencies: - "@octokit/types" "^2.0.1" + "@octokit/types" "^6.0.1" "@octokit/plugin-paginate-rest@^6.1.2": version "6.1.2" @@ -7274,12 +7295,12 @@ resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" - integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ== +"@octokit/plugin-rest-endpoint-methods@3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz#d8ba04eb883849dd98666c55bf49d8c9fe7be055" + integrity sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg== dependencies: - "@octokit/types" "^2.0.1" + "@octokit/types" "^4.1.6" deprecation "^2.3.1" "@octokit/plugin-rest-endpoint-methods@^7.1.2": @@ -7289,15 +7310,6 @@ dependencies: "@octokit/types" "^10.0.0" -"@octokit/request-error@^1.0.2": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" - integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA== - dependencies: - "@octokit/types" "^2.0.0" - deprecation "^2.0.0" - once "^1.4.0" - "@octokit/request-error@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" @@ -7316,7 +7328,7 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.2.0": +"@octokit/request@^5.3.0", "@octokit/request@^5.4.0": version "5.6.2" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.2.tgz#1aa74d5da7b9e04ac60ef232edd9a7438dcf32d8" integrity sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA== @@ -7340,27 +7352,15 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@^16.35.0": - version "16.43.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" - integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== +"@octokit/rest@^17.11.2": + version "17.11.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.11.2.tgz#f3dbd46f9f06361c646230fd0ef8598e59183ead" + integrity sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ== dependencies: - "@octokit/auth-token" "^2.4.0" - "@octokit/plugin-paginate-rest" "^1.1.1" + "@octokit/core" "^2.4.3" + "@octokit/plugin-paginate-rest" "^2.2.0" "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "2.4.0" - "@octokit/request" "^5.2.0" - "@octokit/request-error" "^1.0.2" - atob-lite "^2.0.0" - before-after-hook "^2.0.0" - btoa-lite "^1.0.0" - deprecation "^2.0.0" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.0" - once "^1.4.0" - universal-user-agent "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "3.17.0" "@octokit/rest@^19.0.7": version "19.0.13" @@ -7384,10 +7384,10 @@ dependencies: "@octokit/openapi-types" "^18.0.0" -"@octokit/types@^2.0.0", "@octokit/types@^2.0.1": - version "2.16.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2" - integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q== +"@octokit/types@^4.1.6": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.10.tgz#e4029c11e2cc1335051775bc1600e7e740e4aca4" + integrity sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ== dependencies: "@types/node" ">= 8" @@ -7398,7 +7398,7 @@ dependencies: "@types/node" ">= 8" -"@octokit/types@^6.0.0", "@octokit/types@^6.0.3", "@octokit/types@^6.16.1": +"@octokit/types@^6.0.0", "@octokit/types@^6.0.1", "@octokit/types@^6.0.3", "@octokit/types@^6.16.1": version "6.40.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.40.0.tgz#f2e665196d419e19bb4265603cf904a820505d0e" integrity sha512-MFZOU5r8SwgJWDMhrLUSvyJPtVsqA6VnbVI3TNbsmw+Jnvrktzvq2fYES/6RiJA/5Ykdwq4mJmtlYUfW7CGjmw== @@ -12187,11 +12187,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -12642,7 +12637,7 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^2.0.0, before-after-hook@^2.2.0: +before-after-hook@^2.1.0, before-after-hook@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== @@ -13009,11 +13004,6 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= - buffer-builder@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f" @@ -21711,11 +21701,6 @@ lodash.once@^4.0.0, lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -23808,11 +23793,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -octokit-pagination-methods@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== - on-exit-leak-free@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" @@ -30370,10 +30350,10 @@ unist-util-visit@^1.4.1: dependencies: unist-util-visit-parents "^2.0.0" -universal-user-agent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" - integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== +universal-user-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" + integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q== dependencies: os-name "^3.1.0" From 5715ee8347b5b05393b16a860623bba090c545f7 Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Wed, 29 May 2024 18:04:24 +0100 Subject: [PATCH 33/95] Add install integrations endpoint (#184167) Resolves #183472 Resolves #183020 ## Summary 1. Decouples integration installation from fleet privilege 2. Creates API endpoint to install all selected integrations as a single request: - Should accept list of selected integrations and log files - Should respond in a format easy to parse using native bash / standard unix commands like awk/sed/grep - Should return unified config for Elastic Agent for all installed integrations - ~Should update saved object with selected integrations and installation status~ Waiting for designs/requirements ## Screenshot ```text curl --request POST \ --url "http://localhost:5601/internal/observability_onboarding/flow/598bc802-0616-47c2-8895-c9cc24b959dd/integrations/install" \ --header "Authorization: ApiKey emRMWHBvOEJOMmJEaFRKNnN4LS06SVJwcldSTkxTUjZtU1VpNXRLU2ZBdw==" \ --header "Content-Type: text/tab-separated-values" \ --data $'system\tregistry\nproduct_service\tcustom\t/path/to/access.log\ncheckout_service\tcustom\t/path/to/access.log\ncheckout_service\tcustom\t/path/to/error.log' outputs: default: type: elasticsearch hosts: - 'http://localhost:9200' api_key: 'zdLXpo8BN2bDhTJ6sx--:IRprWRNLSR6mSUi5tKSfAw' inputs: - id: logfile-system.auth-96f640d3-2365-4008-b634-dcbe8278b583 data_stream: dataset: system.auth type: logs paths: - /var/log/auth.log* - /var/log/secure* exclude_files: - .gz$ multiline: pattern: ^s match: after tags: - system-auth processors: - add_locale: null - id: logfile-system.syslog-96f640d3-2365-4008-b634-dcbe8278b583 data_stream: dataset: system.syslog type: logs paths: - /var/log/messages* - /var/log/syslog* - /var/log/system* exclude_files: - .gz$ multiline: pattern: ^s match: after processors: - add_locale: null - id: custom-logs-4e07e609-ba8e-4dbe-9490-0b4aaf9e637b type: logfile data_stream: namespace: default streams: - id: logs-onboarding-product_service data_stream: dataset: product_service paths: - /path/to/access.log - id: custom-logs-c665eb58-effe-4530-be01-8b510f969140 type: logfile data_stream: namespace: default streams: - id: logs-onboarding-checkout_service data_stream: dataset: checkout_service paths: - /path/to/access.log - /path/to/error.log ``` Screenshot 2024-05-23 at 20 05 59 ## Testing 1. Start a Quickstart onboarding flow and copy the onboarding ID from DEV tools network tab 2. Create a new API key 3. Run the following curl: ```bash curl --request POST \ --url "http://localhost:5601/internal/observability_onboarding/flow/${ONBOARDING_ID}/integrations/install" \ --header "Authorization: ApiKey ${ENCODED_API_KEY}" \ --header "Content-Type: text/tab-separated-values" \ --data $'system\tregistry\nproduct_service\tcustom\t/path/to/access.log\ncheckout_service\tcustom\t/path/to/access.log' ``` 4. Go to installed integrations page 5. You should see the the system integration and 2 custom integrations installed. --- .../src/route_validation_object.ts | 2 +- x-pack/plugins/fleet/server/index.ts | 1 + .../services/epm/package_service.mock.ts | 1 + .../server/services/epm/package_service.ts | 53 +++- .../server/routes/flow/route.ts | 238 +++++++++++++++++- .../server/routes/register_routes.ts | 6 + .../server/routes/types.ts | 10 +- 7 files changed, 302 insertions(+), 9 deletions(-) diff --git a/packages/kbn-server-route-repository/src/route_validation_object.ts b/packages/kbn-server-route-repository/src/route_validation_object.ts index 550be8d20d446..9d033e31fc324 100644 --- a/packages/kbn-server-route-repository/src/route_validation_object.ts +++ b/packages/kbn-server-route-repository/src/route_validation_object.ts @@ -14,7 +14,7 @@ export const routeValidationObject = { // if any validation is defined. Not having validation currently // means we don't get the payload. See // https://github.com/elastic/kibana/issues/50179 - body: schema.nullable(anyObject), + body: schema.nullable(schema.oneOf([anyObject, schema.string()])), params: anyObject, query: anyObject, }; diff --git a/x-pack/plugins/fleet/server/index.ts b/x-pack/plugins/fleet/server/index.ts index 906a6926795b4..9f3e5e2ee2255 100644 --- a/x-pack/plugins/fleet/server/index.ts +++ b/x-pack/plugins/fleet/server/index.ts @@ -20,6 +20,7 @@ export type { MessageSigningServiceInterface, } from './services'; export { getRegistryUrl } from './services'; +export { NamingCollisionError } from './services/epm/packages/custom_integrations/validation/check_naming_collision'; export type { FleetSetupContract, FleetSetupDeps, FleetStartContract } from './plugin'; export type { diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts b/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts index 3eb689dfa1a2a..f05fb94f38180 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.mock.ts @@ -11,6 +11,7 @@ const createClientMock = (): jest.Mocked => ({ getInstallation: jest.fn(), ensureInstalledPackage: jest.fn(), installPackage: jest.fn(), + installCustomIntegration: jest.fn(), fetchFindLatestPackage: jest.fn(), readBundledPackage: jest.fn(), getPackage: jest.fn(), diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.ts b/x-pack/plugins/fleet/server/services/epm/package_service.ts index b7174fa7883e7..1c97cd10cc7f0 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.ts @@ -29,6 +29,7 @@ import type { Installation, RegistryPackage, } from '../../types'; + import type { FleetAuthzRouteConfig } from '../security/types'; import { checkSuperuser, doesNotHaveRequiredFleetAuthz, getAuthzFromRequest } from '../security'; import { FleetError, FleetUnauthorizedError, PackageNotFoundError } from '../../errors'; @@ -36,6 +37,10 @@ import { INSTALL_PACKAGES_AUTHZ, READ_PACKAGE_INFO_AUTHZ } from '../../routes/ep import type { InstallResult } from '../../../common'; +import { appContextService } from '..'; + +import type { CustomPackageDatasetConfiguration } from './packages/install'; + import type { FetchFindLatestPackageOptions } from './registry'; import * as Registry from './registry'; import { fetchFindLatestPackageOrThrow, getPackage } from './registry'; @@ -60,14 +65,22 @@ export interface PackageClient { pkgVersion?: string; spaceId?: string; force?: boolean; - }): Promise; + }): Promise; installPackage(options: { pkgName: string; pkgVersion?: string; spaceId?: string; force?: boolean; - }): Promise; + }): Promise; + + installCustomIntegration(options: { + pkgName: string; + kibanaVersion?: string; + force?: boolean; + spaceId?: string; + datasets: CustomPackageDatasetConfiguration[]; + }): Promise; fetchFindLatestPackage( packageName: string, @@ -167,7 +180,7 @@ class PackageClientImpl implements PackageClient { pkgVersion?: string; spaceId?: string; force?: boolean; - }): Promise { + }): Promise { await this.#runPreflight(INSTALL_PACKAGES_AUTHZ); return ensureInstalledPackage({ @@ -176,12 +189,13 @@ class PackageClientImpl implements PackageClient { savedObjectsClient: this.internalSoClient, }); } + public async installPackage(options: { pkgName: string; pkgVersion?: string; spaceId?: string; force?: boolean; - }): Promise { + }): Promise { await this.#runPreflight(INSTALL_PACKAGES_AUTHZ); const { pkgName, pkgVersion, spaceId = DEFAULT_SPACE_ID, force = false } = options; @@ -203,6 +217,37 @@ class PackageClientImpl implements PackageClient { }); } + public async installCustomIntegration(options: { + pkgName: string; + kibanaVersion?: string; + force?: boolean | undefined; + spaceId?: string | undefined; + datasets: CustomPackageDatasetConfiguration[]; + }): Promise { + await this.#runPreflight(INSTALL_PACKAGES_AUTHZ); + + const { + pkgName, + kibanaVersion = appContextService.getKibanaVersion(), + datasets, + spaceId = DEFAULT_SPACE_ID, + force = false, + } = options; + + return await installPackage({ + force, + pkgName, + kibanaVersion, + datasets, + spaceId, + installSource: 'custom', + esClient: this.internalEsClient, + savedObjectsClient: this.internalSoClient, + neverIgnoreVerificationError: !force, + authorizationHeader: this.getAuthorizationHeader(), + }); + } + public async fetchFindLatestPackage( packageName: string, options?: FetchFindLatestPackageOptions diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts index ec8e75e51ab4d..109dbd7ae3591 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts @@ -7,6 +7,13 @@ import Boom from '@hapi/boom'; import * as t from 'io-ts'; +import { + NamingCollisionError, + FleetUnauthorizedError, + type PackageClient, +} from '@kbn/fleet-plugin/server'; +import { v4 as uuidv4 } from 'uuid'; +import { dump } from 'js-yaml'; import { getObservabilityOnboardingFlow, saveObservabilityOnboardingFlow } from '../../lib/state'; import { ElasticAgentStepPayload, @@ -14,10 +21,13 @@ import { } from '../../saved_objects/observability_onboarding_status'; import { createObservabilityOnboardingServerRoute } from '../create_observability_onboarding_server_route'; import { getHasLogs } from './get_has_logs'; +import { getSystemLogsDataStreams } from '../../../common/elastic_agent_logs'; + +import { getFallbackESUrl } from '../../lib/get_fallback_urls'; const updateOnboardingFlowRoute = createObservabilityOnboardingServerRoute({ endpoint: 'PUT /internal/observability_onboarding/flow/{onboardingId}', - options: { tags: [] }, + options: { tags: [], xsrfRequired: false }, params: t.type({ path: t.type({ onboardingId: t.string, @@ -52,7 +62,7 @@ const updateOnboardingFlowRoute = createObservabilityOnboardingServerRoute({ const stepProgressUpdateRoute = createObservabilityOnboardingServerRoute({ endpoint: 'POST /internal/observability_onboarding/flow/{id}/step/{name}', - options: { tags: [] }, + options: { tags: [], xsrfRequired: false }, params: t.type({ path: t.type({ id: t.string, @@ -114,7 +124,7 @@ const stepProgressUpdateRoute = createObservabilityOnboardingServerRoute({ const getProgressRoute = createObservabilityOnboardingServerRoute({ endpoint: 'GET /internal/observability_onboarding/flow/{onboardingId}/progress', - options: { tags: [] }, + options: { tags: [], xsrfRequired: false }, params: t.type({ path: t.type({ onboardingId: t.string, @@ -171,8 +181,230 @@ const getProgressRoute = createObservabilityOnboardingServerRoute({ }, }); +/** + * This endpoints installs the requested integrations and returns the corresponding config file for Elastic Agent. + * + * The request/response format is TSV (tab-separated values) to simplify parsing in bash. + * + * Example request: + * + * ```text + * POST /internal/observability_onboarding/flow/${ONBOARDING_ID}/integrations/install + * + * system registry + * product_service custom /path/to/access.log + * product_service custom /path/to/error.log + * checkout_service custom /path/to/access.log + * checkout_service custom /path/to/error.log + * ``` + * + * Example curl: + * + * ```bash + * curl --request POST \ + * --url "http://localhost:5601/internal/observability_onboarding/flow/${ONBOARDING_ID}/integrations/install" \ + * --header "Authorization: ApiKey ${ENCODED_API_KEY}" \ + * --header "Content-Type: text/tab-separated-values" \ + * --data $'system\tregistry\nproduct_service\tcustom\t/path/to/access.log\ncheckout_service\tcustom\t/path/to/access.log' + * ``` + */ +const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ + endpoint: 'POST /internal/observability_onboarding/flow/{onboardingId}/integrations/install', + options: { tags: [], xsrfRequired: false }, + params: t.type({ + path: t.type({ + onboardingId: t.string, + }), + body: t.string, + }), + async handler({ context, request, response, params, core, plugins, services }) { + const coreStart = await core.start(); + const fleetStart = await plugins.fleet.start(); + const savedObjectsClient = coreStart.savedObjects.createInternalRepository(); + const packageClient = fleetStart.packageService.asScoped(request); + + const savedObservabilityOnboardingState = await getObservabilityOnboardingFlow({ + savedObjectsClient, + savedObjectId: params.path.onboardingId, + }); + if (!savedObservabilityOnboardingState) { + throw Boom.notFound(`Onboarding session '${params.path.onboardingId}' not found.`); + } + + const integrationsToInstall = parseIntegrationsTSV(params.body); + if (!integrationsToInstall.length) { + return response.badRequest({ + body: { + message: 'Please specify a list of integrations to install', + }, + }); + } + + await saveObservabilityOnboardingFlow({ + savedObjectsClient, + savedObjectId: params.path.onboardingId, + observabilityOnboardingState: { + ...savedObservabilityOnboardingState, + type: 'logFiles', + progress: {}, + } as ObservabilityOnboardingFlow, + }); + + let agentInputs: unknown[]; + try { + agentInputs = await ensureInstalledIntegrations(integrationsToInstall, packageClient); + } catch (error) { + if (error instanceof FleetUnauthorizedError) { + return response.forbidden({ + body: { + message: error.message, + }, + }); + } + throw error; + } + + const elasticsearchUrl = plugins.cloud?.setup?.elasticsearchUrl + ? [plugins.cloud?.setup?.elasticsearchUrl] + : await getFallbackESUrl(services.esLegacyConfigService); + + return response.ok({ + headers: { + 'content-type': 'application/yaml', + }, + body: generateAgentConfig({ + esHost: elasticsearchUrl, + inputs: agentInputs, + }), + }); + }, +}); + +type Integration = + | { + pkgName: string; + installSource: 'registry'; + } + | { + pkgName: string; + installSource: 'custom'; + logFilePaths: string[]; + }; + +async function ensureInstalledIntegrations( + integrationsToInstall: Integration[], + packageClient: PackageClient +) { + const agentInputs: unknown[] = []; + for (const integration of integrationsToInstall) { + const { pkgName, installSource } = integration; + if (installSource === 'registry') { + await packageClient.ensureInstalledPackage({ pkgName }); + agentInputs.push(...getSystemLogsDataStreams(uuidv4())); + } else if (installSource === 'custom') { + const input = { + id: `custom-logs-${uuidv4()}`, + type: 'logfile', + data_stream: { + namespace: 'default', + }, + streams: [ + { + id: `logs-onboarding-${pkgName}`, + data_stream: { + dataset: pkgName, + }, + paths: integration.logFilePaths, + }, + ], + }; + try { + await packageClient.installCustomIntegration({ + pkgName, + datasets: [{ name: pkgName, type: 'logs' }], + }); + agentInputs.push(input); + } catch (error) { + // If the error is a naming collision, we can assume the integration is already installed and treat this step as successful + if (error instanceof NamingCollisionError) { + agentInputs.push(input); + } else { + throw error; + } + } + } + } + return agentInputs; +} + +/** + * Parses and validates a TSV (tab-separated values) string of integrations with params. + * + * Returns an object of integrations to install. + * + * Example input: + * + * ```text + * system registry + * product_service custom /path/to/access.log + * product_service custom /path/to/error.log + * checkout_service custom /path/to/access.log + * checkout_service custom /path/to/error.log + * ``` + */ +function parseIntegrationsTSV(tsv: string) { + return Object.values( + tsv + .split('\n') + .map((line) => line.split('\t', 3)) + .reduce>((acc, [pkgName, installSource, logFilePath]) => { + if (installSource === 'registry') { + if (logFilePath) { + throw new Error(`Integration '${pkgName}' does not support a file path`); + } + acc[pkgName] = { + pkgName, + installSource, + }; + return acc; + } else if (installSource === 'custom') { + if (!logFilePath) { + throw new Error(`Missing file path for integration: ${pkgName}`); + } + // Append file path if integration is already in the list + const existing = acc[pkgName]; + if (existing && existing.installSource === 'custom') { + existing.logFilePaths.push(logFilePath); + return acc; + } + acc[pkgName] = { + pkgName, + installSource, + logFilePaths: [logFilePath], + }; + return acc; + } + throw new Error(`Invalid install source: ${installSource}`); + }, {}) + ); +} + +const generateAgentConfig = ({ esHost, inputs = [] }: { esHost: string[]; inputs: unknown[] }) => { + return dump({ + outputs: { + default: { + type: 'elasticsearch', + hosts: esHost, + api_key: '${API_KEY}', // Placeholder to be replaced by bash script with the actual API key + }, + }, + inputs, + }); +}; + export const flowRouteRepository = { ...updateOnboardingFlowRoute, ...stepProgressUpdateRoute, ...getProgressRoute, + ...integrationsInstallRoute, }; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/register_routes.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/register_routes.ts index a635be3ade6b4..9603d97e63faa 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/register_routes.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/register_routes.ts @@ -6,6 +6,7 @@ */ import { errors } from '@elastic/elasticsearch'; import Boom from '@hapi/boom'; +import type { IKibanaResponse } from '@kbn/core/server'; import { CoreSetup, Logger, RouteRegistrar } from '@kbn/core/server'; import { ServerRouteRepository, @@ -68,6 +69,7 @@ export function registerRoutes({ const data = (await handler({ context, request, + response, logger, params: decodedParams, plugins, @@ -87,6 +89,10 @@ export function registerRoutes({ return response.noContent(); } + if (data instanceof response.noContent().constructor) { + return data as IKibanaResponse; + } + return response.ok({ body: data }); } catch (error) { if (Boom.isBoom(error)) { diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts index 26c98fa75b90c..11efacc415e57 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts @@ -4,7 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CoreSetup, CoreStart, KibanaRequest, Logger } from '@kbn/core/server'; +import { + CoreSetup, + CoreStart, + KibanaRequest, + KibanaResponseFactory, + Logger, +} from '@kbn/core/server'; import { ObservabilityOnboardingServerRouteRepository } from '.'; import { ObservabilityOnboardingConfig } from '..'; import { EsLegacyConfigService } from '../services/es_legacy_config_service'; @@ -20,6 +26,7 @@ export interface ObservabilityOnboardingRouteHandlerResources { context: ObservabilityOnboardingRequestHandlerContext; logger: Logger; request: KibanaRequest; + response: KibanaResponseFactory; plugins: { [key in keyof ObservabilityOnboardingPluginSetupDependencies]: { setup: Required[key]; @@ -40,5 +47,6 @@ export interface ObservabilityOnboardingRouteHandlerResources { export interface ObservabilityOnboardingRouteCreateOptions { options: { tags: string[]; + xsrfRequired?: boolean; }; } From c766dd33e23d17291d166affcedebb3997bfa9f9 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 29 May 2024 19:15:32 +0200 Subject: [PATCH 34/95] Observability onboarding: Adjust codeowners (#184303) This PR adjusts the codeowners to allow code reviews within the virtual observability onboarding plugin --- .github/CODEOWNERS | 2 +- .../observability_onboarding/kibana.jsonc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8a09ab169b3b4..6920c67d8ac8f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -614,7 +614,7 @@ x-pack/packages/observability/alerting_test_data @elastic/obs-ux-management-team x-pack/test/cases_api_integration/common/plugins/observability @elastic/response-ops x-pack/packages/observability/get_padded_alert_time_range_util @elastic/obs-ux-management-team x-pack/plugins/observability_solution/observability_logs_explorer @elastic/obs-ux-logs-team -x-pack/plugins/observability_solution/observability_onboarding @elastic/obs-ux-logs-team +x-pack/plugins/observability_solution/observability_onboarding @elastic/obs-ux-logs-team @elastic/obs-ux-onboarding-team x-pack/plugins/observability_solution/observability @elastic/obs-ux-management-team x-pack/plugins/observability_solution/observability_shared @elastic/observability-ui x-pack/test/security_api_integration/plugins/oidc_provider @elastic/kibana-security diff --git a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc index 960f00db6179f..35d206123943b 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/observability-onboarding-plugin", - "owner": "@elastic/obs-ux-logs-team", + "owner": ["@elastic/obs-ux-logs-team", "@elastic/obs-ux-onboarding-team"], "plugin": { "id": "observabilityOnboarding", "server": true, From 0f1f08b99bf31c4cbdfff3cb07ead660add9636e Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 29 May 2024 13:26:11 -0400 Subject: [PATCH 35/95] skip failing test suite (#183493) --- .../functional/test_suites/common/discover/esql/_esql_view.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index a836d14b35125..29bbc4b3c3e9c 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -35,7 +35,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', }; - describe('discover esql view', async function () { + // Failing: See https://github.com/elastic/kibana/issues/183493 + describe.skip('discover esql view', async function () { before(async () => { await kibanaServer.savedObjects.cleanStandardList(); log.debug('load kibana index with default index pattern'); From c1846c34b820488d9e660d89b23cef1794231d59 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Wed, 29 May 2024 21:11:24 +0300 Subject: [PATCH 36/95] fix(tests): update built-in ES privileges to expect `remote_cluster` only starting from 8.15.0+. (#184454) ## Summary Update built-in ES privileges to expect `remote_cluster` only starting from 8.15.0+. ```http GET /_security/privilege/_builtin HTTP/1.1 x-elastic-product-origin: kibana user-agent: Kibana/8.15.0 x-elastic-client-meta: es=8.13.0,js=20.13.1,t=8.4.1,hc=20.13.1 accept: application/vnd.elasticsearch+json; compatible-with=8,text/plain Host: localhost:9220 HTTP/1.1 200 OK X-elastic-product: Elasticsearch content-type: application/json content-length: 1562 { "cluster": [ "all", ... ], "index": [ "all", ... ], "remote_cluster": [ "monitor_enrich" ] } ``` __Fixes: https://github.com/elastic/kibana/issues/184431__ __Fixes: https://github.com/elastic/kibana/issues/184432__ --- .../routes/authorization/privileges/get_builtin.ts | 9 +++------ .../apis/security/builtin_es_privileges.ts | 11 ++++++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts b/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts index 98b1f33bd5b38..9a9c2dd6fcc71 100644 --- a/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts +++ b/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts @@ -16,15 +16,12 @@ export function defineGetBuiltinPrivilegesRoutes({ router }: RouteDefinitionPara // Exclude the `none` privilege, as it doesn't make sense as an option within the Kibana UI privileges.cluster = privileges.cluster.filter((privilege) => privilege !== 'none'); - const indexPriviledges = Array.isArray(privileges.index) + const indexPrivileges = Array.isArray(privileges.index) ? privileges.index : [privileges.index]; - privileges.index = indexPriviledges.filter((privilege) => privilege !== 'none'); + privileges.index = indexPrivileges.filter((privilege) => privilege !== 'none'); - // TODO: remove hardcoded value once ES returns built-in privileges for remote_cluster - const remoteClusterPrivileges = ['monitor_enrich']; - - return response.ok({ body: { ...privileges, remote_cluster: remoteClusterPrivileges } }); + return response.ok({ body: privileges }); } ); } diff --git a/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts b/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts index 8087ded821b5b..f337a02ddaf6c 100644 --- a/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts +++ b/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts @@ -10,6 +10,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); + const esVersion = getService('esVersion'); describe('Builtin ES Privileges', () => { describe('GET /internal/security/esPrivileges/builtin', () => { @@ -24,7 +25,15 @@ export default function ({ getService }: FtrProviderContext) { const sampleOfExpectedIndexPrivileges = ['create', 'index', 'delete']; const payload = response.body; - expect(Object.keys(payload).sort()).to.eql(['cluster', 'index', 'remote_cluster']); + + // The `remote_cluster` built-in privilege was introduced in 8.15.0, but these tests are also run for + // earlier stack versions (e.g., compatibility tests) where `remote_cluster` isn't available. We can get + // rid of logic once we release 9.0 and switch compatibility test from 7.x branch to 8.x. + expect(Object.keys(payload).sort()).to.eql( + esVersion.matchRange('>=8.15.0') + ? ['cluster', 'index', 'remote_cluster'] + : ['cluster', 'index'] + ); sampleOfExpectedClusterPrivileges.forEach((privilege) => expect(payload.cluster).to.contain(privilege) From e221be3cde30d7250bef2d3c92a7de4a17976c88 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Wed, 29 May 2024 11:42:14 -0700 Subject: [PATCH 37/95] [EuiProvider] Fix Obs-Ux-Logs code (#183877) ## Summary Fixes needed for getting CI to pass when EUI throws an error if attempting to render a component without the EuiProvider in the render tree. ## Detailed description In https://github.com/elastic/kibana/pull/180819, I will deliver a change that will cause EUI components to throw an error if the EuiProvider context is missing. This PR comes in as part of the final work to get all functional tests passing in an environment where EUI will throw the error. The tied to the ["Fix 'dark mode' inconsistencies in Kibana" Epic](https://github.com/elastic/kibana-team/issues/805) has so far been in preparation for this. **Reviewers: Please interact with critical paths through the UI components touched in this PR, ESPECIALLY in terms of testing dark mode and i18n.** image ### Checklist Delete any items that are not applicable to this PR. - [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 - [ ] 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) --- .../public/routes/main/main_route.tsx | 11 ++- .../origin_interpreter/src/component.tsx | 2 + .../origin_interpreter/src/notifications.tsx | 84 ++++++++++--------- .../origin_interpreter/src/state_machine.ts | 15 ++-- .../public/types.ts | 14 +++- 5 files changed, 78 insertions(+), 48 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx index 577a269f434ad..d36dc5cec5e4a 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx @@ -27,7 +27,8 @@ import { useKibanaContextForPlugin } from '../../utils/use_kibana'; export const ObservabilityLogsExplorerMainRoute = () => { const { services } = useKibanaContextForPlugin(); - const { logsExplorer, serverless, chrome, notifications, appParams } = services; + const { logsExplorer, serverless, chrome, notifications, appParams, analytics, i18n, theme } = + services; const { history } = appParams; useBreadcrumbs(noBreadcrumbs, chrome, serverless); @@ -52,7 +53,13 @@ export const ObservabilityLogsExplorerMainRoute = () => { analytics={services.analytics} > - + ); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/component.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/component.tsx index 87a96ec1dbb3f..7faa002a0932b 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/component.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/component.tsx @@ -15,12 +15,14 @@ import { export const OriginInterpreter: React.FC = ({ history, toasts, + ...startServices }) => { useInterpret( () => createOriginInterpreterStateMachine({ history, toasts, + ...startServices, }), { devTools: isDevMode() } ); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/notifications.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/notifications.tsx index d6a40de3720a8..a486d0ae0916b 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/notifications.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/notifications.tsx @@ -5,49 +5,53 @@ * 2.0. */ -import { IToasts } from '@kbn/core-notifications-browser'; -import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; +import React from 'react'; + import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import type { IToasts } from '@kbn/core-notifications-browser'; import { i18n } from '@kbn/i18n'; import { LOGS_ONBOARDING_FEEDBACK_LINK } from '@kbn/observability-shared-plugin/common'; -import React from 'react'; +import { ObservabilityLogsExplorerStartServices } from '../../../types'; import { FEEDBACK_TOAST_LIFETIME_MS } from './constants'; -export const createRequestFeedbackNotifier = (toasts: IToasts) => () => { - toasts.addInfo( - { - title: i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.title', { - defaultMessage: 'Tell us what you think!', - }), - text: mountReactNode( - <> -

- {i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.text', { - defaultMessage: 'Share with us your onboarding experience and help us improve it.', - })} -

+export const createRequestFeedbackNotifier = + (toasts: IToasts, startServices: ObservabilityLogsExplorerStartServices) => () => { + toasts.addInfo( + { + title: i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.title', { + defaultMessage: 'Tell us what you think!', + }), + text: toMountPoint( + <> +

+ {i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.text', { + defaultMessage: 'Share with us your onboarding experience and help us improve it.', + })} +

- - - - {i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.buttonText', { - defaultMessage: 'Take a quick survey', - })} - - - - - ), - iconType: 'editorComment', - }, - { - toastLifeTimeMs: FEEDBACK_TOAST_LIFETIME_MS, - } - ); -}; + + + + {i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.buttonText', { + defaultMessage: 'Take a quick survey', + })} + + + + , + startServices + ), + iconType: 'editorComment', + }, + { + toastLifeTimeMs: FEEDBACK_TOAST_LIFETIME_MS, + } + ); + }; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/state_machine.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/state_machine.ts index 465780902c13f..ae895b3fcf230 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/state_machine.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/origin_interpreter/src/state_machine.ts @@ -5,14 +5,17 @@ * 2.0. */ -import { IToasts } from '@kbn/core-notifications-browser'; +import type { IToasts } from '@kbn/core-notifications-browser'; import { createMachine, InterpreterFrom } from 'xstate'; -import { ObservabilityLogsExplorerHistory } from '../../../types'; +import type { + ObservabilityLogsExplorerHistory, + ObservabilityLogsExplorerStartServices, +} from '../../../types'; import { FEEDBACK_DELAY_MS } from './constants'; import { DEFAULT_CONTEXT } from './defaults'; import { initializeFromLocationState } from './location_state_service'; import { createRequestFeedbackNotifier } from './notifications'; -import { +import type { OriginInterpreterContext, OriginInterpreterEvent, OriginInterpreterTypeState, @@ -65,7 +68,8 @@ export const createPureOriginInterpreterStateMachine = (initialContext: OriginIn } ); -export interface OriginInterpreterStateMachineDependencies { +export interface OriginInterpreterStateMachineDependencies + extends ObservabilityLogsExplorerStartServices { initialContext?: OriginInterpreterContext; history: ObservabilityLogsExplorerHistory; toasts: IToasts; @@ -75,10 +79,11 @@ export const createOriginInterpreterStateMachine = ({ initialContext = DEFAULT_CONTEXT, history, toasts, + ...startServices }: OriginInterpreterStateMachineDependencies) => createPureOriginInterpreterStateMachine(initialContext).withConfig({ actions: { - requestFeedback: createRequestFeedbackNotifier(toasts), + requestFeedback: createRequestFeedbackNotifier(toasts, startServices), }, services: { initializeFromLocationState: initializeFromLocationState({ history }), diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts index d66a26a6b3c35..12d56f91c4dda 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/types.ts @@ -11,7 +11,13 @@ import { DiscoverSetup, DiscoverStart } from '@kbn/discover-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; -import { AppMountParameters, ScopedHistory } from '@kbn/core/public'; +import type { + AppMountParameters, + ScopedHistory, + AnalyticsServiceStart, + I18nStart, + ThemeServiceStart, +} from '@kbn/core/public'; import { LogsSharedClientStartExports } from '@kbn/logs-shared-plugin/public'; import { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public'; import { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui-plugin/public'; @@ -59,3 +65,9 @@ export type ObservabilityLogsExplorerHistory = ScopedHistory; export type ObservabilityLogsExplorerAppMountParameters = AppMountParameters; + +export interface ObservabilityLogsExplorerStartServices { + analytics: AnalyticsServiceStart; + i18n: I18nStart; + theme: ThemeServiceStart; +} From 993903bb6177666b1dfd4b8ebf7fa4fa0ad4aed5 Mon Sep 17 00:00:00 2001 From: christineweng <18648970+christineweng@users.noreply.github.com> Date: Wed, 29 May 2024 13:43:24 -0500 Subject: [PATCH 38/95] [Security Solution][Alert table] Fix alert table refresh with bulk action (#183674) ## Summary Currently components outside of alert table do not refresh after changing status with bulk action. This PR adds global query refresh in bulk actions - https://github.com/elastic/kibana/issues/183025 No grouping https://github.com/elastic/kibana/assets/18648970/0490187d-9f3e-49d0-80b3-4cd75e8fdbf8 Grouping https://github.com/elastic/kibana/assets/18648970/80e55fda-2f89-4c8d-a882-2df413cb3560 --- .../use_bulk_actions.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_bulk_actions.tsx b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_bulk_actions.tsx index 03e2655ff4047..aa798b00dc969 100644 --- a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_bulk_actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_bulk_actions.tsx @@ -10,7 +10,7 @@ import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/type import type { SerializableRecord } from '@kbn/utility-types'; import { isEqual } from 'lodash'; import type { Filter } from '@kbn/es-query'; -import { useMemo } from 'react'; +import { useMemo, useCallback } from 'react'; import type { TableId } from '@kbn/securitysolution-data-table'; import { useBulkAlertAssigneesItems } from '../../../common/components/toolbar/bulk_actions/use_bulk_alert_assignees_items'; import { useBulkAlertTagsItems } from '../../../common/components/toolbar/bulk_actions/use_bulk_alert_tags_items'; @@ -18,6 +18,9 @@ import { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { useGlobalTime } from '../../../common/containers/use_global_time'; import { useAddBulkToTimelineAction } from '../../components/alerts_table/timeline_actions/use_add_bulk_to_timeline'; import { useBulkAlertActionItems } from './use_alert_actions'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import type { inputsModel } from '../../../common/store'; +import { inputsSelectors } from '../../../common/store'; // check to see if the query is a known "empty" shape export function isKnownEmptyQuery(query: QueryDslQueryContainer) { @@ -82,6 +85,14 @@ export const getBulkActionHook = }; }, [filters, from, to]); + const getGlobalQueriesSelector = useMemo(() => inputsSelectors.globalQuery(), []); + const globalQueries = useDeepEqualSelector(getGlobalQueriesSelector); + + const refetch = useCallback(() => { + refresh(); + globalQueries.forEach((q) => q.refetch && (q.refetch as inputsModel.Refetch)()); + }, [globalQueries, refresh]); + const alertActionParams = useMemo(() => { return { scopeId: SourcererScopeName.detections, @@ -89,9 +100,9 @@ export const getBulkActionHook = from, to, tableId, - refetch: refresh, + refetch, }; - }, [from, to, filters, refresh]); + }, [from, to, filters, refetch]); const bulkAlertTagParams = useMemo(() => { return { From aa7ffc499f68f123ea37ce1f230d9f5aa19a22db Mon Sep 17 00:00:00 2001 From: Khristinin Nikita Date: Wed, 29 May 2024 20:44:14 +0200 Subject: [PATCH 39/95] Initial backfull group (#184144) ## Show backfill group for manual runs UX - copy is not final, there will be an additional ticket for that, which we address later After user execute manual rule API we will present backfill group. Backfill group contains 1 to N scheduled entries. Each of the entry - is associated with rule run (potential, in progress, completed) Backfill group is removed after all task completed, so this why they disappear from UI in the video - Show amount of tasks - Ability to cancel run - There auto refresh - which is disabled by default, as backfills group remove after completion https://github.com/elastic/kibana/assets/7609147/35823ac5-de20-4082-819f-030ccc524e82 ### How to test 1 . Enable feature flag - `manualRuleRunEnabled` 2. For you rule call schedule api `/internal/alerting/rules/backfill/_schedule` `POST` With this body (put your values for rule id and date range): ``` [{"rule_id":"58b4b926-6348-4c23-be1f-870a461fa342","start":"2024-05-21T13:00:00.000Z","end":"2024-05-21T14:05:00.000Z"}] ``` --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + x-pack/plugins/alerting/common/index.ts | 5 + .../backfill/apis/find/find_backfill_route.ts | 7 +- .../execution_log_table.tsx | 4 + .../detection_engine/rule_gaps/api/api.ts | 63 ++++++ .../api/hooks/use_delete_backfill.ts | 37 ++++ .../api/hooks/use_find_backfills_for_rules.ts | 51 +++++ .../rule_backfills_info/backfill_status.tsx | 28 +++ .../components/rule_backfills_info/index.tsx | 182 ++++++++++++++++++ .../rule_backfills_info/stop_backfill.tsx | 61 ++++++ .../rule_backfills_info/utils.test.ts | 106 ++++++++++ .../components/rule_backfills_info/utils.ts | 36 ++++ .../rule_gaps/translations.ts | 127 ++++++++++++ .../detection_engine/rule_gaps/types.ts | 23 +++ .../rule_details/backfill_group.cy.ts | 86 +++++++++ .../cypress/screens/rule_details.ts | 14 ++ .../cypress/tasks/api_calls/backfill.ts | 88 ++++++++- .../cypress/tasks/rule_details.ts | 3 + 18 files changed, 917 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/api.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_delete_backfill.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_find_backfills_for_rules.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/backfill_status.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/stop_backfill.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.test.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_gaps/types.ts create mode 100644 x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6920c67d8ac8f..1fc523cf89080 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1550,6 +1550,7 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/public/detection_engine/rule_creation @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detection_engine/rule_exceptions @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/detection_engine/rule_gaps @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detections/pages/alerts @elastic/security-detection-engine /x-pack/plugins/security_solution/public/exceptions @elastic/security-detection-engine diff --git a/x-pack/plugins/alerting/common/index.ts b/x-pack/plugins/alerting/common/index.ts index 320a5b29f6956..7a23d37511bbe 100644 --- a/x-pack/plugins/alerting/common/index.ts +++ b/x-pack/plugins/alerting/common/index.ts @@ -91,6 +91,11 @@ export const INTERNAL_ALERTING_API_MAINTENANCE_WINDOW_PATH = export const INTERNAL_ALERTING_API_GET_ACTIVE_MAINTENANCE_WINDOWS_PATH = `${INTERNAL_ALERTING_API_MAINTENANCE_WINDOW_PATH}/_active` as const; +export const INTERNAL_ALERTING_BACKFILL_API_PATH = + `${INTERNAL_BASE_ALERTING_API_PATH}/rules/backfill` as const; +export const INTERNAL_ALERTING_BACKFILL_FIND_API_PATH = + `${INTERNAL_ALERTING_BACKFILL_API_PATH}/_find` as const; + export const ALERTING_FEATURE_ID = 'alerts'; export const MONITORING_HISTORY_LIMIT = 200; export const ENABLE_MAINTENANCE_WINDOWS = true; diff --git a/x-pack/plugins/alerting/server/routes/backfill/apis/find/find_backfill_route.ts b/x-pack/plugins/alerting/server/routes/backfill/apis/find/find_backfill_route.ts index 0e8dcdb6fc28a..4a6e5c5ef5e31 100644 --- a/x-pack/plugins/alerting/server/routes/backfill/apis/find/find_backfill_route.ts +++ b/x-pack/plugins/alerting/server/routes/backfill/apis/find/find_backfill_route.ts @@ -12,7 +12,10 @@ import { } from '../../../../../common/routes/backfill/apis/find'; import { ILicenseState } from '../../../../lib'; import { verifyAccessAndContext } from '../../../lib'; -import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../../../../types'; +import { + AlertingRequestHandlerContext, + INTERNAL_ALERTING_BACKFILL_FIND_API_PATH, +} from '../../../../types'; import { transformRequestV1, transformResponseV1 } from './transforms'; export const findBackfillRoute = ( @@ -21,7 +24,7 @@ export const findBackfillRoute = ( ) => { router.post( { - path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/backfill/_find`, + path: `${INTERNAL_ALERTING_BACKFILL_FIND_API_PATH}`, validate: { query: findQuerySchemaV1, }, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx index 26b3523c05472..7dcec81d2ef6b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx @@ -78,6 +78,7 @@ import { getSourceEventTimeRangeColumns, } from './execution_log_columns'; import { ExecutionLogSearchBar } from './execution_log_search_bar'; +import { RuleBackfillsInfo } from '../../../../rule_gaps/components/rule_backfills_info'; import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; const EXECUTION_UUID_FIELD_NAME = 'kibana.alert.rule.execution.uuid'; @@ -593,6 +594,9 @@ const ExecutionLogTableComponent: React.FC = ({ itemIdToExpandedRowMap={rows.itemIdToExpandedRowMap} data-test-subj="executionsTable" /> + + +
); }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/api.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/api.ts new file mode 100644 index 0000000000000..2ea5453e1733f --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/api.ts @@ -0,0 +1,63 @@ +/* + * 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 { + INTERNAL_ALERTING_BACKFILL_FIND_API_PATH, + INTERNAL_ALERTING_BACKFILL_API_PATH, +} from '@kbn/alerting-plugin/common'; +import type { FindBackfillResponseBody } from '@kbn/alerting-plugin/common/routes/backfill/apis/find'; +import { KibanaServices } from '../../../common/lib/kibana'; + +/** + * Find backfills for the given rule IDs + * @param ruleIds string[] + * @param signal? AbortSignal + * @returns + */ +export const findBackfillsForRules = async ({ + ruleIds, + page, + perPage, + signal, + sortField = 'createdAt', + sortOrder = 'desc', +}: { + ruleIds: string[]; + page: number; + perPage: number; + signal?: AbortSignal; + sortField?: string; + sortOrder?: string; +}): Promise => + KibanaServices.get().http.fetch( + INTERNAL_ALERTING_BACKFILL_FIND_API_PATH, + { + method: 'POST', + query: { + rule_ids: ruleIds.join(','), + page, + per_page: perPage, + sort_field: sortField, + sort_order: sortOrder, + }, + signal, + } + ); + +/** + * Delete backfill by ID + * @param backfillId + * @returns + */ +export const deleteBackfill = async ({ backfillId }: { backfillId: string }) => { + return KibanaServices.get().http.fetch( + `${INTERNAL_ALERTING_BACKFILL_API_PATH}/${backfillId}`, + { + method: 'DELETE', + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_delete_backfill.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_delete_backfill.ts new file mode 100644 index 0000000000000..fd789ac6fa5ad --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_delete_backfill.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 type { UseMutationOptions } from '@tanstack/react-query'; +import { useMutation } from '@tanstack/react-query'; +import type { IHttpFetchError } from '@kbn/core-http-browser'; +import { deleteBackfill } from '../api'; +import { useInvalidateFindBackfillQuery } from './use_find_backfills_for_rules'; + +export const DELETE_BACKFILL_MUTATION_KEY = ['POST', ' DELETE_BACKFILL_MUTATION_KEY']; + +export const useDeleteBackfill = ( + options?: UseMutationOptions< + unknown, + IHttpFetchError, + { + backfillId: string; + } + > +) => { + const invalidateBackfillQuery = useInvalidateFindBackfillQuery(); + + return useMutation(deleteBackfill, { + ...options, + mutationKey: DELETE_BACKFILL_MUTATION_KEY, + onSettled: (...args) => { + invalidateBackfillQuery(); + if (options?.onSettled) { + options.onSettled(...args); + } + }, + }); +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_find_backfills_for_rules.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_find_backfills_for_rules.ts new file mode 100644 index 0000000000000..1e9166cbe3901 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/api/hooks/use_find_backfills_for_rules.ts @@ -0,0 +1,51 @@ +/* + * 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 { UseQueryOptions } from '@tanstack/react-query'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import type { FindBackfillResponseBody } from '@kbn/alerting-plugin/common/routes/backfill/apis/find'; +import { useCallback } from 'react'; +import { findBackfillsForRules } from '../api'; + +const FIND_BACKFILLS_FOR_RULES = 'FIND_BACKFILLS_FOR_RULES'; + +export const useInvalidateFindBackfillQuery = () => { + const queryClient = useQueryClient(); + + return useCallback(() => { + queryClient.invalidateQueries([FIND_BACKFILLS_FOR_RULES], { + refetchType: 'active', + }); + }, [queryClient]); +}; + +export const useFindBackfillsForRules = ( + { + ruleIds, + page, + perPage, + }: { + ruleIds: string[]; + page: number; + perPage: number; + }, + options?: UseQueryOptions +) => { + return useQuery( + [FIND_BACKFILLS_FOR_RULES, ...ruleIds, page, perPage], + async ({ signal }) => { + const response = await findBackfillsForRules({ signal, ruleIds, page, perPage }); + + return response; + }, + { + retry: 0, + keepPreviousData: true, + ...options, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/backfill_status.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/backfill_status.tsx new file mode 100644 index 0000000000000..50e58b0988cfa --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/backfill_status.tsx @@ -0,0 +1,28 @@ +/* + * 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 { EuiHealth } from '@elastic/eui'; +import { capitalize } from 'lodash'; +import type { BackfillStatus } from '../../types'; + +function getBackfillStatusColor(status: BackfillStatus) { + switch (status) { + case 'pending': + return 'warning'; + case 'running': + return 'success'; + default: + return 'subdued'; + } +} + +export const BackfillStatusInfo = ({ status }: { status: BackfillStatus }) => { + const capitalizedStatus = capitalize(status); + const color = getBackfillStatusColor(status); + + return {capitalizedStatus}; +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx new file mode 100644 index 0000000000000..1c8a180207d2a --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/index.tsx @@ -0,0 +1,182 @@ +/* + * 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, { useState } from 'react'; +import { EuiAutoRefresh, EuiBasicTable, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import type { + EuiBasicTableColumn, + CriteriaWithPagination, + OnRefreshChangeProps, +} from '@elastic/eui'; +import { useFindBackfillsForRules } from '../../api/hooks/use_find_backfills_for_rules'; +import { StopBackfill } from './stop_backfill'; +import { BackfillStatusInfo } from './backfill_status'; +import { FormattedDate } from '../../../../common/components/formatted_date'; +import type { BackfillRow, BackfillStatus } from '../../types'; +import * as i18n from '../../translations'; +import { hasUserCRUDPermission } from '../../../../common/utils/privileges'; +import { useUserData } from '../../../../detections/components/user_info'; +import { getBackfillRowsFromResponse } from './utils'; +import { HeaderSection } from '../../../../common/components/header_section'; +import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; + +const AUTO_REFRESH_INTERVAL = 3000; +const DEFAULT_PAGE_SIZE = 10; + +const getBackfillsTableColumns = (hasCRUDPermissions: boolean) => { + const stopAction = { + render: (item: BackfillRow) => , + width: '10%', + }; + + const columns: Array> = [ + { + field: 'status', + name: i18n.BACKFILLS_TABLE_COLUMN_STATUS, + render: (value: BackfillStatus) => , + width: '10%', + }, + { + field: 'created_at', + name: i18n.BACKFILLS_TABLE_COLUMN_CREATED_AT, + render: (value: 'string') => , + width: '20%', + }, + { + name: i18n.BACKFILLS_TABLE_COLUMN_SOURCE_TIME_RANCE, + render: (value: BackfillRow) => ( + <> + + {' - '} + + + ), + width: '30%', + }, + { + field: 'error', + align: 'right', + name: i18n.BACKFILLS_TABLE_COLUMN_ERROR, + 'data-test-subj': 'rule-backfills-column-error', + }, + { + field: 'pending', + align: 'right', + name: i18n.BACKFILLS_TABLE_COLUMN_PENDING, + 'data-test-subj': 'rule-backfills-column-pending', + }, + { + field: 'running', + align: 'right', + name: i18n.BACKFILLS_TABLE_COLUMN_RUNNING, + 'data-test-subj': 'rule-backfills-column-running', + }, + { + field: 'complete', + align: 'right', + name: i18n.BACKFILLS_TABLE_COLUMN_COMPLETED, + 'data-test-subj': 'rule-backfills-column-completed', + }, + { + field: 'total', + align: 'right', + name: i18n.BACKFILLS_TABLE_COLUMN_TOTAL, + 'data-test-subj': 'rule-backfills-column-total', + }, + ]; + + if (hasCRUDPermissions) { + columns.push(stopAction); + } + + return columns; +}; + +export const RuleBackfillsInfo = React.memo<{ ruleId: string }>(({ ruleId }) => { + const isManualRuleRunEnabled = useIsExperimentalFeatureEnabled('manualRuleRunEnabled'); + const [autoRefreshInterval, setAutoRefreshInterval] = useState(AUTO_REFRESH_INTERVAL); + const [isAutoRefresh, setIsAutoRefresh] = useState(false); + const [pageIndex, setPageIndex] = useState(0); + const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE); + const [{ canUserCRUD }] = useUserData(); + const hasCRUDPermissions = hasUserCRUDPermission(canUserCRUD); + + const { data, isLoading, isError } = useFindBackfillsForRules( + { + ruleIds: [ruleId], + page: pageIndex + 1, + perPage: pageSize, + }, + { + refetchInterval: isAutoRefresh ? autoRefreshInterval : false, + enabled: isManualRuleRunEnabled, + } + ); + + if (!isManualRuleRunEnabled) { + return null; + } + + const backfills: BackfillRow[] = getBackfillRowsFromResponse(data?.data ?? []); + + const columns = getBackfillsTableColumns(hasCRUDPermissions); + + const pagination = { + pageIndex, + pageSize, + totalItemCount: data?.total ?? 0, + }; + + if (data?.total === 0) return null; + + const handleRefreshChange = ({ isPaused, refreshInterval }: OnRefreshChangeProps) => { + setIsAutoRefresh(!isPaused); + setAutoRefreshInterval(refreshInterval); + }; + + const handleTableChange: (params: CriteriaWithPagination) => void = ({ + page, + sort, + }) => { + if (page) { + setPageIndex(page.index); + setPageSize(page.size); + } + }; + + return ( +
+ + + + + + + + + +
+ ); +}); + +RuleBackfillsInfo.displayName = 'RuleBackfillsInfo'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/stop_backfill.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/stop_backfill.tsx new file mode 100644 index 0000000000000..6dfca1922d2a4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/stop_backfill.tsx @@ -0,0 +1,61 @@ +/* + * 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, { useState } from 'react'; +import { EuiButtonEmpty, EuiConfirmModal } from '@elastic/eui'; +import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; +import { useDeleteBackfill } from '../../api/hooks/use_delete_backfill'; +import * as i18n from '../../translations'; + +export const StopBackfill = ({ id }: { id: string }) => { + const { addSuccess, addError } = useAppToasts(); + const deleteBackfillMutation = useDeleteBackfill({ + onSuccess: () => { + closeModal(); + addSuccess(i18n.BACKFILLS_TABLE_STOP_CONFIRMATION_SUCCESS); + }, + onError: (error) => { + addError(error, { + title: i18n.BACKFILLS_TABLE_STOP_CONFIRMATION_ERROR, + toastMessage: error?.body?.message ?? error.message, + }); + }, + }); + const [isModalVisible, setIsModalVisible] = useState(false); + const showModal = () => setIsModalVisible(true); + const closeModal = () => setIsModalVisible(false); + const onConfirm = () => { + deleteBackfillMutation.mutate({ backfillId: id }); + }; + + return ( + <> + + {i18n.BACKFILLS_TABLE_STOP} + + {isModalVisible && ( + +

{i18n.BACKFILLS_TABLE_STOP_CONFIRMATION_BODY}

+
+ )} + + ); +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.test.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.test.ts new file mode 100644 index 0000000000000..b9056d477ae68 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.test.ts @@ -0,0 +1,106 @@ +/* + * 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 { getBackfillRowsFromResponse } from './utils'; +import type { Backfill, BackfillRow } from '../../types'; + +describe('getBackfillRowsFromResponse', () => { + it('should return an empty array when the input is an empty array', () => { + const input: Backfill[] = []; + const output: BackfillRow[] = getBackfillRowsFromResponse(input); + expect(output).toEqual([]); + }); + + it('should calculate total, completed, and error counts correctly', () => { + const input: Backfill[] = [ + { + id: '1', + created_at: '2023-01-01T00:00:00Z', + duration: '2h', + enabled: true, + rule: { + id: 'rule-1', + name: 'Test Rule', + tags: ['tag1'], + rule_type_id: 'type-1', + params: {}, + api_key_owner: null, + api_key_created_by_user: null, + consumer: 'consumer-1', + enabled: true, + schedule: { interval: '1h' }, + created_by: null, + updated_by: null, + created_at: '2023-01-01T00:00:00Z', + updated_at: '2023-01-01T00:00:00Z', + revision: 1, + }, + space_id: 'space-1', + start: '2023-01-01T00:00:00Z', + status: 'running', + schedule: [ + { run_at: '2023-01-01T01:00:00Z', status: 'complete', interval: '1h' }, + { run_at: '2023-01-01T02:00:00Z', status: 'error', interval: '1h' }, + { run_at: '2023-01-01T03:00:00Z', status: 'pending', interval: '1h' }, + { run_at: '2023-01-01T04:00:00Z', status: 'running', interval: '1h' }, + { run_at: '2023-01-01T05:00:00Z', status: 'running', interval: '1h' }, + ], + }, + { + id: '2', + created_at: '2023-01-02T00:00:00Z', + duration: '3h', + enabled: true, + rule: { + id: 'rule-2', + name: 'Test Rule 2', + tags: ['tag2'], + rule_type_id: 'type-2', + params: {}, + api_key_owner: null, + api_key_created_by_user: null, + consumer: 'consumer-2', + enabled: true, + schedule: { interval: '1h' }, + created_by: null, + updated_by: null, + created_at: '2023-01-02T00:00:00Z', + updated_at: '2023-01-02T00:00:00Z', + revision: 1, + }, + space_id: 'space-2', + start: '2023-01-02T00:00:00Z', + status: 'complete', + schedule: [ + { run_at: '2023-01-02T01:00:00Z', status: 'complete', interval: '1h' }, + { run_at: '2023-01-02T02:00:00Z', status: 'complete', interval: '1h' }, + ], + }, + ]; + + const output: BackfillRow[] = getBackfillRowsFromResponse(input); + + expect(output[0]).toMatchObject({ + total: 5, + complete: 1, + error: 1, + timeout: 0, + pending: 1, + running: 2, + }); + + expect(output[1]).toMatchObject({ + ...input[1], + total: 2, + complete: 2, + error: 0, + timeout: 0, + pending: 0, + running: 0, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.ts new file mode 100644 index 0000000000000..0473a2e2d3bf3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/components/rule_backfills_info/utils.ts @@ -0,0 +1,36 @@ +/* + * 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 { BackfillRow, Backfill, BackfillStats } from '../../types'; + +const getScheduledEntryAmount = (backfill: Backfill): BackfillStats => { + return backfill?.schedule?.reduce( + (acc, scheduledEntry) => { + return { + ...acc, + [scheduledEntry.status]: (acc[scheduledEntry.status] ?? 0) + 1, + }; + }, + { + total: backfill?.schedule?.length ?? 0, + complete: 0, + running: 0, + pending: 0, + error: 0, + timeout: 0, + } + ); +}; + +export const getBackfillRowsFromResponse = (backfills: Backfill[]): BackfillRow[] => { + const backfillRows: BackfillRow[] = + backfills?.map((backfill) => ({ + ...backfill, + ...getScheduledEntryAmount(backfill), + })) ?? []; + + return backfillRows; +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts new file mode 100644 index 0000000000000..aec5e579259ef --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/translations.ts @@ -0,0 +1,127 @@ +/* + * 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'; + +export const BACKFILLS_TABLE_COLUMN_STATUS = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.status', + { + defaultMessage: 'Status', + } +); + +export const BACKFILLS_TABLE_COLUMN_CREATED_AT = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.createdAt', + { + defaultMessage: 'Created at', + } +); + +export const BACKFILLS_TABLE_COLUMN_SOURCE_TIME_RANCE = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.sourceTimeRange', + { + defaultMessage: 'Source event time range', + } +); + +export const BACKFILLS_TABLE_COLUMN_ERROR = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.error', + { + defaultMessage: 'Error', + } +); + +export const BACKFILLS_TABLE_COLUMN_COMPLETED = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.completed', + { + defaultMessage: 'Completed', + } +); + +export const BACKFILLS_TABLE_COLUMN_RUNNING = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.running', + { + defaultMessage: 'Running', + } +); + +export const BACKFILLS_TABLE_COLUMN_PENDING = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.pending', + { + defaultMessage: 'Pending', + } +); + +export const BACKFILLS_TABLE_COLUMN_TOTAL = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.column.total', + { + defaultMessage: 'Total', + } +); + +export const BACKFILLS_TABLE_STOP = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop', + { + defaultMessage: 'Stop', + } +); + +export const BACKFILLS_TABLE_STOP_CONFIRMATION_TITLE = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop.confirmationTitle', + { + defaultMessage: 'Are you sure you want to stop this run?', + } +); + +export const BACKFILLS_TABLE_STOP_CONFIRMATION_CANCEL = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop.cancel', + { + defaultMessage: 'Cancel', + } +); + +export const BACKFILLS_TABLE_STOP_CONFIRMATION_STOP_RUNS = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop.stopRuns', + { + defaultMessage: 'Stop runs', + } +); + +export const BACKFILLS_TABLE_STOP_CONFIRMATION_BODY = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop.description', + { + defaultMessage: 'All remaining rule runs will be stopped', + } +); + +export const BACKFILLS_TABLE_STOP_CONFIRMATION_SUCCESS = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop.confirmationSuccess', + { + defaultMessage: 'Run stopped', + } +); + +export const BACKFILLS_TABLE_STOP_CONFIRMATION_ERROR = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillsTable.stop.confirmationError', + { + defaultMessage: 'Error stopping run', + } +); + +export const BACKFILL_TABLE_TITLE = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillTable.title', + { + defaultMessage: 'Backfill runs', + } +); + +export const BACKFILL_TABLE_SUBTITLE = i18n.translate( + 'xpack.securitySolution.rule_gaps.backfillTable.subtitle', + { + defaultMessage: 'View and manage backfill runs', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/types.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/types.ts new file mode 100644 index 0000000000000..285e62fab05f1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_gaps/types.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 { FindBackfillResponseBody } from '@kbn/alerting-plugin/common/routes/backfill/apis/find'; + +export type Backfill = FindBackfillResponseBody['data']['0']; + +export type BackfillStatus = Backfill['status']; + +export interface BackfillStats { + total: number; + complete: number; + running: number; + pending: number; + error: number; + timeout: number; +} + +export type BackfillRow = Backfill & BackfillStats; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts new file mode 100644 index 0000000000000..1b2cbd9add957 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/backfill_group.cy.ts @@ -0,0 +1,86 @@ +/* + * 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 { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; +import { login } from '../../../../tasks/login'; +import { visit } from '../../../../tasks/navigation'; +import { ruleDetailsUrl } from '../../../../urls/rule_details'; +import { createRule } from '../../../../tasks/api_calls/rules'; +import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule'; +import { TOASTER } from '../../../../screens/alerts_detection_rules'; +import { goToExecutionLogTab, getBackfillsTableRows } from '../../../../tasks/rule_details'; +import { getNewRule } from '../../../../objects/rule'; +import { + RULE_BACKFILLS_INFO_HEADEAR, + RULE_BACKFILLS_COLUMN_ERROR, + RULE_BACKFILLS_COLUMN_PENDING, + RULE_BACKFILLS_COLUMN_RUNNING, + RULE_BACKFILLS_COLUMN_COMPLETED, + RULE_BACKFILLS_COLUMN_TOTAL, + RULE_BACKFILLS_DELETE_BUTTON, + RULE_BACKFILLS_DELETE_MODAL, + RULE_BACKFILL_DELETE_MODAL_CONFIRM_BUTTON, +} from '../../../../screens/rule_details'; +import { + interceptFindBackfills, + interceptDeleteBackfill, + FIRST_BACKFILL_ID, +} from '../../../../tasks/api_calls/backfill'; + +describe( + 'Backfill groups', + { + tags: ['@ess', '@serverless'], + env: { + ftrConfig: { + kbnServerArgs: [ + `--xpack.securitySolution.enableExperimental=${JSON.stringify(['manualRuleRunEnabled'])}`, + ], + }, + }, + }, + function () { + before(() => { + login(); + deleteAlertsAndRules(); + createRule(getNewRule()).then((rule) => { + cy.wrap(rule.body.id).as('ruleId'); + }); + }); + + it('should show backfill groups', function () { + visit(ruleDetailsUrl(this.ruleId)); + waitForAlertsToPopulate(); + interceptFindBackfills(); + goToExecutionLogTab(); + + cy.get(RULE_BACKFILLS_INFO_HEADEAR).contains('Backfill runs'); + getBackfillsTableRows().should('have.length', 2); + getBackfillsTableRows().eq(0).contains('Pending'); + getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_COLUMN_ERROR).contains('1'); + getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_COLUMN_PENDING).contains('1'); + getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_COLUMN_RUNNING).contains('0'); + getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_COLUMN_COMPLETED).contains('2'); + getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_COLUMN_TOTAL).contains('4'); + + getBackfillsTableRows().eq(1).contains('Running'); + getBackfillsTableRows().eq(1).find(RULE_BACKFILLS_COLUMN_ERROR).contains('0'); + getBackfillsTableRows().eq(1).find(RULE_BACKFILLS_COLUMN_PENDING).contains('0'); + getBackfillsTableRows().eq(1).find(RULE_BACKFILLS_COLUMN_RUNNING).contains('1'); + getBackfillsTableRows().eq(1).find(RULE_BACKFILLS_COLUMN_COMPLETED).contains('0'); + getBackfillsTableRows().eq(1).find(RULE_BACKFILLS_COLUMN_TOTAL).contains('1'); + + getBackfillsTableRows().eq(0).find(RULE_BACKFILLS_DELETE_BUTTON).click(); + + cy.get(RULE_BACKFILLS_DELETE_MODAL).contains('Are you sure you want to stop this run?'); + interceptDeleteBackfill(FIRST_BACKFILL_ID, 'deleteBackfill'); + cy.get(RULE_BACKFILL_DELETE_MODAL_CONFIRM_BUTTON).click(); + cy.wait('@deleteBackfill'); + cy.get(TOASTER).contains('Run stopped'); + }); + } +); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/rule_details.ts b/x-pack/test/security_solution_cypress/cypress/screens/rule_details.ts index f9c78f5167256..5909f1655eb86 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/rule_details.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/rule_details.ts @@ -175,3 +175,17 @@ export const EXECUTION_LOG_CONTAINER = `[data-test-subj="executionLogContainer"] export const EXECUTION_RUN_TYPE_FILTER = `[data-test-subj="ExecutionRunTypeFilter"]`; export const EXECUTION_RUN_TYPE_FILTER_ITEM = `[data-test-subj="ExecutionRunTypeFilter-item"]`; + +export const RULE_BACKFILLS_INFO_HEADEAR = + '[data-test-subj="rule-backfills-info"] [data-test-subj="header-section"]'; + +export const RULE_BACKFILLS_TABLE = '[data-test-subj="rule-backfills-table"]'; + +export const RULE_BACKFILLS_COLUMN_ERROR = '[data-test-subj="rule-backfills-column-error"]'; +export const RULE_BACKFILLS_COLUMN_PENDING = '[data-test-subj="rule-backfills-column-pending"]'; +export const RULE_BACKFILLS_COLUMN_RUNNING = '[data-test-subj="rule-backfills-column-running"]'; +export const RULE_BACKFILLS_COLUMN_COMPLETED = '[data-test-subj="rule-backfills-column-completed"]'; +export const RULE_BACKFILLS_COLUMN_TOTAL = '[data-test-subj="rule-backfills-column-total"]'; +export const RULE_BACKFILLS_DELETE_BUTTON = '[data-test-subj="rule-backfills-delete-button"]'; +export const RULE_BACKFILLS_DELETE_MODAL = '[data-test-subj="rule-backfills-delete-modal"]'; +export const RULE_BACKFILL_DELETE_MODAL_CONFIRM_BUTTON = `${RULE_BACKFILLS_DELETE_MODAL} [data-test-subj="confirmModalConfirmButton"]`; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/backfill.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/backfill.ts index 9d14c5b8905fe..bfa495d78abd5 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/backfill.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/backfill.ts @@ -4,10 +4,12 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { INTERNAL_BASE_ALERTING_API_PATH } from '@kbn/alerting-plugin/common'; +import { + INTERNAL_ALERTING_BACKFILL_FIND_API_PATH, + INTERNAL_ALERTING_BACKFILL_API_PATH, +} from '@kbn/alerting-plugin/common'; -const BACKFILL_RULE_URL = `${INTERNAL_BASE_ALERTING_API_PATH}/rules/backfill`; -const BACKFILL_RULE_URL_SCHEDULE = `${BACKFILL_RULE_URL}/_schedule`; +const BACKFILL_RULE_URL_SCHEDULE = `${INTERNAL_ALERTING_BACKFILL_API_PATH}/_schedule`; export const manualRuleRun = ({ ruleId, @@ -31,3 +33,83 @@ export const manualRuleRun = ({ ], }); }; + +export const interceptFindBackfillsNoData = () => { + cy.intercept('POST', INTERNAL_ALERTING_BACKFILL_FIND_API_PATH, { + statusCode: 200, + body: { + page: 1, + per_page: 10, + total: 0, + data: [], + }, + }); +}; + +export const FIRST_BACKFILL_ID = 'c51259fb-7c55-4210-8137-b50f0c0dbff5'; + +export const interceptFindBackfills = () => { + cy.intercept('POST', `${INTERNAL_ALERTING_BACKFILL_FIND_API_PATH}*`, { + statusCode: 200, + body: { + page: 1, + per_page: 10, + total: 2, + data: [ + { + id: 'c51259fb-7c55-4210-8137-b50f0c0dbff5', + duration: '5h', + enabled: true, + end: '2024-05-22T14:05:00.000Z', + start: '2024-05-21T13:00:00.000Z', + status: 'pending', + created_at: '2024-05-27T15:19:43.543Z', + space_id: 'default', + schedule: [ + { + run_at: '2024-05-21T18:00:00.000Z', + status: 'complete', + interval: '5h', + }, + { + run_at: '2024-05-21T23:00:00.000Z', + status: 'complete', + interval: '5h', + }, + { + run_at: '2024-05-22T04:00:00.000Z', + status: 'pending', + interval: '5h', + }, + { + run_at: '2024-05-22T09:00:00.000Z', + status: 'error', + interval: '5h', + }, + ], + }, + { + id: 'c51259fb-7c55-4210-8137-b50f0c0dbff6', + duration: '5h', + enabled: true, + end: '2024-05-22T14:05:00.000Z', + start: '2024-05-21T13:00:00.000Z', + status: 'running', + created_at: '2024-05-27T15:19:43.543Z', + space_id: 'default', + schedule: [ + { + run_at: '2024-05-21T18:00:00.000Z', + status: 'running', + interval: '5h', + }, + ], + }, + ], + }, + }); +}; + +export const interceptDeleteBackfill = (id: string, alias: string) => { + cy.intercept('DELETE', `${INTERNAL_ALERTING_BACKFILL_API_PATH}/${id}`, {}).as(alias); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/rule_details.ts b/x-pack/test/security_solution_cypress/cypress/tasks/rule_details.ts index aae7be96c33fb..d44a7b9adc77d 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/rule_details.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/rule_details.ts @@ -41,6 +41,7 @@ import { EXECUTION_LOG_CONTAINER, EXECUTION_RUN_TYPE_FILTER, EXECUTION_RUN_TYPE_FILTER_ITEM, + RULE_BACKFILLS_TABLE, } from '../screens/rule_details'; import { RuleDetailsTabs, ruleDetailsUrl } from '../urls/rule_details'; import { @@ -210,3 +211,5 @@ export const filterByRunType = (ruleType: string) => { cy.get(EXECUTION_RUN_TYPE_FILTER).click(); cy.get(EXECUTION_RUN_TYPE_FILTER_ITEM).contains(ruleType).click(); }; + +export const getBackfillsTableRows = () => cy.get(RULE_BACKFILLS_TABLE).find('tbody tr'); From 5a5f9bde063456745b52bd95aa922b2430cda643 Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Wed, 29 May 2024 13:01:05 -0700 Subject: [PATCH 40/95] [ResponseOps] Investigate auto-healing when no write index is set for alerts as data alias (#184161) Resolves https://github.com/elastic/kibana/issues/179829 ## Summary We've run into multiple SDHs where concrete indices exist for an alerts-as-data resource but none of them are set as the write index for an alias. This PR adds code to pick a concrete index and set it as the write index to avoid these types of failures. ### Checklist - [ ] [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 ### To verify 1. Go to [dev tools](http://localhost:5601/app/dev_tools#/console) 2. Create an ES Query rule ``` POST kbn:/api/alerting/rule { "params": { "searchType": "esQuery", "timeWindowSize": 5, "timeWindowUnit": "m", "threshold": [ -1 ], "thresholdComparator": ">", "size": 100, "esQuery": "{\n \"query\":{\n \"match_all\" : {}\n }\n }", "aggType": "count", "groupBy": "all", "termSize": 5, "excludeHitsFromPreviousRun": false, "sourceFields": [], "index": [ ".kibana" ], "timeField": "created_at" }, "consumer": "stackAlerts", "schedule": { "interval": "1m" }, "tags": [], "name": "test", "rule_type_id": ".es-query", "actions": [] } ``` 3. Run the following commands to set `"is_write_index": false` ``` POST /_aliases { "actions": [ { "remove": { "index": ".internal.alerts-stack.alerts-default-000001", "alias": ".alerts-stack.alerts-default" } }, { "add": { "index": ".internal.alerts-stack.alerts-default-000001", "alias": ".alerts-stack.alerts-default", "is_write_index": false } } ] } GET .internal.alerts-stack.alerts-default-000001/_alias/* ``` 4. Stop Kibana, but keep ES running 5. Start Kibana and verify that the rule runs successfully 6. Run the GET alias command to verify `"is_write_index": true` ``` GET .internal.alerts-stack.alerts-default-000001/_alias/* ``` --- .../alerts_service/alerts_service.test.ts | 12 +- .../lib/create_concrete_write_index.test.ts | 107 ++++++++++++++++-- .../lib/create_concrete_write_index.ts | 44 ++++++- .../alerts_service/lib/data_stream_adapter.ts | 5 +- 4 files changed, 145 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts b/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts index 78285f8efac4d..fc62d80b3185d 100644 --- a/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts +++ b/x-pack/plugins/alerting/server/alerts_service/alerts_service.test.ts @@ -1253,16 +1253,10 @@ describe('Alerts Service', () => { TestRegistrationContext.context, DEFAULT_NAMESPACE_STRING ) - ).toEqual({ - error: - 'Failure during installation. Indices matching pattern .internal.alerts-test.alerts-default-* exist but none are set as the write index for alias .alerts-test.alerts-default', - result: false, - }); + ).toEqual({ result: true }); - expect(logger.error).toHaveBeenCalledWith( - new Error( - `Indices matching pattern .internal.alerts-test.alerts-default-* exist but none are set as the write index for alias .alerts-test.alerts-default` - ) + expect(logger.debug).toHaveBeenCalledWith( + `Indices matching pattern .internal.alerts-test.alerts-default-* exist but none are set as the write index for alias .alerts-test.alerts-default` ); expect(clusterClient.ilm.putLifecycle).toHaveBeenCalled(); diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts b/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts index 1d6555ea799a1..8ffb73508e1d9 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts @@ -7,7 +7,7 @@ import { elasticsearchServiceMock, loggingSystemMock } from '@kbn/core/server/mocks'; import { errors as EsErrors } from '@elastic/elasticsearch'; import { IndicesGetDataStreamResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { createConcreteWriteIndex } from './create_concrete_write_index'; +import { createConcreteWriteIndex, setConcreteWriteIndex } from './create_concrete_write_index'; import { getDataStreamAdapter } from './data_stream_adapter'; const randomDelayMultiplier = 0.01; @@ -680,7 +680,7 @@ describe('createConcreteWriteIndex', () => { } }); - it(`should throw error when there are concrete indices but none of them are the write index`, async () => { + it(`should log an error and try to set write index when there are concrete indices but none of them are the write index`, async () => { if (useDataStream) return; clusterClient.indices.getAlias.mockImplementationOnce(async () => ({ @@ -701,18 +701,101 @@ describe('createConcreteWriteIndex', () => { async () => SimulateTemplateResponse ); - await expect(() => - createConcreteWriteIndex({ - logger, - esClient: clusterClient, - indexPatterns: IndexPatterns, - totalFieldsLimit: 2500, - dataStreamAdapter, - }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Indices matching pattern .internal.alerts-test.alerts-default-* exist but none are set as the write index for alias .alerts-test.alerts-default"` + await createConcreteWriteIndex({ + logger, + esClient: clusterClient, + indexPatterns: IndexPatterns, + totalFieldsLimit: 2500, + dataStreamAdapter, + }); + + expect(logger.debug).toHaveBeenCalledWith( + 'Indices matching pattern .internal.alerts-test.alerts-default-* exist but none are set as the write index for alias .alerts-test.alerts-default' ); + expect(clusterClient.indices.updateAliases).toHaveBeenCalled(); }); }); } }); + +describe('setConcreteWriteIndex', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it(`should call updateAliases to set the concrete write index`, async () => { + await setConcreteWriteIndex({ + logger, + esClient: clusterClient, + concreteIndices: [ + { + index: '.internal.alerts-test.alerts-default-000003', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + }, + { + index: '.internal.alerts-test.alerts-default-000004', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + }, + { + index: '.internal.alerts-test.alerts-default-000001', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + }, + { + index: '.internal.alerts-test.alerts-default-000002', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + }, + ], + }); + + expect(logger.debug).toHaveBeenCalledWith( + 'Attempting to set index: .internal.alerts-test.alerts-default-000004 as the write index for alias: .alerts-test.alerts-default.' + ); + expect(clusterClient.indices.updateAliases).toHaveBeenCalledWith({ + body: { + actions: [ + { + remove: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000004', + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000004', + is_write_index: true, + }, + }, + ], + }, + }); + expect(logger.info).toHaveBeenCalledWith( + 'Successfully set index: .internal.alerts-test.alerts-default-000004 as the write index for alias: .alerts-test.alerts-default.' + ); + }); + + it(`should throw an error if there is a failure setting the concrete write index`, async () => { + const error = new Error(`fail`) as EsError; + clusterClient.indices.updateAliases.mockRejectedValueOnce(error); + + await expect(() => + setConcreteWriteIndex({ + logger, + esClient: clusterClient, + concreteIndices: [ + { + index: '.internal.alerts-test.alerts-default-000001', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + }, + ], + }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"Failed to set index: .internal.alerts-test.alerts-default-000001 as the write index for alias: .alerts-test.alerts-default."` + ); + }); +}); diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.ts b/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.ts index 7278f32f014c4..cc298ed3cd7d2 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/create_concrete_write_index.ts @@ -7,7 +7,7 @@ import { IndicesSimulateIndexTemplateResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { Logger, ElasticsearchClient } from '@kbn/core/server'; -import { get } from 'lodash'; +import { get, sortBy } from 'lodash'; import { IIndexPatternString } from '../resource_installer_utils'; import { retryTransientEsErrors } from './retry_transient_es_errors'; import { DataStreamAdapter } from './data_stream_adapter'; @@ -165,3 +165,45 @@ export interface CreateConcreteWriteIndexOpts { export const createConcreteWriteIndex = async (opts: CreateConcreteWriteIndexOpts) => { await opts.dataStreamAdapter.createStream(opts); }; + +interface SetConcreteWriteIndexOpts { + logger: Logger; + esClient: ElasticsearchClient; + concreteIndices: ConcreteIndexInfo[]; +} + +export async function setConcreteWriteIndex(opts: SetConcreteWriteIndexOpts) { + const { logger, esClient, concreteIndices } = opts; + const lastIndex = concreteIndices.length - 1; + const concreteIndex = sortBy(concreteIndices, ['index'])[lastIndex]; + logger.debug( + `Attempting to set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` + ); + try { + await retryTransientEsErrors( + () => + esClient.indices.updateAliases({ + body: { + actions: [ + { remove: { index: concreteIndex.index, alias: concreteIndex.alias } }, + { + add: { + index: concreteIndex.index, + alias: concreteIndex.alias, + is_write_index: true, + }, + }, + ], + }, + }), + { logger } + ); + logger.info( + `Successfully set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` + ); + } catch (error) { + throw new Error( + `Failed to set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` + ); + } +} diff --git a/x-pack/plugins/alerting/server/alerts_service/lib/data_stream_adapter.ts b/x-pack/plugins/alerting/server/alerts_service/lib/data_stream_adapter.ts index 12065ed06d529..0a3710ecf1159 100644 --- a/x-pack/plugins/alerting/server/alerts_service/lib/data_stream_adapter.ts +++ b/x-pack/plugins/alerting/server/alerts_service/lib/data_stream_adapter.ts @@ -10,6 +10,7 @@ import { CreateConcreteWriteIndexOpts, ConcreteIndexInfo, updateIndexMappings, + setConcreteWriteIndex, } from './create_concrete_write_index'; import { retryTransientEsErrors } from './retry_transient_es_errors'; @@ -186,9 +187,11 @@ async function createAliasStream(opts: CreateConcreteWriteIndexOpts): Promise Date: Wed, 29 May 2024 13:15:28 -0700 Subject: [PATCH 41/95] [HTTP] Make case APIs public (#184074) --- .../cases/server/routes/api/cases/alerts/get_cases.ts | 4 ++++ .../plugins/cases/server/routes/api/cases/delete_cases.ts | 4 ++++ .../plugins/cases/server/routes/api/cases/find_cases.ts | 4 ++++ x-pack/plugins/cases/server/routes/api/cases/get_case.ts | 4 ++++ .../plugins/cases/server/routes/api/cases/patch_cases.ts | 4 ++++ x-pack/plugins/cases/server/routes/api/cases/post_case.ts | 4 ++++ x-pack/plugins/cases/server/routes/api/cases/push_case.ts | 4 ++++ .../server/routes/api/cases/reporters/get_reporters.ts | 4 ++++ .../cases/server/routes/api/cases/tags/get_tags.ts | 4 ++++ .../server/routes/api/comments/delete_all_comments.ts | 4 ++++ .../cases/server/routes/api/comments/delete_comment.ts | 4 ++++ .../cases/server/routes/api/comments/find_comments.ts | 4 ++++ .../cases/server/routes/api/comments/get_alerts.ts | 4 ++++ .../cases/server/routes/api/comments/get_all_comment.ts | 8 +++++++- .../cases/server/routes/api/comments/get_comment.ts | 4 ++++ .../cases/server/routes/api/comments/patch_comment.ts | 4 ++++ .../cases/server/routes/api/comments/post_comment.ts | 4 ++++ .../cases/server/routes/api/configure/get_configure.ts | 4 ++++ .../cases/server/routes/api/configure/get_connectors.ts | 2 ++ .../cases/server/routes/api/configure/patch_configure.ts | 4 ++++ .../cases/server/routes/api/configure/post_configure.ts | 4 ++++ .../plugins/cases/server/routes/api/stats/get_status.ts | 4 ++++ x-pack/plugins/cases/server/routes/api/types.ts | 6 +++--- .../server/routes/api/user_actions/find_user_actions.ts | 4 ++++ .../routes/api/user_actions/get_all_user_actions.ts | 4 ++++ 25 files changed, 100 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts index 841a225eac8f9..6371b6ad546cd 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts @@ -19,6 +19,10 @@ export const getCasesByAlertIdRoute = createCasesRoute({ alert_id: schema.string({ minLength: 1 }), }), }, + routerOptions: { + access: 'public', + description: `Get cases for an alert`, + }, handler: async ({ context, request, response }) => { try { const alertID = request.params.alert_id; diff --git a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts index 5a397841f976d..f36c13499aa70 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts @@ -14,6 +14,10 @@ import { createCasesRoute } from '../create_cases_route'; export const deleteCaseRoute = createCasesRoute({ method: 'delete', path: CASES_URL, + routerOptions: { + access: 'public', + description: `Delete cases`, + }, params: { query: schema.object({ ids: schema.arrayOf(schema.string()), diff --git a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts index 1bfb5b4007c11..cfb5a7572894e 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts @@ -13,6 +13,10 @@ import type { caseApiV1 } from '../../../../common/types/api'; export const findCaseRoute = createCasesRoute({ method: 'get', path: `${CASES_URL}/_find`, + routerOptions: { + access: 'public', + description: `Search cases`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts index 434ff80fb0c08..c2522df7ddad7 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts @@ -30,6 +30,10 @@ export const getCaseRoute = createCasesRoute({ method: 'get', path: CASE_DETAILS_URL, params, + routerOptions: { + access: 'public', + description: `Get a case`, + }, handler: async ({ context, request, response, logger, kibanaVersion }) => { try { const isIncludeCommentsParamProvidedByTheUser = diff --git a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts index f9751c2ae8f12..2ae12fba4111c 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts @@ -14,6 +14,10 @@ import type { caseDomainV1 } from '../../../../common/types/domain'; export const patchCaseRoute = createCasesRoute({ method: 'patch', path: CASES_URL, + routerOptions: { + access: 'public', + description: `Update cases`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts index 423722fa95970..5a65ed0851e91 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts @@ -14,6 +14,10 @@ import type { caseDomainV1 } from '../../../../common/types/domain'; export const postCaseRoute = createCasesRoute({ method: 'post', path: CASES_URL, + routerOptions: { + access: 'public', + description: `Create a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts index ff040fa8fb673..d439b3f03dd79 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts @@ -16,6 +16,10 @@ import type { caseDomainV1 } from '../../../../common/types/domain'; export const pushCaseRoute: CaseRoute = createCasesRoute({ method: 'post', path: CASE_PUSH_URL, + routerOptions: { + access: 'public', + description: `Push a case to an external service`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts index 97c850b89c737..06ab468d9ce17 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts @@ -13,6 +13,10 @@ import type { caseApiV1 } from '../../../../../common/types/api'; export const getReportersRoute = createCasesRoute({ method: 'get', path: CASE_REPORTERS_URL, + routerOptions: { + access: 'public', + description: `Get all case creators`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts index 35c1b80229b5d..366ba114c9d4e 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts @@ -13,6 +13,10 @@ import type { caseApiV1 } from '../../../../../common/types/api'; export const getTagsRoute = createCasesRoute({ method: 'get', path: CASE_TAGS_URL, + routerOptions: { + access: 'public', + description: `Get case tags`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts index 317ebaec20a13..c395f68fbb147 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts @@ -13,6 +13,10 @@ import { createCaseError } from '../../../common/error'; export const deleteAllCommentsRoute = createCasesRoute({ method: 'delete', path: CASE_COMMENTS_URL, + routerOptions: { + access: 'public', + description: `Delete all alerts and comments from a case`, + }, params: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts index 775fabb846408..47b9ad9992717 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts @@ -20,6 +20,10 @@ export const deleteCommentRoute = createCasesRoute({ comment_id: schema.string(), }), }, + routerOptions: { + access: 'public', + description: `Delete an alert or comment from a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts index 05e4662f27292..e5f18ba07610f 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts @@ -20,6 +20,10 @@ export const findCommentsRoute = createCasesRoute({ case_id: schema.string(), }), }, + routerOptions: { + access: 'public', + description: `Get all alerts and comments for a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts index 7ee078e6d0602..bab7cd8971572 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts @@ -20,6 +20,10 @@ export const getAllAlertsAttachedToCaseRoute = createCasesRoute({ case_id: schema.string({ minLength: 1 }), }), }, + routerOptions: { + access: 'public', + description: `Get all alerts for a case`, + }, handler: async ({ context, request, response }) => { try { const caseId = request.params.case_id; diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts index fffb23921e2d3..a070c79541e1c 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts @@ -23,7 +23,13 @@ export const getAllCommentsRoute = createCasesRoute({ case_id: schema.string(), }), }, - options: { deprecated: true }, + options: { + deprecated: true, + }, + routerOptions: { + access: 'public', + description: `Gets all comments for a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts index 6267895f587ce..e2f5968b66814 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts @@ -21,6 +21,10 @@ export const getCommentRoute = createCasesRoute({ comment_id: schema.string(), }), }, + routerOptions: { + access: 'public', + description: `Get an alert or comment for a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts index dfa549bb9e9a6..03fe0747f83df 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts @@ -21,6 +21,10 @@ export const patchCommentRoute = createCasesRoute({ case_id: schema.string(), }), }, + routerOptions: { + access: 'public', + description: `Update an alert or comment in a case`, + }, handler: async ({ context, request, response }) => { try { const query = decodeWithExcessOrThrow(AttachmentPatchRequestRt)(request.body); diff --git a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts index d4d8f4f4f8db2..d2cbd96b880b9 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts @@ -20,6 +20,10 @@ export const postCommentRoute = createCasesRoute({ case_id: schema.string(), }), }, + routerOptions: { + access: 'public', + description: `Add an alert or comment to a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts index 27e453993e994..fe5c65dd54ffa 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts @@ -13,6 +13,10 @@ import type { configureApiV1 } from '../../../../common/types/api'; export const getCaseConfigureRoute = createCasesRoute({ method: 'get', path: CASE_CONFIGURE_URL, + routerOptions: { + access: 'public', + description: `Get case settings`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts index 5929e39a2dd32..53bc6d958115e 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts @@ -17,6 +17,8 @@ export const getConnectorsRoute = createCasesRoute({ path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, routerOptions: { tags: ['access:casesGetConnectorsConfigure'], + access: 'public', + description: `Get case connectors`, }, handler: async ({ context, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts index 0f246cd07af22..dabc73325f286 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts @@ -15,6 +15,10 @@ import type { configureApiV1 } from '../../../../common/types/api'; export const patchCaseConfigureRoute = createCasesRoute({ method: 'patch', path: CASE_CONFIGURE_DETAILS_URL, + routerOptions: { + access: 'public', + description: `Update case settings`, + }, handler: async ({ context, request, response }) => { try { const params = decodeWithExcessOrThrow(CaseConfigureRequestParamsRt)(request.params); diff --git a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts index 872c9ae5aee7f..cf23dad956d16 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts @@ -15,6 +15,10 @@ import type { configureApiV1 } from '../../../../common/types/api'; export const postCaseConfigureRoute = createCasesRoute({ method: 'post', path: CASE_CONFIGURE_URL, + routerOptions: { + access: 'public', + description: `Add case settings`, + }, handler: async ({ context, request, response }) => { try { const query = decodeWithExcessOrThrow(ConfigurationRequestRt)(request.body); diff --git a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts index 2d28a1ab19fb4..5a39b2ce6eadc 100644 --- a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts @@ -19,6 +19,10 @@ export const getStatusRoute: CaseRoute = createCasesRoute({ method: 'get', path: CASE_STATUS_URL, options: { deprecated: true }, + routerOptions: { + access: 'public', + description: `Get case status summary`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/types.ts b/x-pack/plugins/cases/server/routes/api/types.ts index a24e170ccaa16..93d11980ca654 100644 --- a/x-pack/plugins/cases/server/routes/api/types.ts +++ b/x-pack/plugins/cases/server/routes/api/types.ts @@ -12,6 +12,8 @@ import type { IKibanaResponse, KibanaResponseFactory, RouteValidatorConfig, + RouteConfigOptions, + RouteMethod, } from '@kbn/core/server'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; @@ -40,8 +42,6 @@ interface CaseRouteHandlerArguments { kibanaVersion: PluginInitializerContext['env']['packageInfo']['version']; } -type CaseRouteTags = 'access:casesSuggestUserProfiles' | 'access:casesGetConnectorsConfigure'; - export interface CaseRoute

{ method: 'get' | 'post' | 'put' | 'delete' | 'patch'; path: string; @@ -53,6 +53,6 @@ export interface CaseRoute

{ /** * These options are passed to the router's options field */ - routerOptions?: { tags: CaseRouteTags[] }; + routerOptions?: RouteConfigOptions; handler: (args: CaseRouteHandlerArguments) => Promise; } diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts index 9ded248b4a1b3..bf43cdef22b4e 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts @@ -20,6 +20,10 @@ export const findUserActionsRoute = createCasesRoute({ case_id: schema.string(), }), }, + routerOptions: { + access: 'public', + description: `Get user activity for a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts index 95ba8869e5ce7..7f42a340cd8be 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts @@ -24,6 +24,10 @@ export const getUserActionsRoute = createCasesRoute({ }), }, options: { deprecated: true }, + routerOptions: { + access: 'public', + description: `Get all user activity for a case`, + }, handler: async ({ context, request, response }) => { try { const caseContext = await context.cases; From 90d1dc5d0f7b5beb1c15e2f463c6e2d3e83fec11 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Wed, 29 May 2024 16:17:24 -0400 Subject: [PATCH 42/95] [Observability Onboarding] Update `Add data` links to use improved deep linking (#184164) ## Summary Resolves #179543. This patch will update the deep linking used by `Add data` links throughout Observability to pre-select the proper experience when navigating. This will streamline the process for users to help them more quickly ingest the data they need, allowing them to get value out of solution pages with fewer clicks. The changes (from the parent issue): - [x] Allow o11y Onboarding Locator to take query params https://github.com/elastic/kibana/commit/4a024a09c7daa258f059141d9ac6dacd173c1dd0 - [x] 'Add data' on the top right of Logs Explorer page should link to the new Add data UX where the use case 'collect and analyze logs' is pre-selected. https://github.com/elastic/kibana/commit/1cef1c68d50dc7b63b012308084c7f29c1508742 - [x] 'Add data' on the top right of Logs -> Stream page should link to the new Add data UX where the use case 'collect and analyze logs' is pre-selected. https://github.com/elastic/kibana/commit/75615b34ddd7add453007ba3766e43f4469470b7 - [x] 'Add data' on the top right of Logs -> Anomalies page should link to the new Add data UX where the use case 'collect and analyze logs' is pre-selected. https://github.com/elastic/kibana/commit/75615b34ddd7add453007ba3766e43f4469470b7 - [x] 'Add data' on the top right of Logs -> Categories page should link to the new Add data UX where the use case 'collect and analyze logs' is pre-selected. https://github.com/elastic/kibana/commit/75615b34ddd7add453007ba3766e43f4469470b7 - [x] 'Add data' on the top right of Infrastructure -> Inventory page should link to the new Add data UX where the use case 'monitor infrastructure' is pre-selected. https://github.com/elastic/kibana/commit/07fac0f8b5c4f5efcedbb54b2ece34f3dc75fadb - [x] 'Add data' on the top right of Infrastructure -> Metrics Explorer page should link to the new Add data UX where the use case 'monitor infrastructure' is pre-selected. https://github.com/elastic/kibana/commit/07fac0f8b5c4f5efcedbb54b2ece34f3dc75fadb - [x] 'Add data' on the top right of Infrastructure -> Hosts page should link to the new Add data UX where the use case 'monitor infrastructure' is pre-selected. https://github.com/elastic/kibana/commit/07fac0f8b5c4f5efcedbb54b2ece34f3dc75fadb ### Demo ![20240523142154](https://github.com/elastic/kibana/assets/18429259/3528e730-c461-4a3c-9358-ab2912fae264) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../locators/observability_onboarding.ts | 1 + .../infra/public/pages/logs/page_content.tsx | 18 +++-- .../infra/public/pages/metrics/index.tsx | 18 +++-- .../infra/tsconfig.json | 3 +- .../public/components/onboarding_link.tsx | 7 +- .../onboarding_locator/get_location.test.ts | 71 +++++++++++++++++++ .../onboarding_locator/get_location.ts | 14 +++- 7 files changed, 110 insertions(+), 22 deletions(-) create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.test.ts diff --git a/packages/deeplinks/observability/locators/observability_onboarding.ts b/packages/deeplinks/observability/locators/observability_onboarding.ts index 08bde8331c045..e985244902ecc 100644 --- a/packages/deeplinks/observability/locators/observability_onboarding.ts +++ b/packages/deeplinks/observability/locators/observability_onboarding.ts @@ -12,4 +12,5 @@ export const OBSERVABILITY_ONBOARDING_LOCATOR = 'OBSERVABILITY_ONBOARDING_LOCATO export interface ObservabilityOnboardingLocatorParams extends SerializableRecord { /** If given, it will load the given map else will load the create a new map page. */ source?: 'customLogs' | 'systemLogs'; + category?: string; } diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx index f398b32501d04..53ffdb4236b23 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx @@ -11,9 +11,13 @@ import React, { useContext } from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { HeaderMenuPortal, useLinkProps } from '@kbn/observability-shared-plugin/public'; +import { SharePublicStart } from '@kbn/share-plugin/public/plugin'; +import { + ObservabilityOnboardingLocatorParams, + OBSERVABILITY_ONBOARDING_LOCATOR, +} from '@kbn/deeplinks-observability'; import { LazyAlertDropdownWrapper } from '../../alerting/log_threshold'; import { HelpCenterContent } from '../../components/help_center_content'; -import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import { useReadOnlyBadge } from '../../hooks/use_readonly_badge'; import { HeaderActionMenuContext } from '../../utils/header_action_menu_provider'; import { RedirectWithQueryParams } from '../../utils/redirect_with_query_params'; @@ -26,13 +30,13 @@ import { StateMachinePlayground } from '../../observability_logs/xstate_helpers' import { NotFoundPage } from '../404'; export const LogsPageContent: React.FunctionComponent = () => { - const uiCapabilities = useKibana().services.application?.capabilities; + const { application, share } = useKibana<{ share: SharePublicStart }>().services; + const uiCapabilities = application?.capabilities; + const onboardingLocator = share?.url.locators.get( + OBSERVABILITY_ONBOARDING_LOCATOR + ); const { setHeaderActionMenu, theme$ } = useContext(HeaderActionMenuContext); - const { - application: { getUrlForApp }, - } = useKibanaContextForPlugin().services; - const enableDeveloperRoutes = isDevMode(); useReadOnlyBadge(!uiCapabilities?.logs?.save); @@ -81,7 +85,7 @@ export const LogsPageContent: React.FunctionComponent = () => { diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx index 8a96b1c2c6b6e..92c5f00e4fa73 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx @@ -20,6 +20,11 @@ import { import { useKibana, useUiSetting } from '@kbn/kibana-react-plugin/public'; import { HeaderMenuPortal, useLinkProps } from '@kbn/observability-shared-plugin/public'; import { enableInfrastructureHostsView } from '@kbn/observability-plugin/common'; +import { SharePublicStart } from '@kbn/share-plugin/public/plugin'; +import { + ObservabilityOnboardingLocatorParams, + OBSERVABILITY_ONBOARDING_LOCATOR, +} from '@kbn/deeplinks-observability'; import { HelpCenterContent } from '../../components/help_center_content'; import { useReadOnlyBadge } from '../../hooks/use_readonly_badge'; import { MetricsExplorerPage } from './metrics_explorer'; @@ -43,16 +48,19 @@ const ADD_DATA_LABEL = i18n.translate('xpack.infra.metricsHeaderAddDataButtonLab export const InfrastructurePage = () => { const config = usePluginConfig(); - const uiCapabilities = useKibana().services.application?.capabilities; + const { application, share } = useKibana<{ share: SharePublicStart }>().services; const { setHeaderActionMenu, theme$ } = useContext(HeaderActionMenuContext); const isHostsViewEnabled = useUiSetting(enableInfrastructureHostsView); + const uiCapabilities = application?.capabilities; + const onboardingLocator = share?.url.locators.get( + OBSERVABILITY_ONBOARDING_LOCATOR + ); + const settingsTabTitle = i18n.translate('xpack.infra.metrics.settingsTabTitle', { defaultMessage: 'Settings', }); - const kibana = useKibana(); - useReadOnlyBadge(!uiCapabilities?.infrastructure?.save); const settingsLinkProps = useLinkProps({ @@ -92,9 +100,7 @@ export const InfrastructurePage = () => { )} diff --git a/x-pack/plugins/observability_solution/infra/tsconfig.json b/x-pack/plugins/observability_solution/infra/tsconfig.json index 63350d0cd9786..22f3fb1d16d70 100644 --- a/x-pack/plugins/observability_solution/infra/tsconfig.json +++ b/x-pack/plugins/observability_solution/infra/tsconfig.json @@ -103,7 +103,8 @@ "@kbn/search-types", "@kbn/router-utils", "@kbn/react-kibana-context-render", - "@kbn/react-kibana-context-theme" + "@kbn/react-kibana-context-theme", + "@kbn/deeplinks-observability" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx index be7e0722210f5..cfcc68cd9cf6c 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx @@ -31,12 +31,9 @@ export const OnboardingLink = React.memo(({ urlService }: { urlService: BrowserU OBSERVABILITY_ONBOARDING_LOCATOR ); - const onboardingUrl = locator?.useUrl({}); - - const navigateToOnboarding = () => { - locator?.navigate({}); - }; + const onboardingUrl = locator?.useUrl({ category: 'logs' }); + const navigateToOnboarding = () => locator?.navigate({ category: 'logs' }); const onboardingLinkProps = getRouterLinkProps({ href: onboardingUrl, onClick: navigateToOnboarding, diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.test.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.test.ts new file mode 100644 index 0000000000000..3ea1f9db46c41 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.test.ts @@ -0,0 +1,71 @@ +/* + * 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 { getLocation } from './get_location'; +import { PLUGIN_ID } from '../../../common'; +import { ObservabilityOnboardingLocatorParams } from '@kbn/deeplinks-observability'; + +describe('getLocation', () => { + it('should return the correct location with source and query', () => { + const params: ObservabilityOnboardingLocatorParams = { + source: 'customLogs', + category: 'infra', + }; + + const result = getLocation(params); + + expect(result).toEqual({ + app: PLUGIN_ID, + path: '/customLogs?category=infra', + state: {}, + }); + }); + + it('should return the correct location with only source', () => { + const params: ObservabilityOnboardingLocatorParams = { + source: 'systemLogs', + }; + + const result = getLocation(params); + + expect(result).toEqual({ + app: PLUGIN_ID, + path: '/systemLogs', + state: {}, + }); + }); + + it('should return the correct location with only query', () => { + const params: ObservabilityOnboardingLocatorParams = { + source: undefined, + category: 'metrics', + }; + + const result = getLocation(params); + + expect(result).toEqual({ + app: PLUGIN_ID, + path: '/?category=metrics', + state: {}, + }); + }); + + it('should return the correct location with neither source nor query', () => { + const params: ObservabilityOnboardingLocatorParams = { + source: undefined, + query: undefined, + }; + + const result = getLocation(params); + + expect(result).toEqual({ + app: PLUGIN_ID, + path: '/', + state: {}, + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.ts index 9ebd263847f36..7427b5cc95c20 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/locators/onboarding_locator/get_location.ts @@ -9,13 +9,21 @@ import type { ObservabilityOnboardingLocatorParams } from '@kbn/deeplinks-observ import { PLUGIN_ID } from '../../../common'; export function getLocation(params: ObservabilityOnboardingLocatorParams) { - const { source } = params; + const { source, category } = params; - const path = ['/', source].filter(Boolean).join(''); + const path = ['/']; + + if (source) { + path.push(source); + } + + if (category) { + path.push(`?category=${category}`); + } return { app: PLUGIN_ID, - path, + path: path.join(''), state: {}, }; } From b34ff5203cc9fbf711d28d4cd03f6d142834bac3 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 29 May 2024 13:17:45 -0700 Subject: [PATCH 43/95] [HTTP/OAS] Add descriptions for Logstash pipeline APIs (#184266) --- x-pack/plugins/logstash/server/routes/pipeline/delete.ts | 4 ++++ x-pack/plugins/logstash/server/routes/pipeline/load.ts | 4 ++++ x-pack/plugins/logstash/server/routes/pipeline/save.ts | 4 ++++ x-pack/plugins/logstash/server/routes/pipelines/delete.ts | 3 +++ x-pack/plugins/logstash/server/routes/pipelines/list.ts | 3 +++ 5 files changed, 18 insertions(+) diff --git a/x-pack/plugins/logstash/server/routes/pipeline/delete.ts b/x-pack/plugins/logstash/server/routes/pipeline/delete.ts index ba9ea73850cc4..83c6124b49e14 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/delete.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/delete.ts @@ -14,6 +14,10 @@ export function registerPipelineDeleteRoute(router: LogstashPluginRouter) { router.delete( { path: '/api/logstash/pipeline/{id}', + options: { + access: 'public', + description: `Delete a managed Logstash pipeline`, + }, validate: { params: schema.object({ id: schema.string(), diff --git a/x-pack/plugins/logstash/server/routes/pipeline/load.ts b/x-pack/plugins/logstash/server/routes/pipeline/load.ts index 8a657207414d9..33775866ccdec 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/load.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/load.ts @@ -16,6 +16,10 @@ export function registerPipelineLoadRoute(router: LogstashPluginRouter) { router.get( { path: '/api/logstash/pipeline/{id}', + options: { + access: 'public', + description: `Get a managed Logstash pipeline`, + }, validate: { params: schema.object({ id: schema.string(), diff --git a/x-pack/plugins/logstash/server/routes/pipeline/save.ts b/x-pack/plugins/logstash/server/routes/pipeline/save.ts index 5c50dac7e050c..c40bee2630c73 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/save.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/save.ts @@ -21,6 +21,10 @@ export function registerPipelineSaveRoute( router.put( { path: '/api/logstash/pipeline/{id}', + options: { + access: 'public', + description: `Create a managed Logstash pipeline`, + }, validate: { params: schema.object({ id: schema.string(), diff --git a/x-pack/plugins/logstash/server/routes/pipelines/delete.ts b/x-pack/plugins/logstash/server/routes/pipelines/delete.ts index 777b86ea65284..f6d3d795cdee6 100644 --- a/x-pack/plugins/logstash/server/routes/pipelines/delete.ts +++ b/x-pack/plugins/logstash/server/routes/pipelines/delete.ts @@ -36,6 +36,9 @@ export function registerPipelinesDeleteRoute(router: LogstashPluginRouter) { router.post( { path: '/api/logstash/pipelines/delete', + options: { + description: `Delete managed Logstash pipelines`, + }, validate: { body: schema.object({ pipelineIds: schema.arrayOf(schema.string()), diff --git a/x-pack/plugins/logstash/server/routes/pipelines/list.ts b/x-pack/plugins/logstash/server/routes/pipelines/list.ts index cb1a14cbbd423..e342acb72233b 100644 --- a/x-pack/plugins/logstash/server/routes/pipelines/list.ts +++ b/x-pack/plugins/logstash/server/routes/pipelines/list.ts @@ -27,6 +27,9 @@ export function registerPipelinesListRoute(router: LogstashPluginRouter) { router.get( { path: '/api/logstash/pipelines', + options: { + description: `Get all managed Logstash pipelines`, + }, validate: false, }, wrapRouteWithLicenseCheck( From 81d3e1a4bed33e11e323306deaac924b73252f49 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Wed, 29 May 2024 16:44:01 -0400 Subject: [PATCH 44/95] [Embeddables Rebuild] Publish Phase Events (#184445) allows Dashboards with React Embeddables to properly fire phase events and report telemetry. --- .../interfaces/publishes_phase_events.ts | 4 +- .../component/grid/dashboard_grid_item.tsx | 2 +- .../compatibility/legacy_embeddable_to_api.ts | 6 +- .../lib/embeddables/embeddable.test.tsx | 2 +- .../public/lib/embeddables/embeddable.tsx | 4 +- .../react_embeddable_renderer.test.tsx | 162 ++++++++++++++---- .../react_embeddable_renderer.tsx | 85 ++++++--- .../public/react_embeddable_system/types.ts | 16 +- .../presentation_panel_internal.tsx | 2 +- 9 files changed, 218 insertions(+), 65 deletions(-) diff --git a/packages/presentation/presentation_publishing/interfaces/publishes_phase_events.ts b/packages/presentation/presentation_publishing/interfaces/publishes_phase_events.ts index 72dbf70393a90..967cbf2508d9a 100644 --- a/packages/presentation/presentation_publishing/interfaces/publishes_phase_events.ts +++ b/packages/presentation/presentation_publishing/interfaces/publishes_phase_events.ts @@ -21,11 +21,11 @@ export interface PhaseEvent { } export interface PublishesPhaseEvents { - onPhaseChange: PublishingSubject; + phase$: PublishingSubject; } export const apiPublishesPhaseEvents = ( unknownApi: null | unknown ): unknownApi is PublishesPhaseEvents => { - return Boolean(unknownApi && (unknownApi as PublishesPhaseEvents)?.onPhaseChange !== undefined); + return Boolean(unknownApi && (unknownApi as PublishesPhaseEvents)?.phase$ !== undefined); }; diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx index b0413b9fa3c46..583a867351b3b 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx @@ -103,6 +103,7 @@ export const Item = React.forwardRef( showBorder: useMargins, showNotifications: true, showShadow: false, + onPanelStatusChange, }; // render React embeddable @@ -123,7 +124,6 @@ export const Item = React.forwardRef( container.untilEmbeddableLoaded(id)} {...panelProps} /> diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts index 8253fabe9a8f3..8385f9010e7e2 100644 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts +++ b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts @@ -103,7 +103,7 @@ export const legacyEmbeddableToApi = ( /** * Performance tracking */ - const onPhaseChange = new BehaviorSubject(undefined); + const phase$ = new BehaviorSubject(undefined); let loadingStartTime = 0; subscriptions.add( @@ -132,7 +132,7 @@ export const legacyEmbeddableToApi = ( }) ) .subscribe((statusOutput) => { - onPhaseChange.next(statusOutput); + phase$.next(statusOutput); }) ); @@ -252,7 +252,7 @@ export const legacyEmbeddableToApi = ( dataLoading, blockingError, - onPhaseChange, + phase$, onEdit, isEditingEnabled, diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx index 3ff28fe7d5608..2269328503ba4 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx @@ -118,7 +118,7 @@ test('updating output state retains instance information', async () => { test('fires phase events when output changes', async () => { const phaseEventTest = new PhaseTestEmbeddable(); let phaseEventCount = 0; - phaseEventTest.onPhaseChange.subscribe((event) => { + phaseEventTest.phase$.subscribe((event) => { if (event) { phaseEventCount++; } diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx index fb6a093d54817..d27fd62148a27 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx @@ -127,7 +127,7 @@ export abstract class Embeddable< dataLoading: this.dataLoading, filters$: this.filters$, blockingError: this.blockingError, - onPhaseChange: this.onPhaseChange, + phase$: this.phase$, setPanelTitle: this.setPanelTitle, linkToLibrary: this.linkToLibrary, hidePanelTitle: this.hidePanelTitle, @@ -168,7 +168,7 @@ export abstract class Embeddable< public panelTitle: LegacyEmbeddableAPI['panelTitle']; public dataLoading: LegacyEmbeddableAPI['dataLoading']; public filters$: LegacyEmbeddableAPI['filters$']; - public onPhaseChange: LegacyEmbeddableAPI['onPhaseChange']; + public phase$: LegacyEmbeddableAPI['phase$']; public linkToLibrary: LegacyEmbeddableAPI['linkToLibrary']; public blockingError: LegacyEmbeddableAPI['blockingError']; public setPanelTitle: LegacyEmbeddableAPI['setPanelTitle']; diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx index 84cfa78e983b0..e8ba94e61a125 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx @@ -7,7 +7,7 @@ */ import { getMockPresentationContainer } from '@kbn/presentation-containers/mocks'; import { setStubKibanaServices as setupPresentationPanelServices } from '@kbn/presentation-panel-plugin/public/mocks'; -import { render, waitFor, screen } from '@testing-library/react'; +import { render, waitFor, screen, fireEvent } from '@testing-library/react'; import React from 'react'; import { BehaviorSubject } from 'rxjs'; @@ -15,36 +15,36 @@ import { registerReactEmbeddableFactory } from './react_embeddable_registry'; import { ReactEmbeddableRenderer } from './react_embeddable_renderer'; import { ReactEmbeddableFactory } from './types'; -describe('react embeddable renderer', () => { - const testEmbeddableFactory: ReactEmbeddableFactory<{ name: string; bork: string }> = { - type: 'test', - deserializeState: jest.fn().mockImplementation((state) => state.rawState), - buildEmbeddable: async (state, registerApi) => { - const api = registerApi( - { - serializeState: () => ({ - rawState: { - name: state.name, - bork: state.bork, - }, - }), - }, - { - name: [new BehaviorSubject(state.name), () => {}], - bork: [new BehaviorSubject(state.bork), () => {}], - } - ); - return { - Component: () => ( -

- SUPER TEST COMPONENT, name: {state.name} bork: {state.bork} -
- ), - api, - }; - }, - }; +const testEmbeddableFactory: ReactEmbeddableFactory<{ name: string; bork: string }> = { + type: 'test', + deserializeState: jest.fn().mockImplementation((state) => state.rawState), + buildEmbeddable: async (state, registerApi) => { + const api = registerApi( + { + serializeState: () => ({ + rawState: { + name: state.name, + bork: state.bork, + }, + }), + }, + { + name: [new BehaviorSubject(state.name), () => {}], + bork: [new BehaviorSubject(state.bork), () => {}], + } + ); + return { + Component: () => ( +
+ SUPER TEST COMPONENT, name: {state.name} bork: {state.bork} +
+ ), + api, + }; + }, +}; +describe('react embeddable renderer', () => { const getTestEmbeddableFactory = async () => { return testEmbeddableFactory; }; @@ -185,6 +185,7 @@ describe('react embeddable renderer', () => { serializeState: expect.any(Function), resetUnsavedChanges: expect.any(Function), snapshotRuntimeState: expect.any(Function), + phase$: expect.any(Object), }) ); }); @@ -209,3 +210,104 @@ describe('react embeddable renderer', () => { ); }); }); + +describe('reactEmbeddable phase events', () => { + it('publishes rendered phase immediately when dataLoading is not defined', async () => { + const immediateLoadEmbeddableFactory: ReactEmbeddableFactory<{ name: string; bork: string }> = { + ...testEmbeddableFactory, + type: 'immediateLoad', + }; + registerReactEmbeddableFactory('immediateLoad', () => + Promise.resolve(immediateLoadEmbeddableFactory) + ); + setupPresentationPanelServices(); + + const renderedEvent = jest.fn(); + render( + { + api.phase$.subscribe((phase) => { + if (phase?.status === 'rendered') { + renderedEvent(); + } + }); + }} + getParentApi={() => ({ + getSerializedStateForChild: () => ({ + rawState: { name: 'Kuni Garu' }, + }), + })} + /> + ); + await waitFor(() => expect(renderedEvent).toHaveBeenCalled()); + }); + + it('publishes rendered phase event when dataLoading is complete', async () => { + const dataLoadingEmbeddableFactory: ReactEmbeddableFactory<{ name: string; bork: string }> = { + ...testEmbeddableFactory, + type: 'loadClicker', + buildEmbeddable: async (state, registerApi) => { + const dataLoading = new BehaviorSubject(true); + const api = registerApi( + { + serializeState: () => ({ + rawState: { + name: state.name, + bork: state.bork, + }, + }), + dataLoading, + }, + { + name: [new BehaviorSubject(state.name), () => {}], + bork: [new BehaviorSubject(state.bork), () => {}], + } + ); + return { + Component: () => ( + <> +
+ SUPER TEST COMPONENT, name: {state.name} bork: {state.bork} +
+ + + ), + api, + }; + }, + }; + registerReactEmbeddableFactory('loadClicker', () => + Promise.resolve(dataLoadingEmbeddableFactory) + ); + setupPresentationPanelServices(); + + const phaseFn = jest.fn(); + render( + { + api.phase$.subscribe((phase) => { + phaseFn(phase); + }); + }} + getParentApi={() => ({ + getSerializedStateForChild: () => ({ + rawState: { name: 'Kuni Garu' }, + }), + })} + /> + ); + await waitFor(() => { + expect(phaseFn).toHaveBeenCalledWith(expect.objectContaining({ status: 'loading' })); + }); + await fireEvent.click(screen.getByTestId('clickToStopLoading')); + await waitFor(() => { + expect(phaseFn).toHaveBeenCalledWith(expect.objectContaining({ status: 'rendered' })); + }); + }); +}); diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx index 98a7a42244bb4..509e5a758866d 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx @@ -8,9 +8,14 @@ import { HasSerializedChildState, SerializedPanelState } from '@kbn/presentation-containers'; import { PresentationPanel, PresentationPanelProps } from '@kbn/presentation-panel-plugin/public'; -import { ComparatorDefinition, StateComparators } from '@kbn/presentation-publishing'; +import { + apiPublishesDataLoading, + ComparatorDefinition, + PhaseEvent, + StateComparators, +} from '@kbn/presentation-publishing'; import React, { useEffect, useImperativeHandle, useMemo, useRef } from 'react'; -import { combineLatest, debounceTime, skip, switchMap } from 'rxjs'; +import { BehaviorSubject, combineLatest, debounceTime, skip, Subscription, switchMap } from 'rxjs'; import { v4 as generateId } from 'uuid'; import { getReactEmbeddableFactory } from './react_embeddable_registry'; import { initializeReactEmbeddableState } from './react_embeddable_state'; @@ -58,13 +63,32 @@ export const ReactEmbeddableRenderer = < onAnyStateChange?: (state: SerializedPanelState) => void; }) => { const cleanupFunction = useRef<(() => void) | null>(null); + const firstLoadCompleteTime = useRef(null); const componentPromise = useMemo( - () => - (async () => { + () => { + const uuid = maybeId ?? generateId(); + + /** + * Phase tracking instrumentation for telemetry + */ + const phase$ = new BehaviorSubject(undefined); + const embeddableStartTime = performance.now(); + const reportPhaseChange = (loading: boolean) => { + if (firstLoadCompleteTime.current === null) { + firstLoadCompleteTime.current = performance.now(); + } + const duration = firstLoadCompleteTime.current - embeddableStartTime; + phase$.next({ id: uuid, status: loading ? 'loading' : 'rendered', timeToEvent: duration }); + }; + + /** + * Build the embeddable promise + */ + return (async () => { const parentApi = getParentApi(); - const uuid = maybeId ?? generateId(); const factory = await getReactEmbeddableFactory(type); + const subscriptions = new Subscription(); const { initialState, startStateDiffing } = await initializeReactEmbeddableState< SerializedState, @@ -84,23 +108,25 @@ export const ReactEmbeddableRenderer = < const comparatorDefinitions: Array< ComparatorDefinition > = Object.values(comparators); - combineLatest(comparatorDefinitions.map((comparator) => comparator[0])) - .pipe( - skip(1), - debounceTime(ON_STATE_CHANGE_DEBOUNCE), - switchMap(() => { - const isAsync = - apiRegistration.serializeState.prototype?.name === 'AsyncFunction'; - return isAsync - ? (apiRegistration.serializeState() as Promise< - SerializedPanelState - >) - : Promise.resolve(apiRegistration.serializeState()); + subscriptions.add( + combineLatest(comparatorDefinitions.map((comparator) => comparator[0])) + .pipe( + skip(1), + debounceTime(ON_STATE_CHANGE_DEBOUNCE), + switchMap(() => { + const isAsync = + apiRegistration.serializeState.prototype?.name === 'AsyncFunction'; + return isAsync + ? (apiRegistration.serializeState() as Promise< + SerializedPanelState + >) + : Promise.resolve(apiRegistration.serializeState()); + }) + ) + .subscribe((serializedState) => { + onAnyStateChange(serializedState); }) - ) - .subscribe((serializedState) => { - onAnyStateChange(serializedState); - }); + ); } const { unsavedChanges, resetUnsavedChanges, cleanup, snapshotRuntimeState } = @@ -108,13 +134,17 @@ export const ReactEmbeddableRenderer = < const fullApi = { ...apiRegistration, uuid, + phase$, parentApi, unsavedChanges, type: factory.type, resetUnsavedChanges, snapshotRuntimeState, } as unknown as Api; - cleanupFunction.current = () => cleanup(); + cleanupFunction.current = () => { + subscriptions.unsubscribe(); + cleanup(); + }; onApiAvailable?.(fullApi); return fullApi; }; @@ -126,13 +156,22 @@ export const ReactEmbeddableRenderer = < parentApi ); + if (apiPublishesDataLoading(api)) { + subscriptions.add( + api.dataLoading.subscribe((loading) => reportPhaseChange(Boolean(loading))) + ); + } else { + reportPhaseChange(false); + } + return React.forwardRef((_, ref) => { // expose the api into the imperative handle useImperativeHandle(ref, () => api, []); return ; }); - })(), + })(); + }, /** * Disabling exhaustive deps because we do not want to re-fetch the component * from the embeddable registry unless the type changes. diff --git a/src/plugins/embeddable/public/react_embeddable_system/types.ts b/src/plugins/embeddable/public/react_embeddable_system/types.ts index f0ff899f5df69..64514ac854b52 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/types.ts +++ b/src/plugins/embeddable/public/react_embeddable_system/types.ts @@ -11,7 +11,12 @@ import { SerializedPanelState, } from '@kbn/presentation-containers'; import { DefaultPresentationPanelApi } from '@kbn/presentation-panel-plugin/public/panel_component/types'; -import { HasType, PublishesUnsavedChanges, StateComparators } from '@kbn/presentation-publishing'; +import { + HasType, + PublishesPhaseEvents, + PublishesUnsavedChanges, + StateComparators, +} from '@kbn/presentation-publishing'; import { MaybePromise } from '@kbn/utility-types'; import React from 'react'; @@ -25,6 +30,7 @@ export interface DefaultEmbeddableApi< RuntimeState extends object = SerializedState > extends DefaultPresentationPanelApi, HasType, + PublishesPhaseEvents, PublishesUnsavedChanges, HasSerializableState, HasSnapshottableState {} @@ -38,7 +44,13 @@ export type ReactEmbeddableApiRegistration< Api extends DefaultEmbeddableApi = DefaultEmbeddableApi > = Omit< Api, - 'uuid' | 'parent' | 'type' | 'unsavedChanges' | 'resetUnsavedChanges' | 'snapshotRuntimeState' + | 'uuid' + | 'parent' + | 'type' + | 'unsavedChanges' + | 'resetUnsavedChanges' + | 'snapshotRuntimeState' + | 'phase$' >; /** diff --git a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx index 2d46bca73d3b8..d910d2b063afc 100644 --- a/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx +++ b/src/plugins/presentation_panel/public/panel_component/presentation_panel_internal.tsx @@ -84,7 +84,7 @@ export const PresentationPanelInternal = < useEffect(() => { let subscription: Subscription; if (api && onPanelStatusChange && apiPublishesPhaseEvents(api)) { - subscription = api.onPhaseChange.subscribe((phase) => { + subscription = api.phase$.subscribe((phase) => { if (phase) onPanelStatusChange(phase); }); } From f813d80dbf0c2b87aa21d7774fc847b0b2606dec Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 29 May 2024 22:01:44 +0100 Subject: [PATCH 45/95] skip flaky suite (#183479) --- .../functional/test_suites/common/discover/esql/_esql_view.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 29bbc4b3c3e9c..8a0fec8355571 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -174,7 +174,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('errors', () => { + // FLAKY: https://github.com/elastic/kibana/issues/183479 + describe.skip('errors', () => { it('should show error messages for syntax errors in query', async function () { await PageObjects.discover.selectTextBaseLang(); const brokenQueries = [ From 2bc31921cd79a11666d042297e8f4b5b69b1e827 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 29 May 2024 22:04:57 +0100 Subject: [PATCH 46/95] skip flaky suite (#168281) --- test/functional/apps/visualize/group3/_annotation_listing.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/visualize/group3/_annotation_listing.ts b/test/functional/apps/visualize/group3/_annotation_listing.ts index f58f2fd386028..80fd94a02b547 100644 --- a/test/functional/apps/visualize/group3/_annotation_listing.ts +++ b/test/functional/apps/visualize/group3/_annotation_listing.ts @@ -48,7 +48,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await listingTable.clearSearchFilter(); }); - describe('by text', () => { + // FLAKY: https://github.com/elastic/kibana/issues/168281 + describe.skip('by text', () => { it('matches on the first word', async function () { await retry.try(async () => { await listingTable.searchForItemWithName('search'); From 45171f68f2515a97ea6b329d6e406549f1fea692 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 29 May 2024 17:53:18 -0500 Subject: [PATCH 47/95] Add Firefox ESR to browserlistrc (#184462) --- .browserslistrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.browserslistrc b/.browserslistrc index c54816e60aebe..ad61703ab3033 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -3,6 +3,7 @@ last 2 Firefox versions last 2 Chrome versions last 2 Safari versions last 2 Edge versions +Firefox ESR last 1 ios_saf versions last 1 and_chr versions last 1 samsung versions From 454ef7f5a34aa9e10a7a1f753f401e33d19c18c0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 16:17:43 -0700 Subject: [PATCH 48/95] Update dependency @elastic/charts to v65.1.0 (main) (#184396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [@elastic/charts](https://togithub.com/elastic/elastic-charts) | [`65.0.0` -> `65.1.0`](https://renovatebot.com/diffs/npm/@elastic%2fcharts/65.0.0/65.1.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@elastic%2fcharts/65.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@elastic%2fcharts/65.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@elastic%2fcharts/65.0.0/65.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@elastic%2fcharts/65.0.0/65.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
elastic/elastic-charts (@​elastic/charts) ### [`v65.1.0`](https://togithub.com/elastic/elastic-charts/blob/HEAD/CHANGELOG.md#6510-2024-05-28) [Compare Source](https://togithub.com/elastic/elastic-charts/compare/v65.0.0...v65.1.0) ##### Bug Fixes - **deps:** update dependency [@​elastic/eui](https://togithub.com/elastic/eui) to ^94.5.0 ([#​2433](https://togithub.com/elastic/elastic-charts/issues/2433)) ([b13ded9](https://togithub.com/elastic/elastic-charts/commit/b13ded98da16780f8c0b3c08a02ac5bdd532d709)) - **deps:** update dependency [@​playwright/test](https://togithub.com/playwright/test) to ^1.44.0 ([#​2434](https://togithub.com/elastic/elastic-charts/issues/2434)) ([faf36aa](https://togithub.com/elastic/elastic-charts/commit/faf36aaf1e1527c105da614907ca853198d0c1cf)) - **Metric:** should only show one focus halo on `::focus` event ([#​2441](https://togithub.com/elastic/elastic-charts/issues/2441)) ([96b0779](https://togithub.com/elastic/elastic-charts/commit/96b0779cc3c9a7bd31b55286a140488bbf82ef5f)) - react component type errors ([#​2440](https://togithub.com/elastic/elastic-charts/issues/2440)) ([f0b3a00](https://togithub.com/elastic/elastic-charts/commit/f0b3a008e76da2f9edd366fc7e56a2749291338c)) ##### Features - **legend:** add legend stats (table view) ([#​2426](https://togithub.com/elastic/elastic-charts/issues/2426)) ([c22f767](https://togithub.com/elastic/elastic-charts/commit/c22f7673c89f516fde9e1d56d77873de6b36600d))
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/elastic/kibana). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- test/functional/page_objects/visual_builder_page.ts | 4 ++-- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 096c76042f828..a201702127530 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "@elastic/apm-rum": "^5.16.0", "@elastic/apm-rum-core": "^5.21.0", "@elastic/apm-rum-react": "^2.0.2", - "@elastic/charts": "65.0.0", + "@elastic/charts": "65.1.0", "@elastic/datemath": "5.0.3", "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.13.0", diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index d7bb97c5c8809..3da12ca470fe3 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -353,7 +353,7 @@ export class VisualBuilderPageObject extends FtrService { public async getRhythmChartLegendValue(nth = 0) { await this.visChart.waitForVisualizationRenderingStabilized(); const metricValue = ( - await this.find.allByCssSelector(`.echLegendItem .echLegendItem__extra`, 20000) + await this.find.allByCssSelector(`.echLegendItem .echLegendItem__legendValue`, 20000) )[nth]; await metricValue.moveMouseTo(); return await metricValue.getVisibleText(); @@ -824,7 +824,7 @@ export class VisualBuilderPageObject extends FtrService { .toArray() .map((li) => { const label = $(li).find('.echLegendItem__label').text(); - const value = $(li).find('.echLegendItem__extra').text(); + const value = $(li).find('.echLegendItem__legendValue').text(); return `${label}: ${value}`; }); diff --git a/yarn.lock b/yarn.lock index 5d161d64b442e..742cad1a39af4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1650,10 +1650,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@65.0.0": - version "65.0.0" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-65.0.0.tgz#96a912ecf15361b3e5e041bb890783ae123d1971" - integrity sha512-Cc28w3t73vtYJRgbbHP+eiCBm26bHmlwvEdO+kWm6ZVKrC21zJJt41AYXdy7yOU1fJseJkZ5TqT1Y8qHl5FoiQ== +"@elastic/charts@65.1.0": + version "65.1.0" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-65.1.0.tgz#ff0c7f71ce7da76472813c9bf5cd3ec16df887ae" + integrity sha512-rIvsoCZH6YUb+w3dqelp8geujEMwdiJLuxi/Y+9UVJm+7QrhkK4uob7QEFgPv79p2NeBngZIyetZCYGEE3FMzw== dependencies: "@popperjs/core" "^2.11.8" bezier-easing "^2.1.0" From 00c922fae39ad55c4a4bff625ea79421ec99d219 Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Wed, 29 May 2024 20:05:05 -0400 Subject: [PATCH 49/95] [Security Solution] [Detections] Display rule warning when action is disabled but rule ran successfully (#182741) ## Summary Ref: https://github.com/elastic/security-team/issues/8699 Co-authored-by: Yara Tercero Co-authored-by: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> --- x-pack/plugins/actions/server/mocks.ts | 1 + x-pack/plugins/actions/server/plugin.test.ts | 37 ++++++++++ x-pack/plugins/actions/server/plugin.ts | 4 + .../rule_types/__mocks__/rule_type.ts | 17 +++++ .../create_security_rule_type_wrapper.ts | 26 ++++++- .../query/create_query_alert_type.test.ts | 3 +- .../lib/detection_engine/rule_types/types.ts | 1 + .../rule_types/utils/utils.test.ts | 73 +++++++++++++++++++ .../rule_types/utils/utils.ts | 24 ++++++ .../security_solution/server/plugin.ts | 1 + .../server/plugin_contract.ts | 6 +- 11 files changed, 189 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/actions/server/mocks.ts b/x-pack/plugins/actions/server/mocks.ts index eb74d320ba8c3..71450fb4e0d83 100644 --- a/x-pack/plugins/actions/server/mocks.ts +++ b/x-pack/plugins/actions/server/mocks.ts @@ -35,6 +35,7 @@ const createSetupMock = () => { getActionsHealth: jest.fn(), getActionsConfigurationUtilities: jest.fn(), setEnabledConnectorTypes: jest.fn(), + isActionTypeEnabled: jest.fn(), }; return mock; }; diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index bcf4ce23c8c66..89efb80867fd7 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -420,6 +420,43 @@ describe('Actions Plugin', () => { expect(pluginStart.isActionTypeEnabled('.slack')).toBeFalsy(); }); + it('should set connector type enabled and check isActionTypeEnabled with plugin setup method', async () => { + setup(getConfig()); + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const pluginSetup = await plugin.setup(coreSetup as any, pluginsSetup); + + pluginSetup.registerType({ + id: '.server-log', + name: 'Server log', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.registerType({ + id: '.slack', + name: 'Slack', + minimumLicenseRequired: 'gold', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({}) }, + secrets: { schema: schema.object({}) }, + params: { schema: schema.object({}) }, + }, + executor, + }); + pluginSetup.setEnabledConnectorTypes(['.server-log']); + + // checking isActionTypeEnabled via plugin setup, not plugin start + expect(pluginSetup.isActionTypeEnabled('.server-log')).toBeTruthy(); + expect(pluginSetup.isActionTypeEnabled('.slack')).toBeFalsy(); + }); + it('should set all the connector types enabled when null or ["*"] passed', async () => { setup(getConfig()); // coreMock.createSetup doesn't support Plugin generics diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index b01199b4e7667..651de2ea04137 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -141,6 +141,7 @@ export interface PluginSetupContract { getActionsHealth: () => { hasPermanentEncryptionKey: boolean }; getActionsConfigurationUtilities: () => ActionsConfigurationUtilities; setEnabledConnectorTypes: (connectorTypes: EnabledConnectorTypes) => void; + isActionTypeEnabled(id: string, options?: { notifyUsage: boolean }): boolean; } export interface PluginStartContract { @@ -403,6 +404,9 @@ export class ActionsPlugin implements Plugin { + return this.actionTypeRegistry!.isActionTypeEnabled(id, options); + }, }; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts index 556a86c7c1f2b..6a863728cd746 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts @@ -15,6 +15,7 @@ import { mlPluginServerMock } from '@kbn/ml-plugin/server/mocks'; import type { IRuleDataClient } from '@kbn/rule-registry-plugin/server'; import { ruleRegistryMocks } from '@kbn/rule-registry-plugin/server/mocks'; import { eventLogServiceMock } from '@kbn/event-log-plugin/server/mocks'; +import type { PluginSetupContract as ActionsPluginSetupContract } from '@kbn/actions-plugin/server'; import type { PluginSetupContract as AlertingPluginSetupContract } from '@kbn/alerting-plugin/server'; import type { ConfigType } from '../../../../config'; import type { AlertAttributes } from '../types'; @@ -49,6 +50,21 @@ export const createRuleTypeMocks = ( getConfig: () => ({ run: { alerts: { max: DEFAULT_MAX_ALERTS } } }), } as AlertingPluginSetupContract; + const actions = { + registerType: jest.fn(), + + registerSubActionConnectorType: jest.fn(), + + isPreconfiguredConnector: (connectorId: string) => false, + + getSubActionConnectorClass: jest.fn(), + getCaseConnectorClass: jest.fn(), + getActionsHealth: jest.fn(), + getActionsConfigurationUtilities: jest.fn(), + setEnabledConnectorTypes: jest.fn(), + isActionTypeEnabled: () => true, + } as ActionsPluginSetupContract; + const scheduleActions = jest.fn(); const mockSavedObjectsClient = savedObjectsClientMock.create(); @@ -92,6 +108,7 @@ export const createRuleTypeMocks = ( return { dependencies: { + actions, alerting, config$: mockedConfig$, lists: listMock.createSetup(), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts index e5d03da05c045..72caa1d61ff63 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts @@ -26,6 +26,7 @@ import { hasTimestampFields, isMachineLearningParams, isEsqlParams, + getDisabledActionsWarningText, } from './utils/utils'; import { DEFAULT_MAX_SIGNALS, DEFAULT_SEARCH_AFTER_PAGE_SIZE } from '../../../../common/constants'; import type { CreateSecurityRuleTypeWrapper } from './types'; @@ -67,6 +68,7 @@ export const securityRuleTypeFieldMap = { export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = ({ lists, + actions, logger, config, publicBaseUrl, @@ -472,6 +474,28 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = }; } + const disabledActions = rule.actions.filter( + (action) => !actions.isActionTypeEnabled(action.actionTypeId) + ); + + const createdSignalsCount = result.createdSignals.length; + + if (disabledActions.length > 0) { + const disabledActionsWarning = getDisabledActionsWarningText({ + alertsCreated: createdSignalsCount > 0, + disabledActions, + }); + if (result.warningMessages.length) { + result.warningMessages.push(disabledActionsWarning); + } else { + warningMessage = [ + ...(warningMessage ? [warningMessage] : []), + disabledActionsWarning, + ].join(', '); + wroteWarningStatus = true; + } + } + if (result.warningMessages.length) { await ruleExecutionLogger.logStatusChange({ newStatus: RuleExecutionStatusEnum['partial failure'], @@ -484,8 +508,6 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = }); } - const createdSignalsCount = result.createdSignals.length; - if (result.success) { ruleExecutionLogger.debug('Security Rule execution completed'); ruleExecutionLogger.debug( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/create_query_alert_type.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/create_query_alert_type.test.ts index 7ad3c148b8840..1392c84aa044f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/create_query_alert_type.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/create_query_alert_type.test.ts @@ -37,8 +37,9 @@ describe('Custom Query Alerts', () => { const publicBaseUrl = 'http://somekibanabaseurl.com'; const { dependencies, executor, services } = mocks; - const { alerting, lists, logger, ruleDataClient } = dependencies; + const { actions, alerting, lists, logger, ruleDataClient } = dependencies; const securityRuleTypeWrapper = createSecurityRuleTypeWrapper({ + actions, lists, logger, config: createMockConfig(), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts index efbbf7888e6ed..31aa1797234bf 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts @@ -129,6 +129,7 @@ export type SecurityAlertType< export interface CreateSecurityRuleTypeWrapperProps { lists: SetupPlugins['lists']; + actions: SetupPlugins['actions']; logger: Logger; config: ConfigType; publicBaseUrl: string | undefined; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.test.ts index afa9583fef41e..a7895ba229cc8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.test.ts @@ -11,6 +11,8 @@ import type { TransportResult } from '@elastic/elasticsearch'; import { ALERT_REASON, ALERT_RULE_PARAMETERS, ALERT_UUID, TIMESTAMP } from '@kbn/rule-data-utils'; import type { RuleExecutorServicesMock } from '@kbn/alerting-plugin/server/mocks'; +import type { SanitizedRuleAction } from '@kbn/alerting-plugin/common'; + import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; import { listMock } from '@kbn/lists-plugin/server/mocks'; import type { ExceptionListClient } from '@kbn/lists-plugin/server'; @@ -45,6 +47,7 @@ import { getField, addToSearchAfterReturn, getUnprocessedExceptionsWarnings, + getDisabledActionsWarningText, } from './utils'; import type { BulkResponseErrorAggregation, SearchAfterAndBulkCreateReturnType } from '../types'; import { @@ -1751,4 +1754,74 @@ describe('utils', () => { ); }); }); + + describe('getDisabledActionsWarningText', () => { + const alertsCreated = true; + const alertsNotCreated = false; + + const singleDisabledAction = [{ actionTypeId: '.webhook' }]; + const multipleDisabledActionsDiffType = [ + { actionTypeId: '.webhook' }, + { actionTypeId: '.pagerduty' }, + ]; + const multipleDisabledActionsSameType = [ + { actionTypeId: '.webhook' }, + { actionTypeId: '.webhook' }, + ]; + test('returns string for single disabled action with alerts generated', () => { + const warning = getDisabledActionsWarningText({ + alertsCreated, + disabledActions: singleDisabledAction as SanitizedRuleAction[], + }); + expect(warning).toEqual( + 'This rule generated alerts but did not send external notifications because rule action connector .webhook is not enabled. To send notifications, you need a higher Security Analytics license / tier' + ); + }); + test('returns string for single disabled action with no alerts generated', () => { + const warning = getDisabledActionsWarningText({ + alertsCreated: alertsNotCreated, + disabledActions: singleDisabledAction as SanitizedRuleAction[], + }); + expect(warning).toEqual( + 'Rule action connector .webhook is not enabled. To send notifications, you need a higher Security Analytics license / tier' + ); + }); + test('returns string for multiple distinct disabled action types with alerts generated', () => { + const warning = getDisabledActionsWarningText({ + alertsCreated, + disabledActions: multipleDisabledActionsDiffType as SanitizedRuleAction[], + }); + expect(warning).toEqual( + 'This rule generated alerts but did not send external notifications because rule action connectors .webhook, .pagerduty are not enabled. To send notifications, you need a higher Security Analytics license / tier' + ); + }); + test('returns string for multiple distinct disabled action types with alerts NOT generated', () => { + const warning = getDisabledActionsWarningText({ + alertsCreated: alertsNotCreated, + disabledActions: multipleDisabledActionsDiffType as SanitizedRuleAction[], + }); + expect(warning).toEqual( + 'Rule action connectors .webhook, .pagerduty are not enabled. To send notifications, you need a higher Security Analytics license / tier' + ); + }); + test('returns string for multiple same type disabled action types with alerts generated', () => { + const warning = getDisabledActionsWarningText({ + alertsCreated, + disabledActions: multipleDisabledActionsSameType as SanitizedRuleAction[], + }); + expect(warning).toEqual( + 'This rule generated alerts but did not send external notifications because rule action connector .webhook is not enabled. To send notifications, you need a higher Security Analytics license / tier' + ); + }); + + test('returns string for multiple same type disabled action types with alerts NOT generated', () => { + const warning = getDisabledActionsWarningText({ + alertsCreated: alertsNotCreated, + disabledActions: multipleDisabledActionsSameType as SanitizedRuleAction[], + }); + expect(warning).toEqual( + 'Rule action connector .webhook is not enabled. To send notifications, you need a higher Security Analytics license / tier' + ); + }); + }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.ts index abb54d8fa6770..e67659b525342 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/utils.ts @@ -31,6 +31,7 @@ import type { } from '@kbn/alerting-plugin/server'; import { parseDuration } from '@kbn/alerting-plugin/server'; import type { ExceptionListClient, ListClient, ListPluginSetup } from '@kbn/lists-plugin/server'; +import type { SanitizedRuleAction } from '@kbn/alerting-plugin/common'; import type { TimestampOverride } from '../../../../../common/api/detection_engine/model/rule_schema'; import type { Privilege } from '../../../../../common/api/detection_engine'; import { RuleExecutionStatusEnum } from '../../../../../common/api/detection_engine/rule_monitoring'; @@ -1006,3 +1007,26 @@ export const getMaxSignalsWarning = (): string => { export const getSuppressionMaxSignalsWarning = (): string => { return `This rule reached the maximum alert limit for the rule execution. Some alerts were not created or suppressed.`; }; + +export const getDisabledActionsWarningText = ({ + alertsCreated, + disabledActions, +}: { + alertsCreated: boolean; + disabledActions: SanitizedRuleAction[]; +}) => { + const uniqueActionTypes = new Set(disabledActions.map((action) => action.actionTypeId)); + + const actionTypesJoined = [...uniqueActionTypes].join(', '); + + // This rule generated alerts but did not send external notifications because rule action connectors ${actionTypes} aren't enabled. To send notifications, you need a higher Security Analytics tier. + const alertsGeneratedText = alertsCreated + ? 'This rule generated alerts but did not send external notifications because rule action' + : 'Rule action'; + + if (uniqueActionTypes.size > 1) { + return `${alertsGeneratedText} connectors ${actionTypesJoined} are not enabled. To send notifications, you need a higher Security Analytics license / tier`; + } else { + return `${alertsGeneratedText} connector ${actionTypesJoined} is not enabled. To send notifications, you need a higher Security Analytics license / tier`; + } +}; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 369648f037df2..5b5b833dd2d4b 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -300,6 +300,7 @@ export class Plugin implements ISecuritySolutionPlugin { const securityRuleTypeOptions = { lists: plugins.lists, + actions: plugins.actions, logger: this.logger, config: this.config, publicBaseUrl: core.http.basePath.publicBaseUrl, diff --git a/x-pack/plugins/security_solution/server/plugin_contract.ts b/x-pack/plugins/security_solution/server/plugin_contract.ts index e441b0d3f5e03..3736e30ba3480 100644 --- a/x-pack/plugins/security_solution/server/plugin_contract.ts +++ b/x-pack/plugins/security_solution/server/plugin_contract.ts @@ -16,6 +16,10 @@ import type { PluginSetupContract as AlertingPluginSetup, PluginStartContract as AlertingPluginStart, } from '@kbn/alerting-plugin/server'; +import type { + PluginSetupContract as ActionsPluginSetup, + PluginStartContract as ActionsPluginStartContract, +} from '@kbn/actions-plugin/server'; import type { CasesServerStart, CasesServerSetup } from '@kbn/cases-plugin/server'; import type { EncryptedSavedObjectsPluginSetup } from '@kbn/encrypted-saved-objects-plugin/server'; import type { IEventLogClientService, IEventLogService } from '@kbn/event-log-plugin/server'; @@ -42,12 +46,12 @@ import type { SharePluginStart } from '@kbn/share-plugin/server'; import type { GuidedOnboardingPluginSetup } from '@kbn/guided-onboarding-plugin/server'; import type { PluginSetup as UnifiedSearchServerPluginSetup } from '@kbn/unified-search-plugin/server'; import type { ElasticAssistantPluginStart } from '@kbn/elastic-assistant-plugin/server'; -import type { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; import type { ProductFeaturesService } from './lib/product_features_service/product_features_service'; import type { ExperimentalFeatures } from '../common'; export interface SecuritySolutionPluginSetupDependencies { alerting: AlertingPluginSetup; + actions: ActionsPluginSetup; cases: CasesServerSetup; cloud: CloudSetup; data: DataPluginSetup; From bf6549b69057c461a2fe96a928eca9a01f4becfd Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 29 May 2024 20:25:57 -0400 Subject: [PATCH 50/95] skip failing test suite (#168281) --- test/functional/apps/visualize/group3/_annotation_listing.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/visualize/group3/_annotation_listing.ts b/test/functional/apps/visualize/group3/_annotation_listing.ts index 80fd94a02b547..541fc6fb5538e 100644 --- a/test/functional/apps/visualize/group3/_annotation_listing.ts +++ b/test/functional/apps/visualize/group3/_annotation_listing.ts @@ -18,7 +18,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const log = getService('log'); - describe('annotation listing page', function () { + // Failing: See https://github.com/elastic/kibana/issues/168281 + describe.skip('annotation listing page', function () { before(async function () { await kibanaServer.importExport.load( 'test/functional/fixtures/kbn_archiver/annotation_listing_page_search' From 3c62035c18ad32a3c6ad59ee7dd84f1f19468107 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 29 May 2024 20:27:09 -0400 Subject: [PATCH 51/95] skip failing test suite (#176543) --- x-pack/plugins/osquery/cypress/e2e/all/packs_integration.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 417394784bd4d..d9527001f704e 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 @@ -40,7 +40,8 @@ import { cleanupPack, cleanupAgentPolicy } from '../../tasks/api_fixtures'; import { request } from '../../tasks/common'; import { ServerlessRoleName } from '../../support/roles'; -describe('ALL - Packs', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/176543 +describe.skip('ALL - Packs', { tags: ['@ess', '@serverless'] }, () => { const integration = 'Osquery Manager'; describe( From 1c5e97774ed78249ea799c6418b9027093279796 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 30 May 2024 01:30:14 +0100 Subject: [PATCH 52/95] skip flaky suite (#157623) --- .../apps/triggers_actions_ui/rules_list/rules_list.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/rules_list/rules_list.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/rules_list/rules_list.ts index e3324ccbc000a..06ccb3990b69f 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/rules_list/rules_list.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/rules_list/rules_list.ts @@ -49,7 +49,8 @@ export default ({ getPageObjects, getPageObject, getService }: FtrProviderContex return summary; }; - describe('rules list', function () { + // FLAKY: https://github.com/elastic/kibana/issues/157623 + describe.skip('rules list', function () { const assertRulesLength = async (length: number) => { return await retry.try(async () => { const rules = await pageObjects.triggersActionsUI.getAlertsList(); From e7076e3fe76832b4aa5fdd57860ec52dd432542a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 30 May 2024 01:31:50 +0100 Subject: [PATCH 53/95] skip flaky suite (#177223) --- .../trial_license_complete_tier/get_rule_execution_results.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_management/trial_license_complete_tier/get_rule_execution_results.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_management/trial_license_complete_tier/get_rule_execution_results.ts index 45280cd0ec51c..e35ffcc4e126a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_management/trial_license_complete_tier/get_rule_execution_results.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_management/trial_license_complete_tier/get_rule_execution_results.ts @@ -52,7 +52,7 @@ export default ({ getService }: FtrProviderContext) => { // FLAKY: https://github.com/elastic/kibana/issues/177223 // Failing: See https://github.com/elastic/kibana/issues/177223 - describe('@ess @serverless Get Rule Execution Results', () => { + describe.skip('@ess @serverless Get Rule Execution Results', () => { before(async () => { await esArchiver.load(auditbeatPath); await esArchiver.load('x-pack/test/functional/es_archives/security_solution/alias'); From 1a9c92ec95bff2c1834017b0aee6456eea6ad472 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Wed, 29 May 2024 21:35:10 -0400 Subject: [PATCH 54/95] [Response Ops][Alerting] Delete associated backfill jobs when a rule is deleted (#183770) Resolves https://github.com/elastic/kibana/issues/182240 ## Summary Queries for and deletes any pending backfill tasks for a rule when a rule is deleted. ## To Verify 1. Create a detection rule 2. Schedule a backfill for the rule with a long time interval that will take a while to run ``` POST /internal/alerting/rules/backfill/_schedule [ { "rule_id": , "start": "2024-05-01T12:00:00.000Z", "end": "2024-05-10T12:00:00.000Z", } ] ``` 3. Make sure you can retrieve the backfill info: `GET kbn:/internal/alerting/rules/backfill/{backfillId}` 4. Delete the rule via the UI or API 5. Try to get the backfill info again. The job should be deleted --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../bulk_delete/bulk_delete_rules.test.ts | 27 +- .../methods/bulk_delete/bulk_delete_rules.ts | 5 + .../rule/methods/delete/delete_rule.test.ts | 21 +- .../rule/methods/delete/delete_rule.ts | 5 + .../backfill_client/backfill_client.mock.ts | 1 + .../backfill_client/backfill_client.test.ts | 320 ++++++++++++++++++ .../server/backfill_client/backfill_client.ts | 70 ++++ .../group1/tests/alerting/backfill/api_key.ts | 40 ++- .../tests/alerting/backfill/delete_rule.ts | 198 +++++++++++ .../group1/tests/alerting/backfill/index.ts | 1 + 10 files changed, 681 insertions(+), 7 deletions(-) create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete_rule.ts diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts index 143e84dc24b64..b72ace206ed68 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts @@ -67,6 +67,7 @@ const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const logger = loggerMock.create(); const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); +const backfillClient = backfillClientMock.create(); const kibanaVersion = 'v8.2.0'; const createAPIKeyMock = jest.fn(); @@ -95,7 +96,7 @@ const rulesClientParams: jest.Mocked = { isSystemAction: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, - backfillClient: backfillClientMock.create(), + backfillClient, uiSettings: uiSettingsServiceMock.createStartContract(), }; @@ -206,6 +207,12 @@ describe('bulkDelete', () => { expect(taskManager.bulkRemove).toHaveBeenCalledTimes(1); expect(taskManager.bulkRemove).toHaveBeenCalledWith(['id1', 'id2']); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledTimes(1); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledWith({ + ruleIds: ['id1', 'id2'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledTimes(1); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledWith( { apiKeys: ['MTIzOmFiYw==', 'MzIxOmFiYw=='] }, @@ -242,6 +249,12 @@ describe('bulkDelete', () => { expect(taskManager.bulkRemove).toHaveBeenCalledTimes(1); expect(taskManager.bulkRemove).toHaveBeenCalledWith(['id1', 'id3']); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledTimes(1); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledWith({ + ruleIds: ['id1', 'id3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledTimes(1); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledWith( { apiKeys: ['MTIzOmFiYw=='] }, @@ -306,6 +319,12 @@ describe('bulkDelete', () => { expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledTimes(4); expect(taskManager.bulkRemove).toHaveBeenCalledTimes(1); expect(taskManager.bulkRemove).toHaveBeenCalledWith(['id1']); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledTimes(1); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledWith({ + ruleIds: ['id1'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledTimes(1); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledWith( { apiKeys: ['MTIzOmFiYw=='] }, @@ -364,6 +383,12 @@ describe('bulkDelete', () => { expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledTimes(2); expect(taskManager.bulkRemove).toHaveBeenCalledTimes(1); expect(taskManager.bulkRemove).toHaveBeenCalledWith(['id1', 'id2']); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledTimes(1); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledWith({ + ruleIds: ['id1', 'id2'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledTimes(1); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledWith( { apiKeys: ['MTIzOmFiYw==', 'MzIxOmFiYw=='] }, diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts index 81f0b3b0f9e58..ab916c5f4e943 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts @@ -85,6 +85,11 @@ export const bulkDeleteRules = async ( logger: context.logger, taskManager: context.taskManager, }), + context.backfillClient.deleteBackfillForRules({ + ruleIds: rules.map(({ id }) => id), + namespace: context.namespace, + unsecuredSavedObjectsClient: context.unsecuredSavedObjectsClient, + }), bulkMarkApiKeysForInvalidation( { apiKeys: apiKeysToInvalidate }, context.logger, diff --git a/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.test.ts index 8d96334ca8713..caf61d8901d0d 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.test.ts @@ -52,6 +52,7 @@ const authorization = alertingAuthorizationMock.create(); const actionsAuthorization = actionsAuthorizationMock.create(); const auditLogger = auditLoggerMock.create(); const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); +const backfillClient = backfillClientMock.create(); const kibanaVersion = 'v7.10.0'; const rulesClientParams: jest.Mocked = { @@ -78,7 +79,7 @@ const rulesClientParams: jest.Mocked = { connectorAdapterRegistry: new ConnectorAdapterRegistry(), getAlertIndicesAlias: jest.fn(), alertsService: null, - backfillClient: backfillClientMock.create(), + backfillClient, uiSettings: uiSettingsServiceMock.createStartContract(), isSystemAction: jest.fn(), }; @@ -146,6 +147,11 @@ describe('delete()', () => { undefined ); expect(taskManager.removeIfExists).toHaveBeenCalledWith('task-123'); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledWith({ + ruleIds: ['1'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledTimes(1); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledWith( { apiKeys: ['MTIzOmFiYw=='] }, @@ -173,6 +179,11 @@ describe('delete()', () => { undefined ); expect(taskManager.removeIfExists).toHaveBeenCalledWith('task-123'); + expect(backfillClient.deleteBackfillForRules).toHaveBeenCalledWith({ + ruleIds: ['1'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith( RULE_SAVED_OBJECT_TYPE, @@ -262,6 +273,14 @@ describe('delete()', () => { ); }); + test('throws error when backfillClient.deleteBackfillForRules throws an error', async () => { + backfillClient.deleteBackfillForRules.mockRejectedValue(new Error('backfill Fail')); + + await expect(rulesClient.delete({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"backfill Fail"` + ); + }); + describe('legacy actions migration for SIEM', () => { test('should call migrateLegacyActions', async () => { const existingDecryptedSiemAlert = { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts index 75163b8dff5cb..4f0c7810486fe 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts @@ -114,6 +114,11 @@ async function deleteRuleWithOCC(context: RulesClientContext, { id }: { id: stri await Promise.all([ taskIdToRemove ? context.taskManager.removeIfExists(taskIdToRemove) : null, + context.backfillClient.deleteBackfillForRules({ + ruleIds: [id], + namespace: context.namespace, + unsecuredSavedObjectsClient: context.unsecuredSavedObjectsClient, + }), apiKeyToInvalidate && !apiKeyCreatedByUser ? bulkMarkApiKeysForInvalidation( { apiKeys: [apiKeyToInvalidate] }, diff --git a/x-pack/plugins/alerting/server/backfill_client/backfill_client.mock.ts b/x-pack/plugins/alerting/server/backfill_client/backfill_client.mock.ts index f42cbb06f142a..36919208b608d 100644 --- a/x-pack/plugins/alerting/server/backfill_client/backfill_client.mock.ts +++ b/x-pack/plugins/alerting/server/backfill_client/backfill_client.mock.ts @@ -8,6 +8,7 @@ const createBackfillClientMock = () => { return jest.fn().mockImplementation(() => { return { bulkQueue: jest.fn(), + deleteBackfillForRules: jest.fn(), }; }); }; diff --git a/x-pack/plugins/alerting/server/backfill_client/backfill_client.test.ts b/x-pack/plugins/alerting/server/backfill_client/backfill_client.test.ts index 096d7ddb2e445..02505a5af84bb 100644 --- a/x-pack/plugins/alerting/server/backfill_client/backfill_client.test.ts +++ b/x-pack/plugins/alerting/server/backfill_client/backfill_client.test.ts @@ -172,6 +172,21 @@ function getBulkCreateParam( }; } +const mockCreatePointInTimeFinderAsInternalUser = ( + response = { + saved_objects: [ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, attributes: getMockAdHocRunAttributes() }, + ], + } +) => { + unsecuredSavedObjectsClient.createPointInTimeFinder = jest.fn().mockResolvedValue({ + close: jest.fn(), + find: function* asyncGenerator() { + yield response; + }, + }); +}; + describe('BackfillClient', () => { let backfillClient: BackfillClient; @@ -855,4 +870,309 @@ describe('BackfillClient', () => { ]); }); }); + + describe('deleteBackfillForRules()', () => { + test('should successfully delete backfill for single rule', async () => { + mockCreatePointInTimeFinderAsInternalUser(); + unsecuredSavedObjectsClient.bulkDelete.mockResolvedValueOnce({ + statuses: [{ id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }], + }); + taskManagerStart.bulkRemove.mockResolvedValueOnce({ + statuses: [{ id: 'abc', type: 'task', success: true }], + }); + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + perPage: 100, + hasReference: [{ id: '1', type: RULE_SAVED_OBJECT_TYPE }], + namespaces: ['default'], + }); + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).toHaveBeenCalledWith(['abc']); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + test('should successfully delete multiple backfill for single rule', async () => { + mockCreatePointInTimeFinderAsInternalUser({ + saved_objects: [ + { + id: 'abc', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + { + id: 'def', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + ], + }); + unsecuredSavedObjectsClient.bulkDelete.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + ], + }); + taskManagerStart.bulkRemove.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: 'task', success: true }, + { id: 'def', type: 'task', success: true }, + ], + }); + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1'], + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + perPage: 100, + hasReference: [{ id: '1', type: RULE_SAVED_OBJECT_TYPE }], + }); + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).toHaveBeenCalledWith(['abc', 'def']); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + test('should successfully delete backfill for multiple rules', async () => { + mockCreatePointInTimeFinderAsInternalUser({ + saved_objects: [ + { + id: 'abc', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + { + id: 'def', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + ], + }); + unsecuredSavedObjectsClient.bulkDelete.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + ], + }); + taskManagerStart.bulkRemove.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: 'task', success: true }, + { id: 'def', type: 'task', success: true }, + ], + }); + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + perPage: 100, + hasReference: [ + { id: '1', type: RULE_SAVED_OBJECT_TYPE }, + { id: '2', type: RULE_SAVED_OBJECT_TYPE }, + { id: '3', type: RULE_SAVED_OBJECT_TYPE }, + ], + namespaces: ['default'], + }); + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).toHaveBeenCalledWith(['abc', 'def']); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + test('should not delete backfill if none found to delete', async () => { + mockCreatePointInTimeFinderAsInternalUser({ saved_objects: [] }); + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.createPointInTimeFinder).toHaveBeenCalledWith({ + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + perPage: 100, + hasReference: [ + { id: '1', type: RULE_SAVED_OBJECT_TYPE }, + { id: '2', type: RULE_SAVED_OBJECT_TYPE }, + { id: '3', type: RULE_SAVED_OBJECT_TYPE }, + ], + namespaces: ['default'], + }); + expect(unsecuredSavedObjectsClient.bulkDelete).not.toHaveBeenCalled(); + expect(taskManagerStart.bulkRemove).not.toHaveBeenCalled(); + }); + + test('should handle errors from createPointInTimeFinder', async () => { + unsecuredSavedObjectsClient.createPointInTimeFinder = jest + .fn() + .mockRejectedValueOnce(new Error('error!')); + + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.bulkDelete).not.toHaveBeenCalled(); + expect(taskManagerStart.bulkRemove).not.toHaveBeenCalled(); + expect(logger.warn).toHaveBeenCalledWith( + `Error deleting backfill jobs for rule IDs: 1,2,3 - error!` + ); + }); + + test('should handle errors from bulkDelete', async () => { + mockCreatePointInTimeFinderAsInternalUser(); + unsecuredSavedObjectsClient.bulkDelete.mockRejectedValueOnce(new Error('delete error!')); + + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(logger.warn).toHaveBeenCalledWith( + `Error deleting backfill jobs for rule IDs: 1,2,3 - delete error!` + ); + + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).not.toHaveBeenCalled(); + }); + + test('should handle errors from bulkRemove', async () => { + mockCreatePointInTimeFinderAsInternalUser(); + unsecuredSavedObjectsClient.bulkDelete.mockResolvedValueOnce({ + statuses: [{ id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }], + }); + taskManagerStart.bulkRemove.mockRejectedValueOnce(new Error('delete task error!')); + + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(logger.warn).toHaveBeenCalledWith( + `Error deleting backfill jobs for rule IDs: 1,2,3 - delete task error!` + ); + + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).toHaveBeenCalledWith(['abc']); + }); + + test('should handle individual errors from bulkDelete', async () => { + mockCreatePointInTimeFinderAsInternalUser({ + saved_objects: [ + { + id: 'abc', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + { + id: 'def', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + ], + }); + unsecuredSavedObjectsClient.bulkDelete.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + { + id: 'def', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + success: false, + error: { error: 'Error', message: 'delete failed', statusCode: 409 }, + }, + ], + }); + taskManagerStart.bulkRemove.mockResolvedValueOnce({ + statuses: [{ id: 'abc', type: 'task', success: true }], + }); + + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).toHaveBeenCalledWith(['abc']); + + expect(logger.warn).toHaveBeenCalledWith( + `Error deleting backfill jobs with IDs: def with errors: delete failed - jobs and associated task were not deleted.` + ); + }); + + test('should handle individual errors from bulkRemove', async () => { + mockCreatePointInTimeFinderAsInternalUser({ + saved_objects: [ + { + id: 'abc', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + { + id: 'def', + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + attributes: getMockAdHocRunAttributes(), + }, + ], + }); + unsecuredSavedObjectsClient.bulkDelete.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE, success: true }, + ], + }); + taskManagerStart.bulkRemove.mockResolvedValueOnce({ + statuses: [ + { id: 'abc', type: 'task', success: true }, + { + id: 'def', + type: 'task', + success: false, + error: { error: 'Error', message: 'delete failed', statusCode: 409 }, + }, + ], + }); + + await backfillClient.deleteBackfillForRules({ + ruleIds: ['1', '2', '3'], + namespace: 'default', + unsecuredSavedObjectsClient, + }); + + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ + { id: 'abc', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + { id: 'def', type: AD_HOC_RUN_SAVED_OBJECT_TYPE }, + ]); + expect(taskManagerStart.bulkRemove).toHaveBeenCalledWith(['abc', 'def']); + + expect(logger.warn).toHaveBeenCalledWith( + `Error deleting tasks with IDs: def with errors: delete failed` + ); + }); + }); }); diff --git a/x-pack/plugins/alerting/server/backfill_client/backfill_client.ts b/x-pack/plugins/alerting/server/backfill_client/backfill_client.ts index 7b4c7aeea225d..5e6de1941c324 100644 --- a/x-pack/plugins/alerting/server/backfill_client/backfill_client.ts +++ b/x-pack/plugins/alerting/server/backfill_client/backfill_client.ts @@ -12,6 +12,7 @@ import { SavedObjectsBulkCreateObject, SavedObjectsClientContract, SavedObjectsErrorHelpers, + SavedObjectsFindResult, } from '@kbn/core/server'; import { AuditLogger } from '@kbn/security-plugin/server'; import { @@ -60,6 +61,12 @@ interface BulkQueueOpts { unsecuredSavedObjectsClient: SavedObjectsClientContract; } +interface DeleteBackfillForRulesOpts { + ruleIds: string[]; + namespace?: string; + unsecuredSavedObjectsClient: SavedObjectsClientContract; +} + export class BackfillClient { private logger: Logger; private readonly taskManagerStartPromise: Promise; @@ -229,6 +236,69 @@ export class BackfillClient { return createSOResult; } + + public async deleteBackfillForRules({ + ruleIds, + namespace, + unsecuredSavedObjectsClient, + }: DeleteBackfillForRulesOpts) { + try { + // query for all ad hoc runs that reference this ruleId + const adHocRunFinder = await unsecuredSavedObjectsClient.createPointInTimeFinder({ + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + perPage: 100, + hasReference: ruleIds.map((ruleId) => ({ id: ruleId, type: RULE_SAVED_OBJECT_TYPE })), + ...(namespace ? { namespaces: [namespace] } : undefined), + }); + + const adHocRuns: Array> = []; + for await (const response of adHocRunFinder.find()) { + adHocRuns.push(...response.saved_objects); + } + await adHocRunFinder.close(); + + if (adHocRuns.length > 0) { + const deleteResult = await unsecuredSavedObjectsClient.bulkDelete( + adHocRuns.map((adHocRun) => ({ + id: adHocRun.id, + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, + })) + ); + + const deleteErrors = deleteResult.statuses.filter((status) => !!status.error); + if (deleteErrors.length > 0) { + this.logger.warn( + `Error deleting backfill jobs with IDs: ${deleteErrors + .map((status) => status.id) + .join(', ')} with errors: ${deleteErrors.map( + (status) => status.error?.message + )} - jobs and associated task were not deleted.` + ); + } + + // only delete tasks if the associated ad hoc runs were successfully deleted + const taskIdsToDelete = deleteResult.statuses + .filter((status) => status.success) + .map((status) => status.id); + + // delete the associated tasks + const taskManager = await this.taskManagerStartPromise; + const deleteTaskResult = await taskManager.bulkRemove(taskIdsToDelete); + const deleteTaskErrors = deleteTaskResult.statuses.filter((status) => !!status.error); + if (deleteTaskErrors.length > 0) { + this.logger.warn( + `Error deleting tasks with IDs: ${deleteTaskErrors + .map((status) => status.id) + .join(', ')} with errors: ${deleteTaskErrors.map((status) => status.error?.message)}` + ); + } + } + } catch (error) { + this.logger.warn( + `Error deleting backfill jobs for rule IDs: ${ruleIds.join(',')} - ${error.message}` + ); + } + } } function getRuleOrError( diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts index b079571b26224..2bbdabbf03c18 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts @@ -10,7 +10,10 @@ import moment from 'moment'; import { ALERTING_CASES_SAVED_OBJECT_INDEX, SavedObject } from '@kbn/core-saved-objects-server'; import { AdHocRunSO } from '@kbn/alerting-plugin/server/data/ad_hoc_run/types'; import { get } from 'lodash'; -import { AD_HOC_RUN_SAVED_OBJECT_TYPE } from '@kbn/alerting-plugin/server/saved_objects'; +import { + AD_HOC_RUN_SAVED_OBJECT_TYPE, + RULE_SAVED_OBJECT_TYPE, +} from '@kbn/alerting-plugin/server/saved_objects'; import { IValidatedEvent } from '@kbn/event-log-plugin/server'; import { SuperuserAtSpace1 } from '../../../../scenarios'; import { @@ -35,7 +38,9 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) await runInvalidateTask(); }); - after(() => objectRemover.removeAll()); + afterEach(async () => { + await objectRemover.removeAll(); + }); async function getAdHocRunSO(id: string) { const result = await es.get({ @@ -132,6 +137,7 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) .send(getRule()) .expect(200); const ruleId1 = rresponse1.body.id; + objectRemover.add(spaceId, ruleId1, 'rule', 'alerting'); const rresponse2 = await supertestWithoutAuth .post(`${getUrlPrefix(spaceId)}/api/alerting/rule`) @@ -140,6 +146,29 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) .send(getRule()) .expect(200); const ruleId2 = rresponse2.body.id; + objectRemover.add(spaceId, ruleId2, 'rule', 'alerting'); + + // wait for each rule to run once + await retry.try(async () => { + return await getEventLog({ + getService, + spaceId, + type: RULE_SAVED_OBJECT_TYPE, + id: ruleId1, + provider: 'alerting', + actions: new Map([['execute', { equal: 1 }]]), + }); + }); + await retry.try(async () => { + return await getEventLog({ + getService, + spaceId, + type: RULE_SAVED_OBJECT_TYPE, + id: ruleId2, + provider: 'alerting', + actions: new Map([['execute', { equal: 1 }]]), + }); + }); // schedule backfill for rule 1 const response = await supertestWithoutAuth @@ -176,14 +205,15 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) currentStart = runAt; }); - // delete both rules which will mark the api keys for invalidation + // update API key both rules which will mark the api keys for invalidation await supertestWithoutAuth - .delete(`${getUrlPrefix(spaceId)}/api/alerting/rule/${ruleId1}`) + .post(`${getUrlPrefix(spaceId)}/api/alerting/rule/${ruleId1}/_update_api_key`) .set('kbn-xsrf', 'foo') .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) .expect(204); + await supertestWithoutAuth - .delete(`${getUrlPrefix(spaceId)}/api/alerting/rule/${ruleId2}`) + .post(`${getUrlPrefix(spaceId)}/api/alerting/rule/${ruleId2}/_update_api_key`) .set('kbn-xsrf', 'foo') .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) .expect(204); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete_rule.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete_rule.ts new file mode 100644 index 0000000000000..d0f3fdf92280b --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete_rule.ts @@ -0,0 +1,198 @@ +/* + * 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 moment from 'moment'; +import { ALERTING_CASES_SAVED_OBJECT_INDEX, SavedObject } from '@kbn/core-saved-objects-server'; +import { AdHocRunSO } from '@kbn/alerting-plugin/server/data/ad_hoc_run/types'; +import { get } from 'lodash'; +import { SuperuserAtSpace1 } from '../../../../scenarios'; +import { + getTestRuleData, + getUrlPrefix, + ObjectRemover, + TaskManagerDoc, +} from '../../../../../common/lib'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function deleteRuleForBackfillTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const es = getService('es'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + describe('delete rule with backfills', () => { + const objectRemover = new ObjectRemover(supertest); + + after(() => objectRemover.removeAll()); + + async function getAdHocRunSO(id: string) { + const result = await es.get({ + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + id: `ad_hoc_run_params:${id}`, + }); + return result._source; + } + + async function getScheduledTask(id: string): Promise { + const scheduledTask = await es.get({ + id: `task:${id}`, + index: '.kibana_task_manager', + }); + return scheduledTask._source!; + } + + function getRule(overwrites = {}) { + return getTestRuleData({ + rule_type_id: 'test.patternFiringAutoRecoverFalse', + params: { + pattern: { + instance: [true, false, true], + }, + }, + schedule: { interval: '12h' }, + ...overwrites, + }); + } + + it('should delete backfills for rules when originating rule is deleted', async () => { + const start1 = moment().utc().startOf('day').subtract(20, 'days').toISOString(); + const end1 = moment().utc().startOf('day').subtract(1, 'day').toISOString(); + const start2 = moment().utc().startOf('day').subtract(40, 'days').toISOString(); + const end2 = moment().utc().startOf('day').subtract(22, 'day').toISOString(); + const spaceId = SuperuserAtSpace1.space.id; + + // create 2 rules + const rresponse1 = await supertestWithoutAuth + .post(`${getUrlPrefix(spaceId)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) + .send(getRule()) + .expect(200); + const ruleId1 = rresponse1.body.id; + + const rresponse2 = await supertestWithoutAuth + .post(`${getUrlPrefix(spaceId)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) + .send(getRule()) + .expect(200); + const ruleId2 = rresponse2.body.id; + + // schedule backfills + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(spaceId)}/internal/alerting/rules/backfill/_schedule`) + .set('kbn-xsrf', 'foo') + .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) + .send([ + { rule_id: ruleId1, start: start1, end: end1 }, + { rule_id: ruleId1, start: start2, end: end2 }, + { rule_id: ruleId2, start: start1, end: end1 }, + ]) + .expect(200); + + const result = response.body; + expect(result.length).to.eql(3); + const backfillId1 = result[0].id; + const backfillId2 = result[1].id; + const backfillId3 = result[2].id; + + // check that the ad hoc run SOs were created + const adHocRunSO1 = (await getAdHocRunSO(backfillId1)) as SavedObject; + const adHocRun1: AdHocRunSO = get(adHocRunSO1, 'ad_hoc_run_params'); + expect(adHocRun1).not.to.be(undefined); + const adHocRunSO2 = (await getAdHocRunSO(backfillId2)) as SavedObject; + const adHocRun2: AdHocRunSO = get(adHocRunSO2, 'ad_hoc_run_params'); + expect(adHocRun2).not.to.be(undefined); + const adHocRunSO3 = (await getAdHocRunSO(backfillId3)) as SavedObject; + const adHocRun3: AdHocRunSO = get(adHocRunSO3, 'ad_hoc_run_params'); + expect(adHocRun3).not.to.be(undefined); + + // check that the scheduled tasks were created + const taskRecord1 = await getScheduledTask(backfillId1); + expect(taskRecord1.type).to.eql('task'); + expect(taskRecord1.task.taskType).to.eql('ad_hoc_run-backfill'); + expect(taskRecord1.task.enabled).to.eql(true); + expect(JSON.parse(taskRecord1.task.params)).to.eql({ + adHocRunParamsId: backfillId1, + spaceId, + }); + const taskRecord2 = await getScheduledTask(backfillId2); + expect(taskRecord2.type).to.eql('task'); + expect(taskRecord2.task.taskType).to.eql('ad_hoc_run-backfill'); + expect(taskRecord2.task.enabled).to.eql(true); + expect(JSON.parse(taskRecord2.task.params)).to.eql({ + adHocRunParamsId: backfillId2, + spaceId, + }); + const taskRecord3 = await getScheduledTask(backfillId3); + expect(taskRecord3.type).to.eql('task'); + expect(taskRecord3.task.taskType).to.eql('ad_hoc_run-backfill'); + expect(taskRecord3.task.enabled).to.eql(true); + expect(JSON.parse(taskRecord3.task.params)).to.eql({ + adHocRunParamsId: backfillId3, + spaceId, + }); + + // delete both rules which should delete the backfills + await supertestWithoutAuth + .delete(`${getUrlPrefix(spaceId)}/api/alerting/rule/${ruleId1}`) + .set('kbn-xsrf', 'foo') + .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) + .expect(204); + await supertestWithoutAuth + .delete(`${getUrlPrefix(spaceId)}/api/alerting/rule/${ruleId2}`) + .set('kbn-xsrf', 'foo') + .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) + .expect(204); + + // ensure the ad hoc run SOs were deleted + try { + await getAdHocRunSO(backfillId1); + throw new Error(`Should have removed ad hoc run with id ${backfillId1}`); + } catch (e) { + expect(e.meta.statusCode).to.eql(404); + } + + try { + await getAdHocRunSO(backfillId2); + throw new Error(`Should have removed ad hoc run with id ${backfillId2}`); + } catch (e) { + expect(e.meta.statusCode).to.eql(404); + } + + try { + await getAdHocRunSO(backfillId3); + throw new Error(`Should have removed ad hoc run with id ${backfillId3}`); + } catch (e) { + expect(e.meta.statusCode).to.eql(404); + } + + // ensure the tasks were deleted + try { + await getScheduledTask(backfillId1); + throw new Error(`Should have removed task with id ${backfillId1}`); + } catch (e) { + expect(e.meta.statusCode).to.eql(404); + } + + try { + await getScheduledTask(backfillId2); + throw new Error(`Should have removed tas with id ${backfillId2}`); + } catch (e) { + expect(e.meta.statusCode).to.eql(404); + } + + try { + await getScheduledTask(backfillId3); + throw new Error(`Should have removed task with id ${backfillId3}`); + } catch (e) { + expect(e.meta.statusCode).to.eql(404); + } + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/index.ts index ee2e5b9decdb7..d7fe17b4aa1f5 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/index.ts @@ -15,6 +15,7 @@ export default function backfillTests({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./get')); loadTestFile(require.resolve('./find')); loadTestFile(require.resolve('./delete')); + loadTestFile(require.resolve('./delete_rule')); loadTestFile(require.resolve('./task_runner')); }); } From de477ed631a0e3645b7ac02cb10f6005d9497dd3 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Wed, 29 May 2024 22:29:04 -0500 Subject: [PATCH 55/95] [Security Solution] - remove tGridEventRenderedViewEnabled feature flag (#184479) --- .../common/experimental_features.ts | 1 - .../components/events_viewer/right_top_menu.tsx | 16 +++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index c3b6a09470a8a..8180f78117644 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -13,7 +13,6 @@ export type ExperimentalFeatures = { [K in keyof typeof allowedExperimentalValue */ export const allowedExperimentalValues = Object.freeze({ tGridEnabled: true, - tGridEventRenderedViewEnabled: true, // FIXME:PT delete? excludePoliciesInFilterEnabled: false, diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/right_top_menu.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/right_top_menu.tsx index 0edc920294e14..40c6181f43a29 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/right_top_menu.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/right_top_menu.tsx @@ -10,7 +10,6 @@ import { TableId } from '@kbn/securitysolution-data-table'; import React, { useMemo } from 'react'; import type { CSSProperties } from 'styled-components'; import styled from 'styled-components'; -import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; import { InspectButton } from '../inspect'; import { UpdatedFlexGroup, UpdatedFlexItem } from './styles'; import { SummaryViewSelector } from './summary_view_select'; @@ -47,10 +46,6 @@ export const RightTopMenu = ({ const alignItems = tableView === 'gridView' ? 'baseline' : 'center'; const justTitle = useMemo(() => {title}, [title]); - const tGridEventRenderedViewEnabled = useIsExperimentalFeatureEnabled( - 'tGridEventRenderedViewEnabled' - ); - const menuOptions = useMemo( () => additionalMenuOptions.length @@ -82,12 +77,11 @@ export const RightTopMenu = ({ {additionalFilters} - {tGridEventRenderedViewEnabled && - [TableId.alertsOnRuleDetailsPage, TableId.alertsOnAlertsPage].includes(tableId) && ( - - - - )} + {[TableId.alertsOnRuleDetailsPage, TableId.alertsOnAlertsPage].includes(tableId) && ( + + + + )} {menuOptions} ); From f972a1bdcf0295bbaaf1ad7dba69271bed0efc0f Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Wed, 29 May 2024 23:55:13 -0500 Subject: [PATCH 56/95] [search source] Simplify / refactor flatten method - Part 2 (#184286) ## Summary Follow up to https://github.com/elastic/kibana/pull/183107 The SearchSource flatten method does a lot of object mutation and has a lot of long conditional statements. I'm breaking code out into functions and reducing the amount of object mutation. Changes to code logic have been kept minimal. Part of https://github.com/elastic/kibana/issues/182068 --------- Co-authored-by: Marco Liberati Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Lukas Olson --- .../src/__mocks__/data_view.ts | 2 +- .../search_source/search_source.test.ts | 25 ++ .../search/search_source/search_source.ts | 322 ++++++++++++------ src/plugins/data/tsconfig.json | 4 +- 4 files changed, 238 insertions(+), 115 deletions(-) diff --git a/packages/kbn-discover-utils/src/__mocks__/data_view.ts b/packages/kbn-discover-utils/src/__mocks__/data_view.ts index 73828c077b971..99d05640d270b 100644 --- a/packages/kbn-discover-utils/src/__mocks__/data_view.ts +++ b/packages/kbn-discover-utils/src/__mocks__/data_view.ts @@ -108,7 +108,7 @@ export const buildDataViewMock = ({ fields: dataViewFields, type: 'default', getName: () => name, - getComputedFields: () => ({ docvalueFields: [], scriptFields: {} }), + getComputedFields: () => ({ docvalueFields: [], scriptFields: {}, runtimeFields: {} }), getSourceFiltering: () => ({}), getIndexPattern: () => `${name}-title`, getFieldByName: jest.fn((fieldName: string) => dataViewFields.getByName(fieldName)), diff --git a/src/plugins/data/common/search/search_source/search_source.test.ts b/src/plugins/data/common/search/search_source/search_source.test.ts index 3d2782ce08b03..9f66e55be9f21 100644 --- a/src/plugins/data/common/search/search_source/search_source.test.ts +++ b/src/plugins/data/common/search/search_source/search_source.test.ts @@ -301,6 +301,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: ['@timestamp'], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['@timestamp']); @@ -317,6 +318,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: ['hello'], + runtimeFields: {}, }), } as unknown as DataView); // @ts-expect-error TS won't like using this field name, but technically it's possible. @@ -334,6 +336,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: [{ field: 'a', format: 'date_time' }], + runtimeFields: {}, }), } as unknown as DataView); // @ts-expect-error TS won't like using this field name, but technically it's possible. @@ -360,6 +363,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: [{ field: 'hello', format: 'date_time' }], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', [{ field: 'hello', format: 'strict_date_time' }]); @@ -376,6 +380,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: [{ field: 'hello', format: 'date_time' }], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['hello']); @@ -397,6 +402,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: [{ field: 'hello', format: 'date_time', a: 'test', b: 'test' }], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', [{ field: 'hello', a: 'a', c: 'c' }]); @@ -415,6 +421,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); // @ts-expect-error TS won't like using this field name, but technically it's possible. @@ -435,6 +442,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['hello', 'a', { field: 'c' }]); @@ -451,6 +459,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['hello', 'a', { foo: 'c' }]); @@ -467,6 +476,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fieldsFromSource', ['hello', 'a']); @@ -526,6 +536,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: ['@timestamp', 'exclude-me'], + runtimeFields: {}, }), } as unknown as DataView); // @ts-expect-error Typings for excludes filters need to be fixed. @@ -542,6 +553,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: ['@timestamp', 'foo-bar', 'foo-baz'], + runtimeFields: {}, }), } as unknown as DataView); @@ -556,6 +568,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['hello']); @@ -571,6 +584,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: [], docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', [ @@ -592,6 +606,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: [], docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['*']); @@ -607,6 +622,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: [], docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', [{ field: '*', include_unmapped: 'true' }]); @@ -622,6 +638,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: [], docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', [{ field: '*', include_unmapped: 'true' }]); @@ -644,6 +661,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['timestamp', '*']); @@ -659,6 +677,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); searchSourceDependencies.scriptedFieldsEnabled = false; @@ -677,6 +696,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: ['@timestamp'], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fieldsFromSource', [ @@ -701,6 +721,7 @@ describe('SearchSource', () => { storedFields: ['*'], scriptFields: { hello: {}, world: {} }, docvalueFields: ['@timestamp', 'date'], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['hello', '@timestamp', 'foo-a', 'bar']); @@ -747,6 +768,7 @@ describe('SearchSource', () => { storedFields: ['*'], scriptFields: { hello: {}, world: {} }, docvalueFields: ['@timestamp', 'date', 'time'], + runtimeFields: {}, }), } as unknown as DataView); searchSource.setField('fields', ['hello', '@timestamp', 'foo-a', 'bar']); @@ -770,6 +792,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: [{ field: '@timestamp' }], + runtimeFields: {}, }), fields: { getByType: () => [{ name: '@timestamp', esTypes: ['date_nanos'] }], @@ -800,6 +823,7 @@ describe('SearchSource', () => { storedFields: [], scriptFields: {}, docvalueFields: [{ field: '@timestamp' }, { field: 'custom_date' }], + runtimeFields: {}, }), fields: indexPatternFields, getSourceFiltering: () => ({ excludes: ['custom_date'] }), @@ -1003,6 +1027,7 @@ describe('SearchSource', () => { storedFields: ['*'], scriptFields: {}, docvalueFields: [], + runtimeFields: {}, }), } as unknown as DataView); const request = searchSource.getSearchRequestBody(); diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index 2fbd162bbb7d3..bcedc77846d50 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -146,6 +146,8 @@ interface ExpressionAstOptions { asDatatable?: boolean; } +const omitByIsNil = (object: Record) => omitBy(object, isNil); + /** @public **/ export class SearchSource { private id: string = uniqueId('data_source'); @@ -778,11 +780,11 @@ export class SearchSource { private flatten() { const { getConfig } = this.dependencies; + const metaFields = getConfig(UI_SETTINGS.META_FIELDS) ?? []; + const searchRequest = this.mergeProps(); searchRequest.body = searchRequest.body || {}; - const { body, index, query, filters, highlightAll } = searchRequest; - searchRequest.indexType = this.getIndexType(index); - const metaFields = getConfig(UI_SETTINGS.META_FIELDS) ?? []; + const { body, index } = searchRequest; // get some special field types from the index pattern const { docvalueFields, scriptFields, runtimeFields } = index @@ -795,109 +797,47 @@ export class SearchSource { const fieldListProvided = !!body.fields; // set defaults - let fieldsFromSource = searchRequest.fieldsFromSource || []; - body.fields = body.fields || []; - body.script_fields = this.dependencies.scriptedFieldsEnabled - ? { - ...body.script_fields, - ...scriptFields, - } - : {}; - body.stored_fields = ['*']; - body.runtime_mappings = runtimeFields || {}; - - // apply source filters from index pattern if specified by the user - let filteredDocvalueFields = docvalueFields; - if (index) { - const sourceFilters = index.getSourceFiltering(); - if (!body.hasOwnProperty('_source')) { - body._source = sourceFilters; - } - - const filter = fieldWildcardFilter(body._source.excludes, metaFields); - // also apply filters to provided fields & default docvalueFields - body.fields = body.fields.filter((fld: SearchFieldValue) => filter(this.getFieldName(fld))); - fieldsFromSource = fieldsFromSource.filter((fld: SearchFieldValue) => - filter(this.getFieldName(fld)) - ); - filteredDocvalueFields = filteredDocvalueFields.filter((fld: SearchFieldValue) => - filter(this.getFieldName(fld)) - ); - } - - // specific fields were provided, so we need to exclude any others - if (fieldListProvided || fieldsFromSource.length) { - const bodyFieldNames = body.fields.map((field: SearchFieldValue) => this.getFieldName(field)); - const uniqFieldNames = [...new Set([...bodyFieldNames, ...fieldsFromSource])]; - - if (!uniqFieldNames.includes('*')) { - // filter down script_fields to only include items specified - body.script_fields = pick( - body.script_fields, - Object.keys(body.script_fields).filter((f) => uniqFieldNames.includes(f)) - ); - } - - // request the remaining fields from stored_fields just in case, since the - // fields API does not handle stored fields - const remainingFields = difference(uniqFieldNames, [ - ...Object.keys(body.script_fields), - ...Object.keys(body.runtime_mappings), - ]).filter((remainingField) => { - if (!remainingField) return false; - if (!body._source || !body._source.excludes) return true; - return !body._source.excludes.includes(remainingField); - }); - - body.stored_fields = [...new Set(remainingFields)]; - // only include unique values - if (fieldsFromSource.length) { - if (!isEqual(remainingFields, fieldsFromSource)) { - setWith(body, '_source.includes', remainingFields, (nsValue) => - isObject(nsValue) ? {} : nsValue - ); - } - // if items that are in the docvalueFields are provided, we should - // make sure those are added to the fields API unless they are - // already set in docvalue_fields - body.fields = [ - ...body.fields, - ...filteredDocvalueFields.filter((fld: SearchFieldValue) => { - return ( - fieldsFromSource.includes(this.getFieldName(fld)) && - !(body.docvalue_fields || []) - .map((d: string | Record) => this.getFieldName(d)) - .includes(this.getFieldName(fld)) - ); - }), - ]; - - // delete fields array if it is still set to the empty default - if (!fieldListProvided && body.fields.length === 0) delete body.fields; - } else { - // remove _source, since everything's coming from fields API, scripted, or stored fields - body._source = false; + const _source = + index && !body.hasOwnProperty('_source') ? index.getSourceFiltering() : body._source; - body.fields = this.getUniqueFields({ - index, - fields: body.fields, - metaFields, - filteredDocvalueFields, - }); - } - } else { - body.fields = filteredDocvalueFields; - } + // get filter if data view specified, otherwise null filter + const filter = this.getFieldFilter({ bodySourceExcludes: _source?.excludes, metaFields }); - // If sorting by _score, build queries in the "must" clause instead of "filter" clause to enable scoring - const filtersInMustClause = (body.sort ?? []).some((sort: EsQuerySortValue[]) => - sort.hasOwnProperty('_score') - ); - const esQueryConfigs = { - ...getEsQueryConfig({ get: getConfig }), - filtersInMustClause, - }; - body.query = buildEsQuery(index, query, filters, esQueryConfigs); + const fieldsFromSource = filter(searchRequest.fieldsFromSource || []); + // apply source filters from index pattern if specified by the user + const filteredDocvalueFields = filter(docvalueFields); + + const sourceFieldsProvided = !!fieldsFromSource.length; + + const fields = + fieldListProvided || sourceFieldsProvided + ? filter(body.fields || []) + : filteredDocvalueFields; + + const uniqFieldNames = this.getUniqueFieldNames({ fields, fieldsFromSource }); + + const scriptedFields = (() => { + const flds = this.dependencies.scriptedFieldsEnabled + ? { ...body.script_fields, ...scriptFields } + : {}; + + // specific fields were provided, so we need to exclude any others + return fieldListProvided || sourceFieldsProvided + ? this.filterScriptFields({ + uniqFieldNames, + scriptFields: flds, + }) + : flds; + })(); + + // request the remaining fields from stored_fields just in case, since the + // fields API does not handle stored fields + const remainingFields = this.getRemainingFields({ + uniqFieldNames, + scriptFields: scriptedFields, + runtimeFields, + _source, + }); // For testing shard failure messages in the UI, follow these steps: // 1. Add all three sample data sets (flights, ecommerce, logs) to Kibana. @@ -918,19 +858,177 @@ export class SearchSource { // }); // Alternatively you could also add this query via "Edit as Query DSL", then it needs no code to be changed - if (highlightAll && body.query) { - body.highlight = getHighlightRequest(getConfig(UI_SETTINGS.DOC_HIGHLIGHT)); - delete searchRequest.highlightAll; + body._source = _source; + + // only include unique values + if (sourceFieldsProvided && !isEqual(remainingFields, fieldsFromSource)) { + setWith(body, '_source.includes', remainingFields, (nsValue) => { + return isObject(nsValue) ? {} : nsValue; + }); } - const omitByIsNil = (object: Record) => omitBy(object, isNil); + const builtQuery = this.getBuiltEsQuery({ + index, + query: searchRequest.query, + filters: searchRequest.filters, + getConfig, + sort: body.sort, + }); const bodyToReturn = { ...searchRequest.body, pit: searchRequest.pit, + query: builtQuery, + highlight: + searchRequest.highlightAll && builtQuery + ? getHighlightRequest(getConfig(UI_SETTINGS.DOC_HIGHLIGHT)) + : undefined, + // remove _source, since everything's coming from fields API, scripted, or stored fields + _source: fieldListProvided && !sourceFieldsProvided ? false : body._source, + stored_fields: + fieldListProvided || sourceFieldsProvided ? [...new Set(remainingFields)] : ['*'], + runtime_mappings: runtimeFields, + script_fields: scriptedFields, + fields: this.getFieldsList({ + index, + fields, + docvalueFields: body.docvalue_fields, + fieldsFromSource, + // @ts-expect-error - Needs closer look to fix + filteredDocvalueFields, + metaFields, + fieldListProvided, + sourceFieldsProvided, + }), }; - return omitByIsNil({ ...searchRequest, body: omitByIsNil(bodyToReturn) }) as SearchRequest; + return omitByIsNil({ + ...searchRequest, + body: omitByIsNil(bodyToReturn), + indexType: this.getIndexType(index), + highlightAll: + searchRequest.highlightAll && builtQuery ? undefined : searchRequest.highlightAll, + }); + } + + private getFieldFilter({ + bodySourceExcludes, + metaFields, + }: { + bodySourceExcludes: string[]; + metaFields: string[]; + }) { + const filter = fieldWildcardFilter(bodySourceExcludes, metaFields); + return (fieldsToFilter: SearchFieldValue[]) => + fieldsToFilter.filter((fld) => filter(this.getFieldName(fld))); + } + + private getUniqueFieldNames({ + fields, + fieldsFromSource, + }: { + fields: SearchFieldValue[]; + fieldsFromSource: SearchFieldValue[]; + }) { + const bodyFieldNames = fields.map((field: SearchFieldValue) => this.getFieldName(field)); + return [...new Set([...bodyFieldNames, ...fieldsFromSource])]; + } + + private filterScriptFields({ + uniqFieldNames, + scriptFields, + }: { + uniqFieldNames: SearchFieldValue[]; + scriptFields: Record; + }) { + return uniqFieldNames.includes('*') + ? scriptFields + : // filter down script_fields to only include items specified + pick( + scriptFields, + Object.keys(scriptFields).filter((f) => uniqFieldNames.includes(f)) + ); + } + + private getBuiltEsQuery({ index, query = [], filters = [], getConfig, sort }: SearchRequest) { + // If sorting by _score, build queries in the "must" clause instead of "filter" clause to enable scoring + const filtersInMustClause = (sort ?? []).some((srt: EsQuerySortValue[]) => + srt.hasOwnProperty('_score') + ); + const esQueryConfigs = { + ...getEsQueryConfig({ get: getConfig }), + filtersInMustClause, + }; + return buildEsQuery(index, query, filters, esQueryConfigs); + } + + private getRemainingFields({ + uniqFieldNames, + scriptFields, + runtimeFields, + _source, + }: { + uniqFieldNames: SearchFieldValue[]; + scriptFields: Record; + runtimeFields: estypes.MappingRuntimeFields; + _source: estypes.MappingSourceField; + }) { + return difference(uniqFieldNames, [ + ...Object.keys(scriptFields), + ...Object.keys(runtimeFields), + ]).filter((remainingField) => { + if (!remainingField) return false; + if (!_source || !_source.excludes) return true; + return !_source.excludes.includes(remainingField as string); + }); + } + + private getFieldsList({ + index, + fields, + docvalueFields, + fieldsFromSource, + filteredDocvalueFields, + metaFields, + fieldListProvided, + sourceFieldsProvided, + }: { + index?: DataView; + fields: SearchFieldValue[]; + docvalueFields: Array<{ field: string; format: string }>; + fieldsFromSource: SearchFieldValue[]; + filteredDocvalueFields: Array<{ field: string; format: string }>; + metaFields: string[]; + fieldListProvided: boolean; + sourceFieldsProvided: boolean; + }) { + if (fieldListProvided || sourceFieldsProvided) { + // if items that are in the docvalueFields are provided, we should + // make sure those are added to the fields API unless they are + // already set in docvalue_fields + if (!sourceFieldsProvided) { + return this.getUniqueFields({ + index, + fields, + metaFields, + filteredDocvalueFields, + }); + } + return [ + ...fields, + ...filteredDocvalueFields.filter((fld: SearchFieldValue) => { + const fldName = this.getFieldName(fld); + return ( + fieldsFromSource.includes(fldName) && + !(docvalueFields || []) + .map((d: string | Record) => this.getFieldName(d)) + .includes(fldName) + ); + }), + ]; + } + + return fields; } private getUniqueFields({ @@ -940,9 +1038,9 @@ export class SearchSource { filteredDocvalueFields, }: { index?: DataView; - fields: any; - metaFields: string; - filteredDocvalueFields: any; + fields: SearchFieldValue[]; + metaFields: string[]; + filteredDocvalueFields: Array<{ field: string; format: string }>; }) { const bodyFields = this.getFieldsWithoutSourceFilters(index, fields); // if items that are in the docvalueFields are provided, we should diff --git a/src/plugins/data/tsconfig.json b/src/plugins/data/tsconfig.json index ccf37a0eba89f..530d6b7325c00 100644 --- a/src/plugins/data/tsconfig.json +++ b/src/plugins/data/tsconfig.json @@ -34,7 +34,6 @@ "@kbn/utility-types", "@kbn/i18n", "@kbn/utility-types-jest", - "@kbn/safer-lodash-set", "@kbn/management-plugin", "@kbn/test-jest-helpers", "@kbn/i18n-react", @@ -55,7 +54,8 @@ "@kbn/code-editor", "@kbn/core-test-helpers-model-versions", "@kbn/react-kibana-mount", - "@kbn/search-types" + "@kbn/search-types", + "@kbn/safer-lodash-set", ], "exclude": [ "target/**/*", From 72c3198419c8397c1561abd446651f6fc4d3e6cb Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 30 May 2024 01:03:32 -0400 Subject: [PATCH 57/95] [api-docs] 2024-05-30 Daily api_docs build (#184489) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/722 --- api_docs/actions.devdocs.json | 56 +++++ api_docs/actions.mdx | 4 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 50 +++++ api_docs/alerting.mdx | 4 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/assets_data_access.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.devdocs.json | 12 +- 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.devdocs.json | 32 +++ api_docs/data.mdx | 4 +- api_docs/data_quality.devdocs.json | 98 +++++++++ api_docs/data_quality.mdx | 38 ++++ api_docs/data_query.mdx | 4 +- api_docs/data_search.mdx | 4 +- 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.devdocs.json | 24 ++- api_docs/data_views.mdx | 4 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.devdocs.json | 32 +++ api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 4 +- api_docs/deprecations_by_plugin.mdx | 6 +- 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/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.devdocs.json | 12 +- 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.devdocs.json | 12 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.devdocs.json | 12 +- 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.devdocs.json | 12 +- 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.devdocs.json | 12 +- 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.devdocs.json | 198 +++++++++++++++++- api_docs/fleet.mdx | 4 +- 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/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_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.mdx | 2 +- api_docs/kbn_analytics_collection_utils.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_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.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_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.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_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.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 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_utils.devdocs.json | 14 ++ api_docs/kbn_content_management_utils.mdx | 4 +- 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 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.devdocs.json | 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 | 80 +++---- 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 +- ...ore_saved_objects_api_browser.devdocs.json | 16 ++ .../kbn_core_saved_objects_api_browser.mdx | 4 +- ...core_saved_objects_api_server.devdocs.json | 16 ++ .../kbn_core_saved_objects_api_server.mdx | 4 +- ...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 +- ...kbn_core_saved_objects_common.devdocs.json | 8 + 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 +- ...kbn_core_saved_objects_server.devdocs.json | 30 +++ api_docs/kbn_core_saved_objects_server.mdx | 4 +- ...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_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.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_fleet.mdx | 2 +- .../kbn_deeplinks_management.devdocs.json | 4 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- .../kbn_deeplinks_observability.devdocs.json | 14 ++ api_docs/kbn_deeplinks_observability.mdx | 4 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.devdocs.json | 4 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.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_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.mdx | 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.devdocs.json | 11 - api_docs/kbn_es_types.mdx | 4 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.mdx | 2 +- api_docs/kbn_esql_utils.devdocs.json | 15 -- api_docs/kbn_esql_utils.mdx | 4 +- ..._esql_validation_autocomplete.devdocs.json | 4 +- api_docs/kbn_esql_validation_autocomplete.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 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_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_grouping.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_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.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_ipynb.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_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.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_cancellable_search.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_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.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 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.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 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- .../kbn_presentation_publishing.devdocs.json | 4 +- api_docs/kbn_presentation_publishing.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_hooks.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_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- 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_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.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 +- ...ion_exception_list_components.devdocs.json | 10 +- ...ritysolution_exception_list_components.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 +- .../kbn_server_route_repository.devdocs.json | 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_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.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_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.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_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.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_unsaved_changes_badge.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_visualization_utils.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.devdocs.json | 24 ++- 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/logs_data_access.mdx | 2 +- api_docs/logs_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/mock_idp_plugin.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 | 55 +++++ api_docs/observability.mdx | 4 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- .../observability_logs_explorer.devdocs.json | 44 ---- api_docs/observability_logs_explorer.mdx | 4 +- 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 | 36 ++-- api_docs/presentation_panel.mdx | 2 +- 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.devdocs.json | 16 ++ api_docs/saved_objects.mdx | 4 +- 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/search_connectors.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 12 +- 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/slo.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.devdocs.json | 6 +- api_docs/visualizations.mdx | 2 +- 727 files changed, 1551 insertions(+), 896 deletions(-) create mode 100644 api_docs/data_quality.devdocs.json create mode 100644 api_docs/data_quality.mdx diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index 621d8237c0503..5e426770d134a 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -3877,6 +3877,62 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.isActionTypeEnabled", + "type": "Function", + "tags": [], + "label": "isActionTypeEnabled", + "description": [], + "signature": [ + "(id: string, options?: { notifyUsage: boolean; } | undefined) => boolean" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.isActionTypeEnabled.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.isActionTypeEnabled.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.isActionTypeEnabled.$2.notifyUsage", + "type": "boolean", + "tags": [], + "label": "notifyUsage", + "description": [], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] } ], "lifecycle": "setup", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 31d41def6c48b..ac6e1891851ad 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 303 | 0 | 297 | 32 | +| 307 | 0 | 301 | 32 | ## Client diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index d6a255a2c6563..a06074ca7b607 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index aecceb8752f4f..2948814d0dab9 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index b3540bb4dd99a..4e2d16b97e63d 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 2781eb3b4957e..3c04c882e6eee 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -7908,6 +7908,26 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "alerting", + "id": "def-common.MaintenanceWindowClientContext.uiSettings", + "type": "Object", + "tags": [], + "label": "uiSettings", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-ui-settings-server", + "scope": "common", + "docId": "kibKbnCoreUiSettingsServerPluginApi", + "section": "def-common.IUiSettingsClient", + "text": "IUiSettingsClient" + } + ], + "path": "x-pack/plugins/alerting/common/maintenance_window.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "alerting", "id": "def-common.MaintenanceWindowClientContext.getModificationMetadata", @@ -10802,6 +10822,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "alerting", + "id": "def-common.INTERNAL_ALERTING_BACKFILL_API_PATH", + "type": "string", + "tags": [], + "label": "INTERNAL_ALERTING_BACKFILL_API_PATH", + "description": [], + "signature": [ + "\"/internal/alerting/rules/backfill\"" + ], + "path": "x-pack/plugins/alerting/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "alerting", + "id": "def-common.INTERNAL_ALERTING_BACKFILL_FIND_API_PATH", + "type": "string", + "tags": [], + "label": "INTERNAL_ALERTING_BACKFILL_FIND_API_PATH", + "description": [], + "signature": [ + "\"/internal/alerting/rules/backfill/_find\"" + ], + "path": "x-pack/plugins/alerting/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "alerting", "id": "def-common.INTERNAL_ALERTING_SNOOZE_RULE", diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 753ea2743905e..28eec1c602696 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 865 | 1 | 833 | 54 | +| 868 | 1 | 836 | 54 | ## Client diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 0b98e0d24d94d..6fd57250320d5 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: 2024-05-29 +date: 2024-05-30 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 5b18464e09adb..ab16ff180c495 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: 2024-05-29 +date: 2024-05-30 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 111a2e61f13d1..71447c7277705 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index d32232824cda8..18077ac72e241 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 3b7bef661ecd4..7245c33571738 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: 2024-05-29 +date: 2024-05-30 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 7bcb9f517772b..813f8da851f9e 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: 2024-05-29 +date: 2024-05-30 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 aff4a4f9bccd9..975b9a1182279 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: 2024-05-29 +date: 2024-05-30 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 686e788ece20f..4320c24c2b46c 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.devdocs.json b/api_docs/charts.devdocs.json index 0026005ee11a3..afbb840e0a8ee 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -3393,7 +3393,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -3405,13 +3405,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; } | undefined; }" + " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; } | undefined; }" ], "path": "src/plugins/charts/common/static/overrides/settings.ts", "deprecated": false, diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 50b41248e43b6..cc99527cf540f 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: 2024-05-29 +date: 2024-05-30 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 d7687fbf17686..f24e1a2608d26 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: 2024-05-29 +date: 2024-05-30 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 7e00abe73104f..9710831a647bc 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: 2024-05-29 +date: 2024-05-30 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 65a577be79479..2e1a23c53e440 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: 2024-05-29 +date: 2024-05-30 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 c6a1fb0f6261c..ef3c4c897c223 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: 2024-05-29 +date: 2024-05-30 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 19eee2d0bc12d..e6b13163ed4ee 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: 2024-05-29 +date: 2024-05-30 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 43e75db61a4d9..48b298b994cb7 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: 2024-05-29 +date: 2024-05-30 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 7a527cda7ecf1..09fc3206d9cc7 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: 2024-05-29 +date: 2024-05-30 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 1c8771f79926f..226ec1334565b 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: 2024-05-29 +date: 2024-05-30 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 9a62aa6843bb0..468f82ac994ee 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: 2024-05-29 +date: 2024-05-30 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 bbe9b0fabbd5c..a011205780700 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: 2024-05-29 +date: 2024-05-30 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 a7ef2797d2e89..18c77bfd5a6e3 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 1a829a4a4fa1e..9502e236cad37 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -7848,6 +7848,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-public.SavedObject.updated_by", + "type": "string", + "tags": [], + "label": "updated_by", + "description": [ + "The ID of the user who last updated this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-public.SavedObject.error", @@ -24161,6 +24177,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-common.SavedObject.updated_by", + "type": "string", + "tags": [], + "label": "updated_by", + "description": [ + "The ID of the user who last updated this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-common.SavedObject.error", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index f60cc67a6ac01..ff2bf0e470264 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3183 | 31 | 2576 | 24 | +| 3185 | 31 | 2576 | 24 | ## Client diff --git a/api_docs/data_quality.devdocs.json b/api_docs/data_quality.devdocs.json new file mode 100644 index 0000000000000..1abc27872df38 --- /dev/null +++ b/api_docs/data_quality.devdocs.json @@ -0,0 +1,98 @@ +{ + "id": "dataQuality", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "dataQuality", + "id": "def-public.DataQualityPluginSetup", + "type": "Interface", + "tags": [], + "label": "DataQualityPluginSetup", + "description": [], + "path": "x-pack/plugins/data_quality/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "dataQuality", + "id": "def-public.DataQualityPluginStart", + "type": "Interface", + "tags": [], + "label": "DataQualityPluginStart", + "description": [], + "path": "x-pack/plugins/data_quality/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "dataQuality", + "id": "def-common.DATA_QUALITY_URL_STATE_KEY", + "type": "string", + "tags": [], + "label": "DATA_QUALITY_URL_STATE_KEY", + "description": [], + "signature": [ + "\"pageState\"" + ], + "path": "x-pack/plugins/data_quality/common/url_schema/common.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "dataQuality", + "id": "def-common.PLUGIN_ID", + "type": "string", + "tags": [], + "label": "PLUGIN_ID", + "description": [], + "signature": [ + "\"data_quality\"" + ], + "path": "x-pack/plugins/data_quality/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "dataQuality", + "id": "def-common.PLUGIN_NAME", + "type": "string", + "tags": [], + "label": "PLUGIN_NAME", + "description": [], + "path": "x-pack/plugins/data_quality/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx new file mode 100644 index 0000000000000..d4a3099faf517 --- /dev/null +++ b/api_docs/data_quality.mdx @@ -0,0 +1,38 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibDataQualityPluginApi +slug: /kibana-dev-docs/api/dataQuality +title: "dataQuality" +image: https://source.unsplash.com/400x175/?github +description: API docs for the dataQuality plugin +date: 2024-05-30 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] +--- +import dataQualityObj from './data_quality.devdocs.json'; + + + +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 5 | 0 | 5 | 0 | + +## Client + +### Setup + + +### Start + + +## Common + +### Consts, variables and types + + diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 680da0d443ead..8c8392a2e6245 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3183 | 31 | 2576 | 24 | +| 3185 | 31 | 2576 | 24 | ## Client diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 62451710389a4..a9c3c462733a6 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3183 | 31 | 2576 | 24 | +| 3185 | 31 | 2576 | 24 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index bedc9701a90d4..4e054f980398b 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: 2024-05-29 +date: 2024-05-30 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 f6b679f633d0b..780e867faeb89 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: 2024-05-29 +date: 2024-05-30 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 f3a29f268a0aa..7e7c2119da0fa 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 0e0a7ce6b805d..49a97d7426017 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -13133,6 +13133,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx" }, + { + "plugin": "@kbn/lens-embeddable-utils", + "path": "packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts" + }, { "plugin": "@kbn/ml-data-view-utils", "path": "x-pack/packages/ml/data_view_utils/actions/data_view_handler.ts" @@ -13177,10 +13181,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts" }, - { - "plugin": "@kbn/lens-embeddable-utils", - "path": "packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts" - }, { "plugin": "exploratoryView", "path": "x-pack/plugins/observability_solution/exploratory_view/public/utils/observability_data_views/observability_data_views.ts" @@ -24785,6 +24785,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "dataViews", + "id": "def-common.SavedObject.updated_by", + "type": "string", + "tags": [], + "label": "updated_by", + "description": [ + "The ID of the user who last updated this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "dataViews", "id": "def-common.SavedObject.error", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 4d6b67e934e16..672ab41511981 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1158 | 0 | 402 | 3 | +| 1159 | 0 | 402 | 3 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index f1530ce557ccb..53be8f2c5220f 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index aab9fca4ec849..c7fe97d5b6392 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -187,6 +187,22 @@ "DatasetQualityRouteHandlerResources", " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | null | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; }>; } & ", "DatasetQualityRouteCreateOptions", + "; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\": { endpoint: \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; }>; query: ", + "TypeC", + "<{ start: ", + "Type", + "; end: ", + "Type", + "; }>; }> | undefined; handler: ({}: ", + "DatasetQualityRouteHandlerResources", + " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ degradedFields: { name: string; count: number; lastOccurrence: number | null; }[]; }>; } & ", + "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/non_aggregatable\": { endpoint: \"GET /internal/dataset_quality/data_streams/non_aggregatable\"; params?: ", "TypeC", "<{ query: ", @@ -326,6 +342,22 @@ "DatasetQualityRouteHandlerResources", " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | null | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; }>; } & ", "DatasetQualityRouteCreateOptions", + "; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\": { endpoint: \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_fields\"; params?: ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; }>; query: ", + "TypeC", + "<{ start: ", + "Type", + "; end: ", + "Type", + "; }>; }> | undefined; handler: ({}: ", + "DatasetQualityRouteHandlerResources", + " & { params: { path: { dataStream: string; }; query: { start: number; end: number; }; }; }) => Promise<{ degradedFields: { name: string; count: number; lastOccurrence: number | null; }[]; }>; } & ", + "DatasetQualityRouteCreateOptions", "; \"GET /internal/dataset_quality/data_streams/non_aggregatable\": { endpoint: \"GET /internal/dataset_quality/data_streams/non_aggregatable\"; params?: ", "TypeC", "<{ query: ", diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 20c775187b3b7..c1dd24cd5fd4e 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 56193a2cbbcee..7bc2ce40d3319 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,7 +17,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, lens, controls, triggersActionsUi, dataVisualizer, canvas, presentationUtil, logsShared, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, @kbn/lens-embeddable-utils, exploratoryView, stackAlerts, infra, timelines, securitySolution, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | +| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, lens, controls, triggersActionsUi, dataVisualizer, canvas, presentationUtil, logsShared, fleet, ml, @kbn/lens-embeddable-utils, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, infra, timelines, securitySolution, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | | | actions, savedObjectsTagging, ml, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 7d05ae39ab0b0..93037ca1c1f36 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -133,7 +133,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion) | - | | | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion) | - | -| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject)+ 5 more | - | +| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject)+ 6 more | - | | | [create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/create.ts#:~:text=SavedObjectReference), [create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/create.ts#:~:text=SavedObjectReference), [bulk_update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/bulk_update.ts#:~:text=SavedObjectReference), [bulk_update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/bulk_update.ts#:~:text=SavedObjectReference), [update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/update.ts#:~:text=SavedObjectReference), [update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/update.ts#:~:text=SavedObjectReference) | - | @@ -212,7 +212,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkCreateObject), [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkCreateObject) | - | | | [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkDeleteResponse), [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkDeleteResponse) | - | | | [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts#:~:text=SavedObjectsStart), [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts#:~:text=SavedObjectsStart), [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts#:~:text=SavedObjectsStart) | - | -| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject)+ 21 more | - | +| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject)+ 22 more | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 797b31f326c96..abdd17dec10a1 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 4d3a9e4a5ebd6..59e672c1ccc55 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: 2024-05-29 +date: 2024-05-30 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 fde43d84925ee..68d78e1a8abf6 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: 2024-05-29 +date: 2024-05-30 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 8114217ed7407..d3a7afcdd6c32 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 25517bdd6e8c0..80804a9587a81 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 845a63c4f9e46..c0a2fb8831b53 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: 2024-05-29 +date: 2024-05-30 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 a20c245a7f0c5..01fecb45bfbe6 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 3cf0bf3848d46..e1e1ad4414f91 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -4230,10 +4230,10 @@ }, { "parentPluginId": "embeddable", - "id": "def-public.Embeddable.onPhaseChange", + "id": "def-public.Embeddable.phase$", "type": "Object", "tags": [], - "label": "onPhaseChange", + "label": "phase$", "description": [], "signature": [ "{ source: ", @@ -9630,6 +9630,14 @@ "text": "HasType" }, ",", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.PublishesPhaseEvents", + "text": "PublishesPhaseEvents" + }, + ",", { "pluginId": "@kbn/presentation-publishing", "scope": "common", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index b18f8ea88a516..755b21fc686ea 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: 2024-05-29 +date: 2024-05-30 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 5ac480f0fe6b6..6f0939f0f7c9d 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: 2024-05-29 +date: 2024-05-30 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 8751c34b64f7a..fb74daf252596 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: 2024-05-29 +date: 2024-05-30 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 20b5e70f74aa1..61187a445f989 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: 2024-05-29 +date: 2024-05-30 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 832167420ea37..c129050be8919 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: 2024-05-29 +date: 2024-05-30 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 8a18b8358e6c7..b8fb3ae8dd4ca 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: 2024-05-29 +date: 2024-05-30 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 e542552963a91..661ea8d15a2a9 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: 2024-05-29 +date: 2024-05-30 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 c495ff00f3450..153f2acc9f15e 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: 2024-05-29 +date: 2024-05-30 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 2abb879071cad..6c5ba6d5b3430 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: 2024-05-29 +date: 2024-05-30 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 7be45ddda921e..722a4dc64cd28 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.devdocs.json b/api_docs/expression_gauge.devdocs.json index 2aa3a05ef51b2..16f8d3bf1e5a1 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -1235,7 +1235,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -1247,13 +1247,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined; setChartSize: (d: ", + " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial>) | undefined; setChartSize: (d: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 96a4dd2335e00..e1fe9dac2ae0d 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.devdocs.json b/api_docs/expression_heatmap.devdocs.json index 53e77c550dcdf..4483cf8fc7ed1 100644 --- a/api_docs/expression_heatmap.devdocs.json +++ b/api_docs/expression_heatmap.devdocs.json @@ -509,7 +509,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -521,13 +521,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_heatmap/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index b05e7178b45ab..17af6c768352a 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: 2024-05-29 +date: 2024-05-30 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 e55e2a6206de2..7018f54a41837 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: 2024-05-29 +date: 2024-05-30 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 943a6e3146e47..8804a11f91b4f 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: 2024-05-29 +date: 2024-05-30 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 606a306bc2454..7a459e64c534e 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index 04d285aba5fc0..3212eb93a18fe 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -886,7 +886,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -898,13 +898,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index eb315896b66e8..130e9ccb1019a 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: 2024-05-29 +date: 2024-05-30 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 40a7d314375c7..933899a4224e3 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: 2024-05-29 +date: 2024-05-30 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 ac696684673cb..9f0be183e5071 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: 2024-05-29 +date: 2024-05-30 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 4c4d916327d55..6609b88f3a0b2 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: 2024-05-29 +date: 2024-05-30 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 ed6eaa014fa1a..da6d3e5d17118 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: 2024-05-29 +date: 2024-05-30 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 423b4902be7fb..8113e70080893 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index 16452c6d6eaf6..c9cf580930d20 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -1969,7 +1969,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -1981,13 +1981,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_renderers.ts", "deprecated": false, diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 95fc618f9bac6..85779d36bd1f7 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: 2024-05-29 +date: 2024-05-30 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 81b59dbf08efa..0aa4b4d558eff 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: 2024-05-29 +date: 2024-05-30 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 8f5cb977a8966..918542b88b4c0 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: 2024-05-29 +date: 2024-05-30 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 a0b0e9665fe40..f6b4298ce1886 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: 2024-05-29 +date: 2024-05-30 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 3a0fc002312a8..82534974a4b6d 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: 2024-05-29 +date: 2024-05-30 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 4eb1725fb5d17..fba0f64a54d14 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: 2024-05-29 +date: 2024-05-30 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 43115c12a6868..ad4b9a49ea83b 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index e7987f0be986b..35c94c786c291 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -5559,6 +5559,62 @@ "trackAdoption": false, "children": [], "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.NamingCollisionError", + "type": "Class", + "tags": [], + "label": "NamingCollisionError", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.NamingCollisionError", + "text": "NamingCollisionError" + }, + " extends Error" + ], + "path": "x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/validation/check_naming_collision.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.NamingCollisionError.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/validation/check_naming_collision.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.NamingCollisionError.Unnamed.$1", + "type": "string", + "tags": [], + "label": "message", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/validation/check_naming_collision.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false } ], "functions": [ @@ -7868,7 +7924,7 @@ "section": "def-common.Installation", "text": "Installation" }, - " | undefined>" + ">" ], "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", "deprecated": false, @@ -7959,7 +8015,7 @@ "section": "def-common.InstallResult", "text": "InstallResult" }, - " | undefined>" + ">" ], "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", "deprecated": false, @@ -8034,6 +8090,114 @@ ], "returnComment": [] }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration", + "type": "Function", + "tags": [], + "label": "installCustomIntegration", + "description": [], + "signature": [ + "(options: { pkgName: string; kibanaVersion?: string | undefined; force?: boolean | undefined; spaceId?: string | undefined; datasets: ", + "CustomPackageDatasetConfiguration", + "[]; }) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.InstallResult", + "text": "InstallResult" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration.$1.pkgName", + "type": "string", + "tags": [], + "label": "pkgName", + "description": [], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration.$1.kibanaVersion", + "type": "string", + "tags": [], + "label": "kibanaVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration.$1.force", + "type": "CompoundType", + "tags": [], + "label": "force", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration.$1.spaceId", + "type": "string", + "tags": [], + "label": "spaceId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.installCustomIntegration.$1.datasets", + "type": "Array", + "tags": [], + "label": "datasets", + "description": [], + "signature": [ + "CustomPackageDatasetConfiguration", + "[]" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, { "parentPluginId": "fleet", "id": "def-server.PackageClient.fetchFindLatestPackage", @@ -21179,6 +21343,21 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FullAgentPolicyInput.processors", + "type": "Array", + "tags": [], + "label": "processors", + "description": [], + "signature": [ + "FullAgentPolicyAddFields", + "[] | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "fleet", "id": "def-common.FullAgentPolicyInput.Unnamed", @@ -22789,6 +22968,21 @@ "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.NewAgentPolicy.global_data_tags", + "type": "Array", + "tags": [], + "label": "global_data_tags", + "description": [], + "signature": [ + "GlobalDataTag", + "[] | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index cd24a1e35a46a..8cfd294851831 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1310 | 5 | 1189 | 66 | +| 1322 | 5 | 1201 | 69 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 4e7af443c520a..f85ffa6406c61 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: 2024-05-29 +date: 2024-05-30 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 80a0913c25100..78b775dd84069 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: 2024-05-29 +date: 2024-05-30 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 16a3286e52edc..874b2be0f777b 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: 2024-05-29 +date: 2024-05-30 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 1946047ed35b3..cffab9b7c7684 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: 2024-05-29 +date: 2024-05-30 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 41967dc91a69d..55140f8ac6bdd 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: 2024-05-29 +date: 2024-05-30 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 554cacd08aad0..92a5bd17753f4 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: 2024-05-29 +date: 2024-05-30 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 ceb6545393092..e1c64ed07dee3 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 5fdea44871f9a..721a0fea8cbe1 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 41d94eb988063..a2f2b57435e40 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: 2024-05-29 +date: 2024-05-30 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 3241129104ab0..10f0ff3c71962 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: 2024-05-29 +date: 2024-05-30 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 ea6596f4ff5e5..3bad4ab22bb7f 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index e76800c0d9cf9..e7ac5e3f67155 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index ac40b01a68138..9b9c89d815df4 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index d0a3e31840126..845409e436a88 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index a5c066ce6f0c6..e14a3dc4ff558 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index e2374cf8ee542..7997813fda6e1 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: 2024-05-29 +date: 2024-05-30 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 57109bff07836..cbc3dc0235d01 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 4c6e04b6a4c8c..114ff50953f37 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 9145e391ae59f..8016e39deff23 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 4314bb770df9b..9e6ef6629c33a 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: 2024-05-29 +date: 2024-05-30 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 f20fb8e27b2db..58e68a12e8889 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: 2024-05-29 +date: 2024-05-30 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 fe7f4ef93c3d5..78f62fba5d5af 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 3f930d0c89c88..2a8ed22c69596 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 7b2c1bfeca905..f08f325730860 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.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 bb5a9611faddd..cc2a10deac5f3 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: 2024-05-29 +date: 2024-05-30 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 ef2ee6263daaf..8b98029a45d88 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: 2024-05-29 +date: 2024-05-30 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 b5a86dfc8ef83..cf627acc6e524 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: 2024-05-29 +date: 2024-05-30 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 f4b4b4b707f55..abd7ca8519a81 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 9b8c71245769d..0b05082abb9bb 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: 2024-05-29 +date: 2024-05-30 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_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 80476ec937637..1cfbb83118c8e 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 6cd1b3d860020..c891c000b4836 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: 2024-05-29 +date: 2024-05-30 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 9a70d9074a5d7..9e4ea58b33429 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: 2024-05-29 +date: 2024-05-30 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 aaaf1f1e5589a..b59cf1db6625d 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: 2024-05-29 +date: 2024-05-30 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 b2d5d7b3be266..043ca7b7b990b 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 5eb7701a2096e..9c7c54d20edf4 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 2c3889db6e33c..a9bf6c0a298b4 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 2549f6b6b2580..dfb2fd31c95a1 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 9d72185c07a2f..c4c941714bbfc 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: 2024-05-29 +date: 2024-05-30 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 7df360fc6c174..40927ef3f1188 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: 2024-05-29 +date: 2024-05-30 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 233856bfb9e2c..e076a69b19152 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: 2024-05-29 +date: 2024-05-30 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 6d81ef6124c9b..0facb1e1c9424 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: 2024-05-29 +date: 2024-05-30 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 4bf92482d548a..1bbebd8b78851 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: 2024-05-29 +date: 2024-05-30 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 7a8dee6cad770..76810ac325f08 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: 2024-05-29 +date: 2024-05-30 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 59fa957913a65..49e86ab079240 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: 2024-05-29 +date: 2024-05-30 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 425db2a158d34..3cf586b2c6d59 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: 2024-05-29 +date: 2024-05-30 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 248ee7fb6c7d6..62999672213cc 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index a1e2001f8e188..4bd838e8c6526 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 940f8d9f8e29c..d5dc22075a06e 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 4086f2daf7c86..aa1271987dcf4 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: 2024-05-29 +date: 2024-05-30 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 e401bcad55862..d2591a99f4def 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: 2024-05-29 +date: 2024-05-30 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 98df33f48f879..f0b6c47e77855 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: 2024-05-29 +date: 2024-05-30 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 e60f95e68ce25..3bea452eab0f5 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: 2024-05-29 +date: 2024-05-30 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 0aedd508f522b..33fbd1dc7e621 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: 2024-05-29 +date: 2024-05-30 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 ce5902f0374dc..cf9d98adcdedf 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: 2024-05-29 +date: 2024-05-30 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 43411ec05ed68..0133b15518f98 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: 2024-05-29 +date: 2024-05-30 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_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index a98ef2e26cb1c..33281bc050629 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.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 20ed44dad7552..1f41769fa9761 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_content_management_utils.devdocs.json index f980f0d987f71..2dee9c7bf646d 100644 --- a/api_docs/kbn_content_management_utils.devdocs.json +++ b/api_docs/kbn_content_management_utils.devdocs.json @@ -3033,6 +3033,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.SOWithMetadata.updatedBy", + "type": "string", + "tags": [], + "label": "updatedBy", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-content-management-utils/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/content-management-utils", "id": "def-common.SOWithMetadata.error", diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 70e081baeaf9d..61028d99734fc 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 194 | 1 | 127 | 0 | +| 195 | 1 | 128 | 0 | ## Common diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 6812b545598b8..9e8a4fa21d520 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: 2024-05-29 +date: 2024-05-30 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 cc53d2f330e81..77687ba281619 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: 2024-05-29 +date: 2024-05-30 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 932a880088a75..ecd176934969c 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: 2024-05-29 +date: 2024-05-30 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 c57aa95a039ef..67717b5686eb1 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: 2024-05-29 +date: 2024-05-30 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 2253355c7d8f6..b6ace88b1e6e7 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: 2024-05-29 +date: 2024-05-30 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 b4167c1674f9f..e3cfdfb12ea08 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: 2024-05-29 +date: 2024-05-30 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 bf06c169fa5c6..bda1e48a8901b 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: 2024-05-29 +date: 2024-05-30 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 140a4ba48064a..c8d3c341b85eb 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: 2024-05-29 +date: 2024-05-30 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 466319f78e2af..9a8cda855db94 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: 2024-05-29 +date: 2024-05-30 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 556b84718425f..48b3733d26fa7 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: 2024-05-29 +date: 2024-05-30 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 3ac73c8e881fc..4040814ae5221 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: 2024-05-29 +date: 2024-05-30 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 42d3b12104bc3..84d228766b24e 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: 2024-05-29 +date: 2024-05-30 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 93fb854942615..a1d11fca5e2bc 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: 2024-05-29 +date: 2024-05-30 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 ff262bb4315c2..8075df4893def 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: 2024-05-29 +date: 2024-05-30 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 f0e3da698f7b0..a611e1e3b6e67 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: 2024-05-29 +date: 2024-05-30 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 3dd74c53b00ed..ec6877a1c9beb 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: 2024-05-29 +date: 2024-05-30 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 c35ee5468cab8..554e73eca8f4a 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: 2024-05-29 +date: 2024-05-30 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 dfee83934c844..46a8bdeae7f32 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: 2024-05-29 +date: 2024-05-30 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 e8d392dec28b0..f1d5422164c06 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: 2024-05-29 +date: 2024-05-30 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.mdx b/api_docs/kbn_core_capabilities_server.mdx index 11cb7600f24f4..c9d1204de0238 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 40bf7ae387d5a..18b6cb98638e4 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index eb8ba6a1f7234..e4c0daecf50a6 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3716,7 +3716,7 @@ "label": "AppDeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"ux\" | \"apm\" | \"logs\" | \"profiling\" | \"dashboards\" | \"observabilityAIAssistant\" | \"home\" | \"canvas\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"profiling:functions\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\"" + "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"ux\" | \"apm\" | \"logs\" | \"profiling\" | \"dashboards\" | \"observabilityAIAssistant\" | \"home\" | \"canvas\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"profiling:functions\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\"" ], "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 8ff0c8fdcf437..885413989aa29 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: 2024-05-29 +date: 2024-05-30 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 c32ab86d1fa34..a5bee9233fc8f 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: 2024-05-29 +date: 2024-05-30 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 2564d87d452aa..8c73cbf27517b 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: 2024-05-29 +date: 2024-05-30 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 4fd32719051db..99c2bb65253f5 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: 2024-05-29 +date: 2024-05-30 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 79369850d0159..c127c8f7f6ad2 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: 2024-05-29 +date: 2024-05-30 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 dda8f41273ac8..e0304ea50052a 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: 2024-05-29 +date: 2024-05-30 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 717268bc3b0ad..4d50d6eee5d1d 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: 2024-05-29 +date: 2024-05-30 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 e84fbea5f03b2..6681dd89a786d 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: 2024-05-29 +date: 2024-05-30 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 8d7b2655cc879..b2f3bcc7ee55c 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: 2024-05-29 +date: 2024-05-30 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 3a08a33343da2..2b3f3b3cdfbc9 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: 2024-05-29 +date: 2024-05-30 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 0574012e55320..f459c8b6176b6 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: 2024-05-29 +date: 2024-05-30 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 47b2db47dd536..878a9b182d447 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: 2024-05-29 +date: 2024-05-30 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 c592d842ed36e..ac742667fdbed 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: 2024-05-29 +date: 2024-05-30 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 36bac8be35607..87f8d1d0b405a 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: 2024-05-29 +date: 2024-05-30 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 f16cfc579c550..c3c9862ba1265 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: 2024-05-29 +date: 2024-05-30 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 8b7b99bf27de3..9a98fe93d8988 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: 2024-05-29 +date: 2024-05-30 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 09581ce87333b..be3c5cb878efb 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: 2024-05-29 +date: 2024-05-30 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 5cfc91117592c..b8d1670e88586 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: 2024-05-29 +date: 2024-05-30 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 f5f2901a3bdab..8d517c9051f64 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: 2024-05-29 +date: 2024-05-30 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 a6d0ece824d5b..699e11fec6cb8 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: 2024-05-29 +date: 2024-05-30 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 de2e23db3fff9..bd12686feea2b 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: 2024-05-29 +date: 2024-05-30 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 95bc455877cc4..af7ecb6283ab6 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: 2024-05-29 +date: 2024-05-30 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 d6ffe83b617c7..e04765e14e81f 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: 2024-05-29 +date: 2024-05-30 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 c4c20e9da14a0..b9489add0695a 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: 2024-05-29 +date: 2024-05-30 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 c0d24a91b09a1..ffcd7156779b2 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: 2024-05-29 +date: 2024-05-30 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 dbb89ffaf672b..b77046a89107c 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: 2024-05-29 +date: 2024-05-30 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 67dcdfd1f174b..11eb891b2b591 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: 2024-05-29 +date: 2024-05-30 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 e37fdf0dee342..287d4b72699ae 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: 2024-05-29 +date: 2024-05-30 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 734b8055289a1..7b89a7dd665b0 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: 2024-05-29 +date: 2024-05-30 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 189089c24f598..b8b2e7496c944 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: 2024-05-29 +date: 2024-05-30 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 363678bfed48d..ebe625dd53d6f 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: 2024-05-29 +date: 2024-05-30 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 17099cccf688c..a2dbb4977f29e 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: 2024-05-29 +date: 2024-05-30 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 f1edff954069b..d536fcbc3bbe2 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: 2024-05-29 +date: 2024-05-30 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 528092613dc13..902a52a928e55 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: 2024-05-29 +date: 2024-05-30 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 3b272858799da..0d444bb41ea34 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: 2024-05-29 +date: 2024-05-30 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 44ff566712b1d..dba72a1de9d14 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: 2024-05-29 +date: 2024-05-30 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 ae14c51abf1a4..23246ea7ed65f 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: 2024-05-29 +date: 2024-05-30 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 f799ff7e50191..aefc20726581e 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: 2024-05-29 +date: 2024-05-30 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 a137858a3eb20..992ae58db52df 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: 2024-05-29 +date: 2024-05-30 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 a7a60b8ff262b..7fc63f4c703a4 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: 2024-05-29 +date: 2024-05-30 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 cf9d50bb2557e..a5d8326788ea0 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: 2024-05-29 +date: 2024-05-30 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 9883a6a3def1e..b37977ad66d5f 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: 2024-05-29 +date: 2024-05-30 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 c688eb8877b78..b992b2d7fddab 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: 2024-05-29 +date: 2024-05-30 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 ed340b18b5f29..39eeb0364fe50 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: 2024-05-29 +date: 2024-05-30 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 95b3ce73d9f3d..2268834b4ce9f 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: 2024-05-29 +date: 2024-05-30 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 77bfa2192d869..3f1904bc2b870 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: 2024-05-29 +date: 2024-05-30 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 80f72d44e36d1..6b24f37250f48 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: 2024-05-29 +date: 2024-05-30 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 788b99903a422..520a035ef72c4 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: 2024-05-29 +date: 2024-05-30 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 87e762b8d2bf2..ea97ca38510ee 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3962,10 +3962,6 @@ "plugin": "crossClusterReplication", "path": "x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_stats_route.ts" }, - { - "plugin": "globalSearch", - "path": "x-pack/plugins/global_search/server/routes/get_searchable_types.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/guide_state_routes.ts" @@ -3978,6 +3974,22 @@ "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/config_routes.ts" }, + { + "plugin": "observability", + "path": "x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/server/routes/health.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/server/routes/config.ts" + }, + { + "plugin": "globalSearch", + "path": "x-pack/plugins/global_search/server/routes/get_searchable_types.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler_extraction_rules.ts" @@ -4450,18 +4462,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/server/routes/fields.ts" }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts" - }, - { - "plugin": "triggersActionsUi", - "path": "x-pack/plugins/triggers_actions_ui/server/routes/health.ts" - }, - { - "plugin": "triggersActionsUi", - "path": "x-pack/plugins/triggers_actions_ui/server/routes/config.ts" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -6620,6 +6620,22 @@ "plugin": "crossClusterReplication", "path": "x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.ts" }, + { + "plugin": "observability", + "path": "x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/time_series_query.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/fields.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/indices.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/job_service.ts" @@ -7016,22 +7032,6 @@ "plugin": "visTypeTimeseries", "path": "src/plugins/vis_types/timeseries/server/routes/vis.ts" }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts" - }, - { - "plugin": "triggersActionsUi", - "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/time_series_query.ts" - }, - { - "plugin": "triggersActionsUi", - "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/fields.ts" - }, - { - "plugin": "triggersActionsUi", - "path": "x-pack/plugins/triggers_actions_ui/server/data/routes/indices.ts" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -9474,6 +9474,10 @@ "plugin": "crossClusterReplication", "path": "x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.ts" }, + { + "plugin": "observability", + "path": "x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler_extraction_rules.ts" @@ -9614,10 +9618,6 @@ "plugin": "logstash", "path": "x-pack/plugins/logstash/server/routes/pipeline/delete.ts" }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/observability_solution/metrics_data_access/server/lib/adapters/framework/kibana_framework_adapter.ts" @@ -14034,7 +14034,11 @@ }, { "plugin": "ecsDataQualityDashboard", - "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_results_indices_latest.ts" + "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results_latest.ts" + }, + { + "plugin": "ecsDataQualityDashboard", + "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/get_index_results.ts" }, { "plugin": "ml", @@ -15332,7 +15336,7 @@ }, { "plugin": "ecsDataQualityDashboard", - "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_results.ts" + "path": "x-pack/plugins/ecs_data_quality_dashboard/server/routes/results/post_index_results.ts" }, { "plugin": "ml", diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 0041353817220..467f3e921f3dc 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: 2024-05-29 +date: 2024-05-30 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 f5178359efdd1..837592455f551 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: 2024-05-29 +date: 2024-05-30 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 5374e764181f8..baf6a244c50c5 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: 2024-05-29 +date: 2024-05-30 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 b741d6e8d8b3f..2621168b12e9a 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: 2024-05-29 +date: 2024-05-30 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 c13e552e01b47..37ec91b25ce4b 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: 2024-05-29 +date: 2024-05-30 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 fe8f3a3603314..9a21407dff489 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: 2024-05-29 +date: 2024-05-30 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 658cdf783b0e9..a2f7c69f6d976 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: 2024-05-29 +date: 2024-05-30 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 99c134138c1f7..c8dfe75acdb7b 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: 2024-05-29 +date: 2024-05-30 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 2c70824667398..d8c3a0b2ad389 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: 2024-05-29 +date: 2024-05-30 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 7a26d511b1537..438a445282787 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: 2024-05-29 +date: 2024-05-30 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 816e93f20e7e1..e475a85b7c5f4 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: 2024-05-29 +date: 2024-05-30 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 1a5540f9936a2..d4e813683248c 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: 2024-05-29 +date: 2024-05-30 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 bff67539b5d9f..4372022bc7ca8 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: 2024-05-29 +date: 2024-05-30 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 25f180c41a506..b50df8f27e8b2 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: 2024-05-29 +date: 2024-05-30 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 0f4a627cf1598..844399ca9b4ee 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: 2024-05-29 +date: 2024-05-30 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 fbe1d8db7fc4d..ab540422a9ce3 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: 2024-05-29 +date: 2024-05-30 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 cc45c07d85daf..497fe6793d837 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: 2024-05-29 +date: 2024-05-30 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 c4029ecb63526..74d018076b9b8 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: 2024-05-29 +date: 2024-05-30 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 d863eafe4e993..879f361036674 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: 2024-05-29 +date: 2024-05-30 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 02b29d84bd471..d17df4f5ca28d 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: 2024-05-29 +date: 2024-05-30 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 0dbc4f418f867..66a068900018e 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: 2024-05-29 +date: 2024-05-30 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 3510ae98d20e9..a7f018b43fe66 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: 2024-05-29 +date: 2024-05-30 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 c119c31143f10..780de3deaf621 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: 2024-05-29 +date: 2024-05-30 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 3e987390e50cf..23151270d95c9 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: 2024-05-29 +date: 2024-05-30 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 61f1c5a48c741..e288c9e01a662 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: 2024-05-29 +date: 2024-05-30 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 ce21d6f681d6d..a01b887dd1952 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: 2024-05-29 +date: 2024-05-30 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 ee192c9ddc403..4a96cdedbee4c 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: 2024-05-29 +date: 2024-05-30 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 2d4c212ec1425..a2cab3025f711 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: 2024-05-29 +date: 2024-05-30 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 8548275e8ca1d..b288cd4d0f667 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: 2024-05-29 +date: 2024-05-30 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 9a6daa76de2a2..4929fe0820615 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: 2024-05-29 +date: 2024-05-30 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 2829e1d73df63..60062e3169b47 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: 2024-05-29 +date: 2024-05-30 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 90874268170df..d34da7ae84175 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: 2024-05-29 +date: 2024-05-30 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 f98dabc13ba82..2a33d83be71e4 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: 2024-05-29 +date: 2024-05-30 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 f67e05822a67f..b3c32e5054dc8 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: 2024-05-29 +date: 2024-05-30 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 9d4e54fd935c4..d7efce40a7c98 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: 2024-05-29 +date: 2024-05-30 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 2d8a767eb863e..f0316e1fe8aef 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: 2024-05-29 +date: 2024-05-30 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 034a024350021..89e0a66282fcb 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: 2024-05-29 +date: 2024-05-30 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 4f74fa5b2cc64..57cbed893d6d3 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: 2024-05-29 +date: 2024-05-30 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 4edfb7c687903..2b320f2d4d91e 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: 2024-05-29 +date: 2024-05-30 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 866a9b042d5b6..b543696a3f729 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: 2024-05-29 +date: 2024-05-30 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 e65dcaaed6fe4..e0e746c4053ed 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: 2024-05-29 +date: 2024-05-30 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 4125cdd45ab73..5da0675fb56a5 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: 2024-05-29 +date: 2024-05-30 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 6a66258d70807..906523e169201 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: 2024-05-29 +date: 2024-05-30 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 8942954d33cec..1e07c7fee9fd1 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: 2024-05-29 +date: 2024-05-30 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 642dcbaf45094..12fbc3d8858da 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: 2024-05-29 +date: 2024-05-30 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 bcf7428c77cd2..1e5924a5d05d2 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: 2024-05-29 +date: 2024-05-30 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 1b883782101cf..9de04dc5a55cc 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index 356236a438bc7..6686d9eec0265 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -3364,6 +3364,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-api-browser", + "id": "def-common.SimpleSavedObject.updatedBy", + "type": "string", + "tags": [], + "label": "updatedBy", + "description": [ + "The user that last updated this object" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-api-browser", "id": "def-common.SimpleSavedObject.createdAt", diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 71616818d6ddc..0352e752a08b9 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.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 | |-------------------|-----------|------------------------|-----------------| -| 112 | 1 | 0 | 0 | +| 113 | 1 | 0 | 0 | ## Common diff --git a/api_docs/kbn_core_saved_objects_api_server.devdocs.json b/api_docs/kbn_core_saved_objects_api_server.devdocs.json index 16b357ec819c6..1375222647044 100644 --- a/api_docs/kbn_core_saved_objects_api_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_server.devdocs.json @@ -2223,6 +2223,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-api-server", + "id": "def-common.SavedObject.updated_by", + "type": "string", + "tags": [], + "label": "updated_by", + "description": [ + "The ID of the user who last updated this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-api-server", "id": "def-common.SavedObject.error", diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index f53ccd4ce8374..11451513cf843 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_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 | |-------------------|-----------|------------------------|-----------------| -| 356 | 1 | 5 | 2 | +| 357 | 1 | 5 | 2 | ## Common 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 9cbbc50f8a96c..efc78ff70bca7 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: 2024-05-29 +date: 2024-05-30 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 4c23e22c995a4..928fc3ac9e48a 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: 2024-05-29 +date: 2024-05-30 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 c41015db7c46d..bb6e1746ed3d6 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: 2024-05-29 +date: 2024-05-30 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 aeff39370acd0..138415d0db4b5 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: 2024-05-29 +date: 2024-05-30 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 1ed9f993371d5..568a50629d9d1 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: 2024-05-29 +date: 2024-05-30 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 f2a1d432835b4..a5fefcb16346e 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index 13df50596c7d1..e072a4e7e6a2b 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -1101,6 +1101,10 @@ "plugin": "@kbn/core-saved-objects-api-browser", "path": "packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-api-browser", + "path": "packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server", "path": "packages/core/saved-objects/core-saved-objects-api-server/src/saved_objects_repository.ts" @@ -1177,6 +1181,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-internal", + "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" + }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 997a7ac77d22b..96dacd6a09af7 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: 2024-05-29 +date: 2024-05-30 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 ee9c2d45b70ca..2d828dd7e837a 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: 2024-05-29 +date: 2024-05-30 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 54c64887e1735..e7d1e5cf09eb5 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: 2024-05-29 +date: 2024-05-30 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 7f72cd0e4f24c..14d3da9f8877e 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: 2024-05-29 +date: 2024-05-30 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 7225c65425157..917ccf66a7b3e 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index ad0db832dd623..d0b8da699d86e 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -5714,6 +5714,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObject.updated_by", + "type": "string", + "tags": [], + "label": "updated_by", + "description": [ + "The ID of the user who last updated this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-server", "id": "def-common.SavedObject.error", @@ -6543,6 +6559,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObjectDoc.updated_by", + "type": "string", + "tags": [], + "label": "updated_by", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-server/src/serialization.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-server", "id": "def-common.SavedObjectDoc.created_at", diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index c61903b645ec4..7b8fc43c474b5 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_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 | |-------------------|-----------|------------------------|-----------------| -| 559 | 1 | 132 | 4 | +| 561 | 1 | 133 | 4 | ## Common diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index f6b0ce9a1d70b..09ac95ccb4ab2 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: 2024-05-29 +date: 2024-05-30 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 dbd7d1d9aabdc..1a54eaac34b1d 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: 2024-05-29 +date: 2024-05-30 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 63c7b078e555d..181590de1ff51 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: 2024-05-29 +date: 2024-05-30 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_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index ea3cc33398770..e17fb38af7019 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 74b0517dfc3ef..d012dad0b1269 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index b692c6da8f590..9a335f3bb7ada 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index e8ff3593c0d73..a11fc92466e80 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 8134ffafe48d0..4e60ccfe49721 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index aa328ddb8b6e3..86b709ee5c973 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 3c38f8b2eaf75..c6652624dfe1c 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 8d9335224120e..1559594a80a6a 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: 2024-05-29 +date: 2024-05-30 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 1d12046367ef4..bd6d259a413f0 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: 2024-05-29 +date: 2024-05-30 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 dd1d8ddc593f8..1fe3d8d41fef1 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: 2024-05-29 +date: 2024-05-30 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 28e75d25d0b6d..7603e16b8a569 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: 2024-05-29 +date: 2024-05-30 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 3a09cfc195d6b..e5dad0f916b83 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: 2024-05-29 +date: 2024-05-30 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 bf04d827eadfd..4e72985a50a7d 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: 2024-05-29 +date: 2024-05-30 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 f236804935c55..63d4837b44ff6 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: 2024-05-29 +date: 2024-05-30 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 646af227c9a36..eb44f98626ee5 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: 2024-05-29 +date: 2024-05-30 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 95174f717c4e6..2569dd33abb7d 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: 2024-05-29 +date: 2024-05-30 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 eb8380bd2c81a..cc0698104c4e4 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: 2024-05-29 +date: 2024-05-30 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 e273569263e5c..c70b06c31e4ab 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: 2024-05-29 +date: 2024-05-30 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 0a617285989a4..4cf6691f4226d 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: 2024-05-29 +date: 2024-05-30 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 1ad1c9b62aa21..f327b49a2a9bb 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: 2024-05-29 +date: 2024-05-30 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 7ab36bbb6c3c4..9376abac6a6dd 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: 2024-05-29 +date: 2024-05-30 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 cd41505ad954e..48f7a822b6417 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: 2024-05-29 +date: 2024-05-30 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 5cb9b8e2ea5fe..8df4d33eadd03 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: 2024-05-29 +date: 2024-05-30 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 2bed95925d7dd..ed10c4ad963ae 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: 2024-05-29 +date: 2024-05-30 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 122f8132048ca..d2b83ec74f161 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: 2024-05-29 +date: 2024-05-30 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 170b7d970a644..6e2d3c97b6ab6 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: 2024-05-29 +date: 2024-05-30 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 e5e0c669c2a3f..3c5afa615ea55 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: 2024-05-29 +date: 2024-05-30 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 a9a62aca790b2..27357810cde60 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: 2024-05-29 +date: 2024-05-30 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 cc33c019741af..e436be19d33cd 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: 2024-05-29 +date: 2024-05-30 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 84268c1e0bf80..8522aa5abc5db 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: 2024-05-29 +date: 2024-05-30 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index b97d004863fa4..8515f0d87bb51 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index d7fba39e9822b..9547bf4983d15 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 2de354da84e19..6ee4eaa432f69 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 2ce5025e537dc..aa3a5d80ad5df 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 9b6e61aa92d3e..5a886d66da9ca 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 33483f5706366..71d732881a4ce 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 669eac907658c..085e43419178e 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 150167976d2a0..fcc77223bf69d 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: 2024-05-29 +date: 2024-05-30 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 7930ca8c78750..103146bc4f908 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: 2024-05-29 +date: 2024-05-30 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 a4ce595258886..5dcf7b51c511c 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: 2024-05-29 +date: 2024-05-30 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 d500a2f61bd51..cb93e88c85e22 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 450808dd3e665..389c20665af47 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 3d78274a8dfd6..80e36d9ef7f33 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: 2024-05-29 +date: 2024-05-30 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 df9c6509d4919..f70ffc048c227 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 5a4bed8057a5f..41eae87916b14 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 4f8c3734084e8..32dca957a52b4 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index e68d0be8cb5c4..cd6c368c9ba9e 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 391ff3ac1c553..f05256054d026 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 77033f3bb2fb4..8c4fa10b49d45 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: 2024-05-29 +date: 2024-05-30 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 fa1ff755f9a9a..7233d88edec4c 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: 2024-05-29 +date: 2024-05-30 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 59926895b3fd2..7005b2230e60f 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 2f722dc532638..2fb8eb93b2972 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.devdocs.json b/api_docs/kbn_deeplinks_management.devdocs.json index d8f71a95dfb1e..c4b7d9dd33259 100644 --- a/api_docs/kbn_deeplinks_management.devdocs.json +++ b/api_docs/kbn_deeplinks_management.devdocs.json @@ -45,7 +45,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"monitoring\" | \"management\" | \"integrations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\"" + "\"fleet\" | \"monitoring\" | \"management\" | \"integrations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:settings\" | \"management:dataViews\" | \"management:spaces\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\"" ], "path": "packages/deeplinks/management/deep_links.ts", "deprecated": false, @@ -60,7 +60,7 @@ "label": "LinkId", "description": [], "signature": [ - "\"transform\" | \"watcher\" | \"cases\" | \"tags\" | \"maintenanceWindows\" | \"settings\" | \"dataViews\" | \"spaces\" | \"users\" | \"migrate_data\" | \"search_sessions\" | \"filesManagement\" | \"roles\" | \"reporting\" | \"aiAssistantManagementSelection\" | \"securityAiAssistantManagement\" | \"observabilityAiAssistantManagement\" | \"api_keys\" | \"cross_cluster_replication\" | \"license_management\" | \"index_lifecycle_management\" | \"index_management\" | \"ingest_pipelines\" | \"jobsListLink\" | \"objects\" | \"pipelines\" | \"remote_clusters\" | \"role_mappings\" | \"rollup_jobs\" | \"snapshot_restore\" | \"triggersActions\" | \"triggersActionsConnectors\" | \"upgrade_assistant\"" + "\"transform\" | \"watcher\" | \"cases\" | \"tags\" | \"maintenanceWindows\" | \"settings\" | \"dataViews\" | \"spaces\" | \"users\" | \"migrate_data\" | \"search_sessions\" | \"data_quality\" | \"filesManagement\" | \"roles\" | \"reporting\" | \"aiAssistantManagementSelection\" | \"securityAiAssistantManagement\" | \"observabilityAiAssistantManagement\" | \"api_keys\" | \"cross_cluster_replication\" | \"license_management\" | \"index_lifecycle_management\" | \"index_management\" | \"ingest_pipelines\" | \"jobsListLink\" | \"objects\" | \"pipelines\" | \"remote_clusters\" | \"role_mappings\" | \"rollup_jobs\" | \"snapshot_restore\" | \"triggersActions\" | \"triggersActionsConnectors\" | \"upgrade_assistant\"" ], "path": "packages/deeplinks/management/deep_links.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 4f39fbc450add..c05054ed44860 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: 2024-05-29 +date: 2024-05-30 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 828fe07e2e4cd..e9b422387ea98 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.devdocs.json b/api_docs/kbn_deeplinks_observability.devdocs.json index 14200f3af3c7f..b69b1bdad957c 100644 --- a/api_docs/kbn_deeplinks_observability.devdocs.json +++ b/api_docs/kbn_deeplinks_observability.devdocs.json @@ -393,6 +393,20 @@ "path": "packages/deeplinks/observability/locators/observability_onboarding.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/deeplinks-observability", + "id": "def-common.ObservabilityOnboardingLocatorParams.category", + "type": "string", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/deeplinks/observability/locators/observability_onboarding.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 9153cd428c310..54e2d0e6947c4 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 44 | 0 | 32 | 0 | +| 45 | 0 | 33 | 0 | ## Common diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 45a4b7665e13e..af39b1bdff36a 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.devdocs.json b/api_docs/kbn_deeplinks_security.devdocs.json index 7010442c5ab4f..1e9a52bf2b368 100644 --- a/api_docs/kbn_deeplinks_security.devdocs.json +++ b/api_docs/kbn_deeplinks_security.devdocs.json @@ -58,7 +58,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\"" + "\"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\"" ], "path": "packages/deeplinks/security/index.ts", "deprecated": false, @@ -73,7 +73,7 @@ "label": "LinkId", "description": [], "signature": [ - "\"\" | \"cases\" | \"alerts\" | \"rules\" | \"policy\" | \"overview\" | \"dashboards\" | \"cases_create\" | \"cases_configure\" | \"hosts\" | \"users\" | \"cloud_defend-policies\" | \"cloud_security_posture-dashboard\" | \"cloud_security_posture-findings\" | \"cloud_security_posture-benchmarks\" | \"kubernetes\" | \"network\" | \"explore\" | \"assets\" | \"cloud_defend\" | \"administration\" | \"attack_discovery\" | \"blocklist\" | \"cloud_security_posture-rules\" | \"data_quality\" | \"detections\" | \"detection_response\" | \"endpoints\" | \"event_filters\" | \"exceptions\" | \"host_isolation_exceptions\" | \"hosts-all\" | \"hosts-anomalies\" | \"hosts-risk\" | \"hosts-events\" | \"hosts-sessions\" | \"hosts-uncommon_processes\" | \"investigations\" | \"get_started\" | \"machine_learning-landing\" | \"network-anomalies\" | \"network-dns\" | \"network-events\" | \"network-flows\" | \"network-http\" | \"network-tls\" | \"response_actions_history\" | \"rules-add\" | \"rules-create\" | \"rules-landing\" | \"threat_intelligence\" | \"timelines\" | \"timelines-templates\" | \"trusted_apps\" | \"users-all\" | \"users-anomalies\" | \"users-authentications\" | \"users-events\" | \"users-risk\" | \"entity_analytics\" | \"entity_analytics-management\" | \"entity_analytics-asset-classification\" | \"coverage-overview\"" + "\"\" | \"cases\" | \"alerts\" | \"rules\" | \"policy\" | \"overview\" | \"dashboards\" | \"cases_create\" | \"cases_configure\" | \"hosts\" | \"users\" | \"cloud_defend-policies\" | \"cloud_security_posture-dashboard\" | \"cloud_security_posture-findings\" | \"cloud_security_posture-benchmarks\" | \"kubernetes\" | \"network\" | \"data_quality\" | \"explore\" | \"assets\" | \"cloud_defend\" | \"administration\" | \"attack_discovery\" | \"blocklist\" | \"cloud_security_posture-rules\" | \"detections\" | \"detection_response\" | \"endpoints\" | \"event_filters\" | \"exceptions\" | \"host_isolation_exceptions\" | \"hosts-all\" | \"hosts-anomalies\" | \"hosts-risk\" | \"hosts-events\" | \"hosts-sessions\" | \"hosts-uncommon_processes\" | \"investigations\" | \"get_started\" | \"machine_learning-landing\" | \"network-anomalies\" | \"network-dns\" | \"network-events\" | \"network-flows\" | \"network-http\" | \"network-tls\" | \"response_actions_history\" | \"rules-add\" | \"rules-create\" | \"rules-landing\" | \"threat_intelligence\" | \"timelines\" | \"timelines-templates\" | \"trusted_apps\" | \"users-all\" | \"users-anomalies\" | \"users-authentications\" | \"users-events\" | \"users-risk\" | \"entity_analytics\" | \"entity_analytics-management\" | \"entity_analytics-asset-classification\" | \"coverage-overview\"" ], "path": "packages/deeplinks/security/index.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 8dd6db23713e1..822f99c3a467a 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 7c0da3fa2b3f2..a46a3f08d824e 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 666cde48cd84d..3b6fabb0a1057 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: 2024-05-29 +date: 2024-05-30 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 bee29ae322baf..e4a2d4169f024 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: 2024-05-29 +date: 2024-05-30 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 e697dd3db7538..feaa96ec118e5 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: 2024-05-29 +date: 2024-05-30 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 155dc1eaecafc..81fca8dc1da8c 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: 2024-05-29 +date: 2024-05-30 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 f372248664c05..f109f5050ca92 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: 2024-05-29 +date: 2024-05-30 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 89f0d0ab3fcec..8d91b7d8c928a 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: 2024-05-29 +date: 2024-05-30 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 a1f923e5bd0c3..fd7c391c3213c 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: 2024-05-29 +date: 2024-05-30 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 d94d63b9b4c0c..b682edd0f554c 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: 2024-05-29 +date: 2024-05-30 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 156cb3cf10cb3..284133021ee58 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: 2024-05-29 +date: 2024-05-30 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 e8a38f356296d..571a7410491b6 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: 2024-05-29 +date: 2024-05-30 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 530efe8cb3cac..9c9ea9a0f7d2b 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: 2024-05-29 +date: 2024-05-30 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 c3e6efc3e04e9..1759d9166b2ae 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: 2024-05-29 +date: 2024-05-30 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 9b3afe838382e..b00082eceb326 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 72c44ba0099fd..c9116817f025c 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: 2024-05-29 +date: 2024-05-30 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_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 4e843fdec97ab..8033187211e64 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index e5526e5dbd3ec..a1def95875329 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 97006b1776e45..e9032dff60fb9 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 1e5ad928a47b2..6ec924c24e8d0 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 04ae27e55892a..c9c2b50acc5aa 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: 2024-05-29 +date: 2024-05-30 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 3d401fa4c507b..a217405d7fda6 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: 2024-05-29 +date: 2024-05-30 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 08d5dbb3fb50f..74f9df5f97387 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: 2024-05-29 +date: 2024-05-30 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 734c932c34dca..1cd37cb3c401d 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.devdocs.json b/api_docs/kbn_es_types.devdocs.json index 4409a30d1ad76..361debae97fae 100644 --- a/api_docs/kbn_es_types.devdocs.json +++ b/api_docs/kbn_es_types.devdocs.json @@ -78,17 +78,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "@kbn/es-types", - "id": "def-common.ESQLSearchParams.version", - "type": "string", - "tags": [], - "label": "version", - "description": [], - "path": "packages/kbn-es-types/src/search.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "@kbn/es-types", "id": "def-common.ESQLSearchParams.filter", diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index b393fb12defe5..92c151408814c 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.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 | |-------------------|-----------|------------------------|-----------------| -| 26 | 0 | 26 | 1 | +| 25 | 0 | 25 | 1 | ## Common diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index cd48c451c0ba7..a7b35fc496106 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 81971ac951b86..fc66edf3e5efc 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json index c24e9c4eea755..9619ecf037296 100644 --- a/api_docs/kbn_esql_utils.devdocs.json +++ b/api_docs/kbn_esql_utils.devdocs.json @@ -1085,21 +1085,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/esql-utils", - "id": "def-common.ESQL_LATEST_VERSION", - "type": "string", - "tags": [], - "label": "ESQL_LATEST_VERSION", - "description": [], - "signature": [ - "\"2024.04.01\"" - ], - "path": "packages/kbn-esql-utils/constants.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/esql-utils", "id": "def-common.TextBasedLanguages", diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index e62ba612ac672..d85a5d56b513b 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 54 | 0 | 52 | 0 | +| 53 | 0 | 51 | 0 | ## Common diff --git a/api_docs/kbn_esql_validation_autocomplete.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index b97b81a2eb1f5..62b098674af5c 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -3407,7 +3407,7 @@ "\nThis is useful to identify the suggestion type and apply different styles to it." ], "signature": [ - "\"Text\" | \"Operator\" | \"Field\" | \"Function\" | \"Method\" | \"Variable\" | \"Class\" | \"Value\" | \"Constant\" | \"Keyword\" | \"Reference\" | \"Snippet\" | \"Issue\"" + "\"Value\" | \"Text\" | \"Operator\" | \"Field\" | \"Function\" | \"Method\" | \"Variable\" | \"Class\" | \"Constant\" | \"Keyword\" | \"Reference\" | \"Snippet\" | \"Issue\"" ], "path": "packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts", "deprecated": false, @@ -3916,7 +3916,7 @@ "label": "ItemKind", "description": [], "signature": [ - "\"Text\" | \"Operator\" | \"Field\" | \"Function\" | \"Method\" | \"Variable\" | \"Class\" | \"Value\" | \"Constant\" | \"Keyword\" | \"Reference\" | \"Snippet\" | \"Issue\"" + "\"Value\" | \"Text\" | \"Operator\" | \"Field\" | \"Function\" | \"Method\" | \"Variable\" | \"Class\" | \"Constant\" | \"Keyword\" | \"Reference\" | \"Snippet\" | \"Issue\"" ], "path": "packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts", "deprecated": false, diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 3c8c01015cc55..0960bc405e550 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 7f07e5d7742e0..573e9ac1ddced 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: 2024-05-29 +date: 2024-05-30 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 8b38be1baeb5d..6c541b9655f95 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: 2024-05-29 +date: 2024-05-30 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 f7ff9839feb8f..9b7d2f84ccd0f 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: 2024-05-29 +date: 2024-05-30 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 39d536d9b1aad..7a279f982dab2 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: 2024-05-29 +date: 2024-05-30 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 9b2795366d5d2..b03ed53c79f02 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: 2024-05-29 +date: 2024-05-30 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 2d9342245c579..1bbb5413d7ae0 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: 2024-05-29 +date: 2024-05-30 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_formatters.mdx b/api_docs/kbn_formatters.mdx index 28b050cb4cb0c..58d31190150a5 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 2293c0ce331bb..d42255b234e7d 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: 2024-05-29 +date: 2024-05-30 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_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 76d4d588f18d0..fcb94f49e89f5 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index bfa4fb4ef09cd..b0e84b0322dd2 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: 2024-05-29 +date: 2024-05-30 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 5104d81db6ed9..308533cb3bd13 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: 2024-05-29 +date: 2024-05-30 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 f25b5401a438f..e3570f301c92b 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 4ee71834cfc79..041705fe791b8 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index a131f72746e80..2f140b9335eac 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: 2024-05-29 +date: 2024-05-30 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 1b38be8f7b4b6..f0ce2a1f4dbe3 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: 2024-05-29 +date: 2024-05-30 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 b47d375877197..bbb1f3cf78b49 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: 2024-05-29 +date: 2024-05-30 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 6363b90d26cd7..76fc599c178bc 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: 2024-05-29 +date: 2024-05-30 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 8229e3f115401..06e00b5be799e 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: 2024-05-29 +date: 2024-05-30 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 c706945ebe085..a9571544fc938 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: 2024-05-29 +date: 2024-05-30 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 cf3a58e585179..7ebbf286b7ee3 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: 2024-05-29 +date: 2024-05-30 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 eb37efb2c274b..82a2ea2eb90f1 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: 2024-05-29 +date: 2024-05-30 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 cce7021d1e9d9..d65797c2c8429 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 46e61432d1a0e..edf692572a144 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 648815195e4ee..d534cf4983191 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 7bad8eae3f96a..da6220bf11067 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: 2024-05-29 +date: 2024-05-30 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 a674060403a40..c4fcac359b2d3 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: 2024-05-29 +date: 2024-05-30 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 da9d5b0d6a703..3a13a57222647 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 1959bfdff32eb..abe9b8ea0ec8e 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index a253f26f5f552..3069351584fb4 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: 2024-05-29 +date: 2024-05-30 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 9f6e84b07f3dd..2387db5ad2083 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: 2024-05-29 +date: 2024-05-30 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 c65f7babd0dd3..b1147e2391280 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: 2024-05-29 +date: 2024-05-30 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 b9b2d4e7628e0..35958e043559b 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: 2024-05-29 +date: 2024-05-30 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 550b975e630eb..92e891cf03416 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: 2024-05-29 +date: 2024-05-30 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 f5f88cf2f89ed..84801c27cf37e 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 4d5da35782ab2..ea03eefceed5e 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index ad33252a24b8a..104f755813b61 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: 2024-05-29 +date: 2024-05-30 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 9549fc9e2724a..aa9ca8b215de9 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 2b35d55b270af..79d8fb6046e67 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index cd4ee5d87343d..7e6eb9cf30a86 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: 2024-05-29 +date: 2024-05-30 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 7eaa89828d50a..86455c2c192e8 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: 2024-05-29 +date: 2024-05-30 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 8beec4429212e..79fe199a6a5b6 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: 2024-05-29 +date: 2024-05-30 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 14f74ac2f5f2e..50996313e0548 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: 2024-05-29 +date: 2024-05-30 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 9de4059db6350..21c33874fca8f 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: 2024-05-29 +date: 2024-05-30 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 6791adcc44173..ca14318873ea4 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: 2024-05-29 +date: 2024-05-30 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 e1547fdc54015..e191cab62f11f 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: 2024-05-29 +date: 2024-05-30 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 ee1e31955c093..c0201109e75c7 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: 2024-05-29 +date: 2024-05-30 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 fd713dce7dc15..1f3fa2eb46ae7 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: 2024-05-29 +date: 2024-05-30 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 71ca15a4b25a8..b66ea47c87f80 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: 2024-05-29 +date: 2024-05-30 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 73dc24bc36b6b..c1584ccebeead 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: 2024-05-29 +date: 2024-05-30 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 bc51da036ffc9..f9226457edeb2 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: 2024-05-29 +date: 2024-05-30 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 c52ab81cad00b..47a4743f42599 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: 2024-05-29 +date: 2024-05-30 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 e183ab14fd443..1a96ca3158586 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: 2024-05-29 +date: 2024-05-30 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 e21d49335fdf8..4c794a30fbd57 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: 2024-05-29 +date: 2024-05-30 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 5207f6d3a9254..6d512339bcd6f 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: 2024-05-29 +date: 2024-05-30 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 5e7a30c65ec21..be076979ac65b 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: 2024-05-29 +date: 2024-05-30 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_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 676d110cc330f..17682476206b5 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 6232dc2384f0d..53411d9951138 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: 2024-05-29 +date: 2024-05-30 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 ee0ecca9da86f..562b50546c120 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: 2024-05-29 +date: 2024-05-30 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 5d7b6f1e1aced..a14805c096123 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: 2024-05-29 +date: 2024-05-30 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 ca7e55f7909e5..1123e04b87085 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: 2024-05-29 +date: 2024-05-30 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 d87912e5eec66..b59d7e64d945d 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: 2024-05-29 +date: 2024-05-30 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 7ae1929f9f820..e250e1cf6295f 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: 2024-05-29 +date: 2024-05-30 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 a61c5a3124b17..0768247af44f1 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: 2024-05-29 +date: 2024-05-30 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 fe34d341b3c69..d28355633a9d0 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: 2024-05-29 +date: 2024-05-30 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 a5754c3e47890..b1fbd41b1d5a6 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: 2024-05-29 +date: 2024-05-30 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 f0f2d80130e14..9dc9bd4d4dcf9 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: 2024-05-29 +date: 2024-05-30 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 eeceb4f566ee3..8db698d34eb98 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: 2024-05-29 +date: 2024-05-30 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 65b059b11282a..ba1ec0a60a613 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: 2024-05-29 +date: 2024-05-30 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 40e6d32b4bf2b..3b321c158499a 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: 2024-05-29 +date: 2024-05-30 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 ba1eab9dc4605..1a1545c3ef4ab 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: 2024-05-29 +date: 2024-05-30 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 8a5ae540c8088..36ac006a8ca41 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: 2024-05-29 +date: 2024-05-30 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 06e8c185b55b0..0dbbcaebe4407 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: 2024-05-29 +date: 2024-05-30 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 63e91ed111667..4e3e01afe1381 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: 2024-05-29 +date: 2024-05-30 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 2840da58f0a9a..250f337851e74 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: 2024-05-29 +date: 2024-05-30 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 e842fe1e66c4a..4393dc9f0ff38 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: 2024-05-29 +date: 2024-05-30 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_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 9756c675e2a28..9ac9baecc69fb 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 2179e595d763f..d9fcf3c47b11e 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: 2024-05-29 +date: 2024-05-30 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_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 977b1d1f70dd8..23c18562d99a8 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index cd0768d2116e9..c92816be5bdc4 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 85cb583271336..3e3c75cf3e206 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 47ef1337f9d9c..68159ed652de6 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: 2024-05-29 +date: 2024-05-30 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 4f7f6d2945a10..95d78f703e077 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: 2024-05-29 +date: 2024-05-30 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 a35f61d80c30c..08de3478b65a2 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: 2024-05-29 +date: 2024-05-30 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 4eabccbc422f8..f610b4954aadd 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: 2024-05-29 +date: 2024-05-30 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_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 91d89d345d577..07b3c80eeafbb 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 0932166c27899..7ccb02e02b6d8 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 79dc14e68c68c..ba5c828963d9c 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: 2024-05-29 +date: 2024-05-30 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 35ec4482666bf..7eb5accb70ada 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: 2024-05-29 +date: 2024-05-30 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 f6dfaab50b571..3348c27599c3c 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: 2024-05-29 +date: 2024-05-30 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 5a3a797b83ab4..bbaf5264dbc7c 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: 2024-05-29 +date: 2024-05-30 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_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 7955ea11a5d78..c74bdc06bd036 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index b5c3bf0347fbe..cede1616f0f3d 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: 2024-05-29 +date: 2024-05-30 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_check.mdx b/api_docs/kbn_plugin_check.mdx index 3478f7d41f294..26ea38650febc 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index b18d2d49297f7..ef4c9cf5054b1 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: 2024-05-29 +date: 2024-05-30 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 028dbb0726b15..d886cf308d9ad 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index d386c30196202..599d0c5d9870f 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index 93e1c1bf2fbf5..7852cd38d7ad4 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -4850,10 +4850,10 @@ "children": [ { "parentPluginId": "@kbn/presentation-publishing", - "id": "def-common.PublishesPhaseEvents.onPhaseChange", + "id": "def-common.PublishesPhaseEvents.phase$", "type": "Object", "tags": [], - "label": "onPhaseChange", + "label": "phase$", "description": [], "signature": [ "{ source: ", diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index ecbecf99768bd..dd58326e1f430 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 5f0f7ff3326a2..f5e72be894736 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: 2024-05-29 +date: 2024-05-30 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 03e9c81b6c22e..e2c9b8d5f4973 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: 2024-05-29 +date: 2024-05-30 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 8c0793e2cdb2d..c8374faeb2c3a 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 060169583ebe5..5576a84c928d9 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index e1ea6f925f802..e1d8178fc29f3 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: 2024-05-29 +date: 2024-05-30 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 7c3978f0d1962..4655583d17740 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: 2024-05-29 +date: 2024-05-30 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 3d8a44b13c13f..404ae256a8157 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: 2024-05-29 +date: 2024-05-30 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 a1e9c85f5c6bc..f8c6ef5406df6 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: 2024-05-29 +date: 2024-05-30 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 18cf6d5cbd1f5..b8b58d4e4b1c3 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: 2024-05-29 +date: 2024-05-30 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 9f6759ef597ef..a835b02f25e3d 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: 2024-05-29 +date: 2024-05-30 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 8b761045d6051..06a737d81a66e 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: 2024-05-29 +date: 2024-05-30 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 26877ca76d747..598d92e8007f0 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: 2024-05-29 +date: 2024-05-30 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 78738c3399d71..98e01eb9b2890 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: 2024-05-29 +date: 2024-05-30 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 bf8bfc9339e26..31693f357d83a 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: 2024-05-29 +date: 2024-05-30 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 c84b8e057fd8a..d4c4f6189f3dd 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index ee61dd1705dc9..8b143362ac5e5 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 6e99c308a69d2..cfc26ba1793f0 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 36bc1ef38c6e8..aceb90260f65f 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 41f3d46a1ef1a..42f883d702045 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index c7b4239fb2c3a..8d8e04d839c78 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 8442d874cc37f..ceb2b43ff05ad 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index d299e3c445d60..a72216b2bdda0 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 63563ed8de816..b9b85d8c7bfbb 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 1ae0698babc8d..13de5db2ae33e 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 8a5d6aae5a5c8..dd8a569fc9706 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 6fa3e464ca73c..4d58c9b756760 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: 2024-05-29 +date: 2024-05-30 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 e1a848d6e5a6c..344574f021c29 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index de24eb38e0c77..fd4b8966a294b 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index e9df8b8fa21b4..4394fdcc65f5a 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index f778eb1591381..37a10455ed0fc 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index e9874639044e9..53955a8b0dd28 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 121dccc98b1eb..b4e7dcceb8b54 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: 2024-05-29 +date: 2024-05-30 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 c46038af1c8c4..c82b7455b1df3 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: 2024-05-29 +date: 2024-05-30 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 59ab305321db3..1d0ee00825004 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 93f058740ddd0..92a4bf40e3e89 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index cdd9d55566e2a..795404e591898 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 2bbe31b2c07f2..9351880482b58 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 82796564a5e40..4f834646fff69 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 0505f65c1d8ff..46551cc33d3ec 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 75e1bd0d1198b..79e508ebdf62a 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 57326e98d4e4f..dccb8d6980b1d 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index c5afd40c17d75..a6b08fd347ab7 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index a5aa320bbf2e4..e8f30ae1bcd6a 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: 2024-05-29 +date: 2024-05-30 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 c4305fd8c4f3f..22fc22627c499 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: 2024-05-29 +date: 2024-05-30 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 4e1bf0bc64e00..c79ed371c5486 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: 2024-05-29 +date: 2024-05-30 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 6751fe700dd8c..300eae2f220e3 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: 2024-05-29 +date: 2024-05-30 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 9958f18b6e39c..2474165f850ef 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: 2024-05-29 +date: 2024-05-30 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 4d94aba1f684d..17d073c1f15a9 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: 2024-05-29 +date: 2024-05-30 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 939448192b699..f15bee163eeb8 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: 2024-05-29 +date: 2024-05-30 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 13a5b1b4e540e..5a521957b7962 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index b0f690f365aac..5382edc3d95e3 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -851,7 +851,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -865,7 +865,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -1004,7 +1004,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1018,7 +1018,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1144,7 +1144,7 @@ "label": "showValueListModal", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 25f7671c7ef01..3e391a6a7219d 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: 2024-05-29 +date: 2024-05-30 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 30ea2c74913cf..524c60976475e 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: 2024-05-29 +date: 2024-05-30 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 52d76b31ed23f..9b0da04a4d816 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: 2024-05-29 +date: 2024-05-30 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 6984de3771900..57ab0d004f876 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: 2024-05-29 +date: 2024-05-30 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 43ba319842cdf..47c204bc96c32 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: 2024-05-29 +date: 2024-05-30 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 aea05bfebb452..bcf210581a41f 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: 2024-05-29 +date: 2024-05-30 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 7c51eb98f7b77..81e1cfec63c57 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: 2024-05-29 +date: 2024-05-30 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 08223476c9753..7d2c8951ef3b5 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: 2024-05-29 +date: 2024-05-30 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 be3ec4535f07e..3c61bbf0ca8ce 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: 2024-05-29 +date: 2024-05-30 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 e21b784761e9e..ad00618b6bc11 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: 2024-05-29 +date: 2024-05-30 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 451722474ce63..f43e58c6fe396 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: 2024-05-29 +date: 2024-05-30 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 7dcda6af382e5..35c2cff8d3abc 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: 2024-05-29 +date: 2024-05-30 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 e9dafd5c86223..b88dfa24226fc 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: 2024-05-29 +date: 2024-05-30 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 0681baacf2733..aec425aab46f0 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: 2024-05-29 +date: 2024-05-30 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.devdocs.json b/api_docs/kbn_server_route_repository.devdocs.json index 9d1eff9b4a4fd..53541ee357d4d 100644 --- a/api_docs/kbn_server_route_repository.devdocs.json +++ b/api_docs/kbn_server_route_repository.devdocs.json @@ -644,7 +644,7 @@ "section": "def-common.Type", "text": "Type" }, - " | null>" + " | null>" ], "path": "packages/kbn-server-route-repository/src/route_validation_object.ts", "deprecated": false, diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 86859f5a4e7be..e5bfd2f599dbc 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: 2024-05-29 +date: 2024-05-30 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 3623db82b218d..fc99340bb8969 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: 2024-05-29 +date: 2024-05-30 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 74ff14b79b8a8..29302612cfcda 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: 2024-05-29 +date: 2024-05-30 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 9da159e2a590e..c527d253341d1 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: 2024-05-29 +date: 2024-05-30 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 96d6f6503b4f4..f4e6ff77b9366 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: 2024-05-29 +date: 2024-05-30 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 c9aea61726c6c..e892da216ad08 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: 2024-05-29 +date: 2024-05-30 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 5d5ff6b238772..cb9f3b819459e 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: 2024-05-29 +date: 2024-05-30 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 b8c82d96b7da2..39bb2a2694a50 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: 2024-05-29 +date: 2024-05-30 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 a80b0a39011a8..6d863213bc7d4 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: 2024-05-29 +date: 2024-05-30 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 092698aeb0d4e..a114fde5504e6 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: 2024-05-29 +date: 2024-05-30 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 268fdf085ed41..5c482e595a03d 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: 2024-05-29 +date: 2024-05-30 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 5521de80aeca9..db6df81508230 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: 2024-05-29 +date: 2024-05-30 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 9cbb2ac15c969..b6228acfde0b1 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: 2024-05-29 +date: 2024-05-30 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 740875786b49a..dd07f9238792d 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: 2024-05-29 +date: 2024-05-30 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 5eef0cb26fd71..0656fa534dd27 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: 2024-05-29 +date: 2024-05-30 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 669162d6191c7..1ef78791aa24d 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: 2024-05-29 +date: 2024-05-30 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 d4f60a6892ac3..84743db1152bd 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: 2024-05-29 +date: 2024-05-30 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 b08292889c6a7..043140a3306ea 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: 2024-05-29 +date: 2024-05-30 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 bbd7d59914b7d..cf0b043d72ca3 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: 2024-05-29 +date: 2024-05-30 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 99504d05dceb8..63016dbc3ac48 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: 2024-05-29 +date: 2024-05-30 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 b556e51ba2408..6cff4bd94ffe7 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: 2024-05-29 +date: 2024-05-30 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 8ee12713b8ba7..99a455560535c 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: 2024-05-29 +date: 2024-05-30 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 9a43fc6df3867..7dcfeda2db7f9 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: 2024-05-29 +date: 2024-05-30 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 502265d53afa0..d6db754638648 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: 2024-05-29 +date: 2024-05-30 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 10bc45d8369d7..adab7971142de 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: 2024-05-29 +date: 2024-05-30 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 d05f0ff68e7b8..be24e3dad0713 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: 2024-05-29 +date: 2024-05-30 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 ff7ee729abb9e..c888251a68be0 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: 2024-05-29 +date: 2024-05-30 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 4733dfa9cdf56..9e3296cadcb15 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: 2024-05-29 +date: 2024-05-30 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 bf040af82c866..5dbce57a39b49 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: 2024-05-29 +date: 2024-05-30 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 71373d3746508..a5c6f7c931bb7 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: 2024-05-29 +date: 2024-05-30 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 a6ee6f2dc8ab0..d4db0ecc082dc 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: 2024-05-29 +date: 2024-05-30 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 c80bcbdc02381..90dce72fa5ad9 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: 2024-05-29 +date: 2024-05-30 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 d6057d783ae42..fb062cf427c84 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: 2024-05-29 +date: 2024-05-30 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 bd389f4196ac0..d478592845c9c 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: 2024-05-29 +date: 2024-05-30 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 c1769773175eb..87f6051401bad 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: 2024-05-29 +date: 2024-05-30 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 320ad9d29a8d0..1d478d235f50a 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: 2024-05-29 +date: 2024-05-30 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 20da5f31ac7d0..7ad40f58d0588 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: 2024-05-29 +date: 2024-05-30 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 06902dacce80e..7035da8ab4577 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: 2024-05-29 +date: 2024-05-30 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 b8891b96ef8f3..4560ad45997a1 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: 2024-05-29 +date: 2024-05-30 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 2f9096d7e059a..aa42b3761046b 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: 2024-05-29 +date: 2024-05-30 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 b36b8fbb6629a..e2eb2ecfacc8f 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: 2024-05-29 +date: 2024-05-30 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 65b2610ed36da..231383d0300db 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: 2024-05-29 +date: 2024-05-30 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 94aa103f88535..a0de6a5822202 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: 2024-05-29 +date: 2024-05-30 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 0143a672336d2..cb0d679679f79 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: 2024-05-29 +date: 2024-05-30 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 96b189b862fda..1c622a21c576c 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: 2024-05-29 +date: 2024-05-30 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_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 891761bf30658..937eaf4b75a65 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index b8833254cacb0..913e35af8e6a4 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: 2024-05-29 +date: 2024-05-30 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.mdx b/api_docs/kbn_slo_schema.mdx index 520002519b36f..5b9a047d0d973 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index a01b66ff6eaa9..b28c011599a37 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index ad4dffa353fff..2a2086db62492 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index e0509e449006d..8d912149a1429 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: 2024-05-29 +date: 2024-05-30 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 2b492299c5904..54f9f59f2133d 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: 2024-05-29 +date: 2024-05-30 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 16b5de363bc18..f70f7975bcc83 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 07a6e081b1b98..51bd49aef405d 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: 2024-05-29 +date: 2024-05-30 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 1f24c05d35931..7ff2241307027 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 46d1849cc3f49..83c43f9c04b8e 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 012c469c093e6..01b08e2043213 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: 2024-05-29 +date: 2024-05-30 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 b0c3e40c36f3c..b9643575f3f1e 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: 2024-05-29 +date: 2024-05-30 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 b450c2ec85731..4e33b74527ec0 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 2d15d4da87be6..886535c8b4b12 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index e07df68ece172..fd6bae568f5e7 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index c1eabdbb09c8d..4129986ffea36 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 10b12bff24724..a7ccb21e3b78a 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 73b641d24f6e1..84429124feea6 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: 2024-05-29 +date: 2024-05-30 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 338383cb64109..10e58860edf2d 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: 2024-05-29 +date: 2024-05-30 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 d76671f5c7726..ef8540ec0bc3c 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: 2024-05-29 +date: 2024-05-30 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 150baa5efa3f6..71c152f85f573 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: 2024-05-29 +date: 2024-05-30 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 55087a9a03932..9905453f6e1d0 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: 2024-05-29 +date: 2024-05-30 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 3fb4b858e1a63..c3a2ff0da3f93 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: 2024-05-29 +date: 2024-05-30 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 1f70d0a46522d..d842e0edf4cd4 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: 2024-05-29 +date: 2024-05-30 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 bf69a68969c3e..c0f0f8a0a0355 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 6672891a3f009..13965b975cf07 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 434ba66d28bf3..5b214307a0403 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: 2024-05-29 +date: 2024-05-30 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 4ef7ee8f27b13..c1edaab846415 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: 2024-05-29 +date: 2024-05-30 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 4f3f3d2cb59e5..e56719267fa1c 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: 2024-05-29 +date: 2024-05-30 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 9c6b621f45c4a..c802c4ea1075f 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: 2024-05-29 +date: 2024-05-30 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 514f6368bdbec..f1c64930cc7f3 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: 2024-05-29 +date: 2024-05-30 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 16e9763541dcf..53b80932e8d24 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index e744a8a9aa362..48722f636bbfd 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 2046e2666db50..5bdce782a7518 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: 2024-05-29 +date: 2024-05-30 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 5ff542ee72b41..a121db5d63df9 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: 2024-05-29 +date: 2024-05-30 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 d5b34e277ac9b..265b4c6393ab5 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: 2024-05-29 +date: 2024-05-30 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 daf3602fa9472..da24c2f23826c 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: 2024-05-29 +date: 2024-05-30 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 aab47fc5027ec..73369832d2c89 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: 2024-05-29 +date: 2024-05-30 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 9b02336bc56f4..127aa82800b53 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: 2024-05-29 +date: 2024-05-30 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 c23a545360e9e..799d668d1613f 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 2f3d363bdf5b7..be40ea5d7e2e7 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -9584,7 +9584,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -9596,13 +9596,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> & Partial>) | undefined" + " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial>) | undefined" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_renderers.ts", "deprecated": false, @@ -11694,7 +11698,7 @@ "LegendPositionConfig", " | undefined; rotation?: ", "Rotation", - " | undefined; debug?: boolean | undefined; locale?: string | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; flatLegend?: boolean | undefined; legendMaxDepth?: number | undefined; legendSize?: number | undefined; showLegendExtra?: boolean | undefined; rendering?: ", + " | undefined; debug?: boolean | undefined; locale?: string | undefined; rendering?: ", "Rendering", " | undefined; animateData?: boolean | undefined; externalPointerEvents?: ", "MakeOverridesSerializable", @@ -11706,13 +11710,17 @@ "PointerUpdateTrigger", " | undefined; brushAxis?: ", "BrushAxis", - " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", + " | undefined; minBrushDelta?: number | undefined; allowBrushingLastHistogramBin?: boolean | undefined; ariaLabelHeadingLevel?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | undefined; ariaUseDefaultSummary?: boolean | undefined; dow?: number | undefined; legendValues?: ", + "MakeOverridesSerializable", + "<", + "LegendValue", + "[] | undefined>; legendMaxDepth?: number | undefined; legendSize?: number | undefined; flatLegend?: boolean | undefined; ariaDescription?: string | undefined; ariaLabel?: string | undefined; xDomain?: ", "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; ariaDescribedBy?: string | undefined; ariaLabelledBy?: string | undefined; ariaTableCaption?: string | undefined; legendAction?: \"ignore\" | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", - " | undefined; onLegendItemClick?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; legendSort?: \"ignore\" | undefined; }>> | Partial> | Partial ", + "QueryDslQueryContainer", + "[]" + ], + "path": "x-pack/plugins/observability_solution/observability/server/utils/queries.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-server.existsQuery.$1", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/observability/server/utils/queries.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-server.getInspectResponse", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 074526c4684fe..fdba75c5ec9e1 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.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 | |-------------------|-----------|------------------------|-----------------| -| 697 | 2 | 688 | 15 | +| 700 | 2 | 691 | 15 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 6200231b5479c..b5f37b9499523 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 874fc592db419..adb2ba702faf6 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 2ae2bc2cde5ce..e858258b600ac 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.devdocs.json b/api_docs/observability_logs_explorer.devdocs.json index 27488393c3581..d223d4c0b72f8 100644 --- a/api_docs/observability_logs_explorer.devdocs.json +++ b/api_docs/observability_logs_explorer.devdocs.json @@ -416,35 +416,6 @@ "path": "x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/index.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "observabilityLogsExplorer", - "id": "def-common.ObservabilityLogsExplorerLocators.datasetQualityLocator", - "type": "Object", - "tags": [], - "label": "datasetQualityLocator", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "common", - "docId": "kibSharePluginApi", - "section": "def-common.LocatorPublic", - "text": "LocatorPublic" - }, - "<", - { - "pluginId": "@kbn/deeplinks-observability", - "scope": "common", - "docId": "kibKbnDeeplinksObservabilityPluginApi", - "section": "def-common.DatasetQualityLocatorParams", - "text": "DatasetQualityLocatorParams" - }, - ">" - ], - "path": "x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/index.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false @@ -452,21 +423,6 @@ ], "enums": [], "misc": [ - { - "parentPluginId": "observabilityLogsExplorer", - "id": "def-common.OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY", - "type": "string", - "tags": [], - "label": "OBSERVABILITY_DATASET_QUALITY_URL_STATE_KEY", - "description": [], - "signature": [ - "\"pageState\"" - ], - "path": "x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observabilityLogsExplorer", "id": "def-common.OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY", diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index bc66ab070e586..30f25c53240e6 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 21 | 0 | 21 | 1 | +| 19 | 0 | 19 | 1 | ## Common diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 888a236c25035..62d2e0bc24733 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: 2024-05-29 +date: 2024-05-30 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 9fc61a9c196ef..660df8e3b1b29 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: 2024-05-29 +date: 2024-05-30 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 4c7bfee550cf6..b6ca97633037c 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: 2024-05-29 +date: 2024-05-30 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 bbacb16f93da1..d0bbab671e3b0 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: 2024-05-29 +date: 2024-05-30 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 957fc19474d36..3a40c8e99d08f 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,17 +21,17 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48476 | 241 | 36969 | 1867 | +| 48503 | 241 | 36990 | 1870 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 303 | 0 | 297 | 32 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 307 | 0 | 301 | 32 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 74 | 0 | 9 | 2 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 865 | 1 | 833 | 54 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 868 | 1 | 836 | 54 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 123 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 9 | 0 | 9 | 2 | @@ -57,11 +57,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 116 | 0 | 113 | 13 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3183 | 31 | 2576 | 24 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3185 | 31 | 2576 | 24 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 1158 | 0 | 402 | 3 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 1159 | 0 | 402 | 3 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 4 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 10 | 0 | 10 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 15 | 0 | 9 | 2 | @@ -98,7 +99,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 84 | 0 | 84 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 0 | 2 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1310 | 5 | 1189 | 66 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1322 | 5 | 1201 | 69 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -142,11 +143,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 697 | 2 | 688 | 15 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 700 | 2 | 691 | 15 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 256 | 1 | 254 | 26 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 21 | 0 | 21 | 1 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 19 | 0 | 19 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 16 | 0 | 16 | 0 | | | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 355 | 1 | 350 | 22 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 | @@ -160,7 +161,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 21 | 0 | 21 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 276 | 0 | 247 | 14 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 24 | 0 | 19 | 2 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 131 | 2 | 120 | 5 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 132 | 2 | 121 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 164 | 0 | 150 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 89 | 0 | 83 | 3 | @@ -276,7 +277,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 47 | 0 | 31 | 3 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 194 | 1 | 127 | 0 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 195 | 1 | 128 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | @@ -393,8 +394,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2 | 0 | 2 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 1 | 12 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 112 | 1 | 0 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 356 | 1 | 5 | 2 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 113 | 1 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 357 | 1 | 5 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 226 | 0 | 183 | 11 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | @@ -406,7 +407,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 128 | 0 | 94 | 45 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 559 | 1 | 132 | 4 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 561 | 1 | 133 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 71 | 0 | 70 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 14 | 0 | 14 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 36 | 0 | 6 | 0 | @@ -464,7 +465,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 3 | 0 | 3 | 0 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 44 | 0 | 32 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 45 | 0 | 33 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 16 | 0 | 16 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 5 | 0 | 5 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | @@ -490,10 +491,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 3 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 269 | 1 | 209 | 15 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 26 | 1 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 25 | 0 | 25 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 63 | 1 | 63 | 6 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 54 | 0 | 52 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 53 | 0 | 51 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 184 | 10 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | @@ -704,7 +705,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 6 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 182 | 0 | 182 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 111 | 2 | 72 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index f09360940b94b..80fbb48488f5a 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 7acf0547b817d..7786d1ba3e0c6 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: 2024-05-29 +date: 2024-05-30 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 2c223c5f259ed..365e9d0e52027 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: 2024-05-29 +date: 2024-05-30 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 bc5dd020190e1..988148ad22ee2 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: 2024-05-29 +date: 2024-05-30 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 35148b96644ed..3d3e65bb73200 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: 2024-05-29 +date: 2024-05-30 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 c604598d8659f..ed1cda2721749 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: 2024-05-29 +date: 2024-05-30 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 0af0b07f75a90..d35ce6a394e69 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: 2024-05-29 +date: 2024-05-30 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 9c21a0d8ce2f0..e7ca57b61da11 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: 2024-05-29 +date: 2024-05-30 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 1bf534ad05fe4..0eeb540bd2536 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.devdocs.json b/api_docs/saved_objects.devdocs.json index f1d5704a5541a..2c8720309314e 100644 --- a/api_docs/saved_objects.devdocs.json +++ b/api_docs/saved_objects.devdocs.json @@ -190,6 +190,22 @@ } ] }, + { + "parentPluginId": "savedObjects", + "id": "def-public.SavedObjectSaveModal.componentDidMount", + "type": "Function", + "tags": [], + "label": "componentDidMount", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/saved_objects/public/save_modal/saved_object_save_modal.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "savedObjects", "id": "def-public.SavedObjectSaveModal.render", diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 877e3239d7858..bdc0df0de23ba 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.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 | |-------------------|-----------|------------------------|-----------------| -| 131 | 2 | 120 | 5 | +| 132 | 2 | 121 | 5 | ## Client diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index e40185d7d628f..2ab314b131583 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: 2024-05-29 +date: 2024-05-30 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 32d5ef6f54113..4576456d90c5e 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: 2024-05-29 +date: 2024-05-30 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 d2efdc22d7b21..66db4381bfd3a 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: 2024-05-29 +date: 2024-05-30 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 99c7bafcb77ce..46a5d68909f86 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: 2024-05-29 +date: 2024-05-30 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 f423f73a0734b..73e95f162fc01 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: 2024-05-29 +date: 2024-05-30 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 ce8c8b276386b..717dcefb5e025 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: 2024-05-29 +date: 2024-05-30 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 ecf90e6ebe4d0..bf8e610472853 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 16c8d823e3451..e86c4812269eb 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index e41fdd01b80dc..9757bd4ce9887 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index ed42898d38082..25b7d68f332a7 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 441daeb551a4a..c903368ec380e 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 09f27f57ce034..69e481d72b998 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3071,7 +3071,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3247,7 +3247,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3313,7 +3313,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; }" + "{ readonly tGridEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 0e12eec301131..c5dfb53f455f4 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: 2024-05-29 +date: 2024-05-30 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 13d49f29ec950..173dc79756940 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: 2024-05-29 +date: 2024-05-30 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 e2e5b80517a35..00247ba52b501 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: 2024-05-29 +date: 2024-05-30 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 d8ce63d49c4df..68397f8d85663 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: 2024-05-29 +date: 2024-05-30 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 3cce736b83abd..e95dcd05836ab 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: 2024-05-29 +date: 2024-05-30 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 31a10ffb06f47..e244e72ed5f6c 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: 2024-05-29 +date: 2024-05-30 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 95461257a3c26..32e062397fc5f 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: 2024-05-29 +date: 2024-05-30 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 6ee4bb09cec71..0e5aa544099da 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index cb6f12faa382c..da74732dd59fb 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 996bfac72f0df..2bbb1da745fcd 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: 2024-05-29 +date: 2024-05-30 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 05f0d02a31405..9a53d289e3cbc 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: 2024-05-29 +date: 2024-05-30 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 ab2fa175ac5da..54a398a4dcccf 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: 2024-05-29 +date: 2024-05-30 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 60988e1115761..27bcd7f8ba48f 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: 2024-05-29 +date: 2024-05-30 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 314f9c9d89004..5a41fdcff1d1f 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: 2024-05-29 +date: 2024-05-30 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 40a95bf4d8f51..c9971762e58b6 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: 2024-05-29 +date: 2024-05-30 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 626692da96bc2..8d290028b40cb 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: 2024-05-29 +date: 2024-05-30 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 abe3e86897ed4..5d16d42664a9b 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: 2024-05-29 +date: 2024-05-30 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 5c274eca8d227..92609c8965adb 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: 2024-05-29 +date: 2024-05-30 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 acfb6f8ab1837..7a03827545f30 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: 2024-05-29 +date: 2024-05-30 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 9183407d9ff46..626e4460e1a0f 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: 2024-05-29 +date: 2024-05-30 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 a1b3276bb1771..9a378896770c2 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: 2024-05-29 +date: 2024-05-30 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 f388167a004a1..0afad78462f91 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: 2024-05-29 +date: 2024-05-30 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 68bb86fe2bb7e..524c7baf686e5 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: 2024-05-29 +date: 2024-05-30 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 9defd00d22529..745d16a376073 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: 2024-05-29 +date: 2024-05-30 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 99d37a2ed05e0..5067ebb1c624f 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: 2024-05-29 +date: 2024-05-30 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 bf37232fd6ccc..c4f17a0d23c0b 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: 2024-05-29 +date: 2024-05-30 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 a0eea9e78ed12..60204b0166411 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: 2024-05-29 +date: 2024-05-30 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 e0273fdf93a84..3ea867e91b6b8 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: 2024-05-29 +date: 2024-05-30 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 914b6e22ff0ea..a9fa41abd1a5c 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: 2024-05-29 +date: 2024-05-30 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 1701d5b8aee5a..ce55b3f5097d8 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: 2024-05-29 +date: 2024-05-30 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 02e0e4749685c..8cbb1d623572e 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: 2024-05-29 +date: 2024-05-30 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 44b9398f67933..ee79ccdb4594f 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: 2024-05-29 +date: 2024-05-30 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 2aabd0fc7a435..564ad1d13bc06 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: 2024-05-29 +date: 2024-05-30 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 1ac7e3cdf15b2..d99f659089c13 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: 2024-05-29 +date: 2024-05-30 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 657b135a1c53c..9c0289ae420fb 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: 2024-05-29 +date: 2024-05-30 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 5287f9728a1cf..f8502c3d92901 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: 2024-05-29 +date: 2024-05-30 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 a4e79440e379e..5b0d1cbc4826e 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: 2024-05-29 +date: 2024-05-30 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 89d3a82acd173..c84d830530c2d 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: 2024-05-29 +date: 2024-05-30 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 4cb48dc475798..4272bc2c9af85 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: 2024-05-29 +date: 2024-05-30 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 9bb89e0f63e19..210257fbe7a4b 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: 2024-05-29 +date: 2024-05-30 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 98830d5a49651..6c7b3be5dc957 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: 2024-05-29 +date: 2024-05-30 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 ceb12aa245ff2..579916c6f5753 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: 2024-05-29 +date: 2024-05-30 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 6770acc1f67e7..96818c7ffcfab 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 8b1473fbe9afb..b405cfcef12f0 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -7008,7 +7008,7 @@ "section": "def-common.Filter", "text": "Filter" }, - "[]; onEdit: () => Promise; onPhaseChange: ", + "[]; onEdit: () => Promise; phase$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -16039,7 +16039,7 @@ "label": "Operation", "description": [], "signature": [ - "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"filters\" | \"range\" | \"date_histogram\" | \"percentile\" | \"average\" | \"terms\" | \"cumulative_sum\" | \"moving_average\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\" | \"counter_rate\" | \"differences\" | \"formula\" | \"static_value\" | \"normalize_by_unit\"" + "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"filters\" | \"range\" | \"average\" | \"date_histogram\" | \"percentile\" | \"terms\" | \"cumulative_sum\" | \"moving_average\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\" | \"counter_rate\" | \"differences\" | \"formula\" | \"static_value\" | \"normalize_by_unit\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/operations.ts", "deprecated": false, @@ -16069,7 +16069,7 @@ "label": "OperationWithSourceField", "description": [], "signature": [ - "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"filters\" | \"range\" | \"date_histogram\" | \"percentile\" | \"average\" | \"terms\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\"" + "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"filters\" | \"range\" | \"average\" | \"date_histogram\" | \"percentile\" | \"terms\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/operations.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 8a2c40cb6ebf5..5e150911bb04d 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: 2024-05-29 +date: 2024-05-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From f1abff74fd4194915f245ead08dff4acd9e56675 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 30 May 2024 08:09:33 +0200 Subject: [PATCH 58/95] [Fleet] added force flag to delete agent_policies API (#184419) ## Summary Closes https://github.com/elastic/kibana/issues/182913 Added `force` flag to delete managed agent policy / agent policy with managed package policies. It is still not possible to force delete an agent policy which has agents enrolled. To verify: - create managed agent policy / policy with managed package policies - use the force flag to delete the agent policy ``` POST kbn:/api/fleet/agent_policies/delete { "agentPolicyId": "POLICY_ID", "force": true } ``` ### Checklist - [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 --- .../plugins/fleet/common/openapi/bundled.json | 4 ++++ .../plugins/fleet/common/openapi/bundled.yaml | 5 +++++ .../openapi/paths/agent_policies@delete.yaml | 3 +++ .../server/routes/agent_policy/handlers.ts | 1 + .../server/services/agent_policy.test.ts | 13 +++++++++++ .../server/types/rest_spec/agent_policy.ts | 1 + .../apis/agent_policy/agent_policy.ts | 22 +++++++++++++++++++ 7 files changed, 49 insertions(+) diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 709692b82c6ac..9cf43fb158414 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -3814,6 +3814,10 @@ "properties": { "agentPolicyId": { "type": "string" + }, + "force": { + "type": "boolean", + "description": "bypass validation checks that can prevent agent policy deletion" } }, "required": [ diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index 93ed244d05805..4e0c1874c2fe3 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -2387,6 +2387,11 @@ paths: properties: agentPolicyId: type: string + force: + type: boolean + description: >- + bypass validation checks that can prevent agent policy + deletion required: - agentPolicyId parameters: diff --git a/x-pack/plugins/fleet/common/openapi/paths/agent_policies@delete.yaml b/x-pack/plugins/fleet/common/openapi/paths/agent_policies@delete.yaml index 966d8abc1e328..284eaad198c0f 100644 --- a/x-pack/plugins/fleet/common/openapi/paths/agent_policies@delete.yaml +++ b/x-pack/plugins/fleet/common/openapi/paths/agent_policies@delete.yaml @@ -28,6 +28,9 @@ post: properties: agentPolicyId: type: string + force: + type: boolean + description: bypass validation checks that can prevent agent policy deletion required: - agentPolicyId parameters: diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts index 0893d93db9b33..a045fc77c6e69 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts @@ -335,6 +335,7 @@ export const deleteAgentPoliciesHandler: RequestHandler< request.body.agentPolicyId, { user: user || undefined, + force: request.body.force, } ); return response.ok({ diff --git a/x-pack/plugins/fleet/server/services/agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policy.test.ts index 9811445af6ee3..690a4807b14af 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.test.ts @@ -467,6 +467,19 @@ describe('Agent policy', () => { } }); + it('should allow delete with force for agent policy which has managed package policy', async () => { + mockedPackagePolicyService.findAllForAgentPolicy.mockReturnValue([ + { + id: 'package-1', + is_managed: true, + }, + ] as any); + const response = await agentPolicyService.delete(soClient, esClient, 'mocked', { + force: true, + }); + expect(response.id).toEqual('mocked'); + }); + it('should call audit logger', async () => { await agentPolicyService.delete(soClient, esClient, 'mocked'); diff --git a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts index 88cc6df372c11..aa38b54582fe5 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts @@ -79,6 +79,7 @@ export const CopyAgentPolicyRequestSchema = { export const DeleteAgentPolicyRequestSchema = { body: schema.object({ agentPolicyId: schema.string(), + force: schema.maybe(schema.boolean()), }), }; diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts index 625f8a444f608..c3c912ddf7634 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts @@ -1308,6 +1308,28 @@ export default function (providerContext: FtrProviderContext) { }); }); + it('should allow hosted policy delete with force flag', async () => { + const { + body: { item: createdPolicy }, + } = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Hosted policy', + namespace: 'default', + is_managed: true, + }) + .expect(200); + hostedPolicy = createdPolicy; + await supertest + .post('/api/fleet/agent_policies/delete') + .set('kbn-xsrf', 'xxx') + .send({ agentPolicyId: hostedPolicy.id, force: true }) + .expect(200); + + await supertest.get(`/api/fleet/agent_policies/${hostedPolicy.id}`).expect(404); + }); + describe('Errors when trying to delete', () => { it('should prevent policies having agents from being deleted', async () => { const { From fb1258869da4880113619d719da3e5c2ed102192 Mon Sep 17 00:00:00 2001 From: Ido Cohen <90558359+CohenIdo@users.noreply.github.com> Date: Thu, 30 May 2024 09:59:52 +0300 Subject: [PATCH 59/95] [Cloud Security] Refactor D4C metering function (#183814) --- .../cloud_security/cloud_security_metering.ts | 20 +- .../cloud_security_metering_task.test.ts | 223 +++++++++++------- .../cloud_security_metering_task.ts | 51 +--- .../server/cloud_security/constants.ts | 2 +- .../defend_for_containers_metering.ts | 147 ++++++++++++ .../task_manager/usage_reporting_task.ts | 4 +- 6 files changed, 307 insertions(+), 140 deletions(-) create mode 100644 x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering.ts index 4b7f0da990b8a..72568fbd4c8a0 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering.ts @@ -11,6 +11,7 @@ import { CLOUD_DEFEND, CNVM, CSPM, KSPM } from './constants'; import type { CloudSecuritySolutions } from './types'; import type { MeteringCallBackResponse, MeteringCallbackInput, Tier, UsageRecord } from '../types'; import type { ServerlessSecurityConfig } from '../config'; +import { getCloudDefendUsageRecords } from './defend_for_containers_metering'; export const cloudSecurityMetringCallback = async ({ esClient, @@ -28,8 +29,19 @@ export const cloudSecurityMetringCallback = async ({ const cloudSecuritySolutions: CloudSecuritySolutions[] = [CSPM, KSPM, CNVM, CLOUD_DEFEND]; const promiseResults = await Promise.allSettled( - cloudSecuritySolutions.map((cloudSecuritySolution) => - getCloudSecurityUsageRecord({ + cloudSecuritySolutions.map((cloudSecuritySolution) => { + if (cloudSecuritySolution === CLOUD_DEFEND) { + return getCloudDefendUsageRecords({ + esClient, + projectId, + logger, + taskId, + lastSuccessfulReport, + cloudSecuritySolution, + tier, + }); + } + return getCloudSecurityUsageRecord({ esClient, projectId, logger, @@ -37,8 +49,8 @@ export const cloudSecurityMetringCallback = async ({ lastSuccessfulReport, cloudSecuritySolution, tier, - }) - ) + }); + }) ); const cloudSecurityUsageRecords: UsageRecord[] = []; diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts index 205bdd5b663ea..f775b91406c4c 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.test.ts @@ -16,7 +16,8 @@ import { import type { ServerlessSecurityConfig } from '../config'; import type { CloudSecuritySolutions } from './types'; import type { ProductTier } from '../../common/product'; -import { CLOUD_SECURITY_TASK_TYPE, CSPM, KSPM, CNVM } from './constants'; +import { CLOUD_SECURITY_TASK_TYPE, CSPM, KSPM, CNVM, CLOUD_DEFEND } from './constants'; +import { getCloudDefendUsageRecords } from './defend_for_containers_metering'; const mockEsClient = elasticsearchServiceMock.createStart().client.asInternalUser; const logger: ReturnType = loggingSystemMock.createLogger(); @@ -160,26 +161,6 @@ describe('getCloudSecurityUsageRecord', () => { }); describe('getSearchQueryByCloudSecuritySolution', () => { - it('should return the correct search query for CLOUD_DEFEND', () => { - const searchFrom = new Date('2023-07-30T15:11:41.738Z'); - - const result = getSearchQueryByCloudSecuritySolution('cloud_defend', searchFrom); - - expect(result).toEqual({ - bool: { - must: [ - { - range: { - '@timestamp': { - gt: '2023-07-30T15:11:41.738Z', - }, - }, - }, - ], - }, - }); - }); - it('should return the correct search query for CSPM', () => { const searchFrom = new Date('2023-07-30T15:11:41.738Z'); @@ -296,38 +277,42 @@ describe('should return the relevant product tier', () => { expect(tier).toBe('complete'); }); - it('should return usageRecords with correct values for cloud defend', async () => { + it('should return none tier in case cloud product line is missing ', async () => { + const serverlessSecurityConfig = { + enabled: true, + developer: {}, + productTypes: [{ product_line: 'endpoint', product_tier: 'complete' }], + } as unknown as ServerlessSecurityConfig; + + const tier = getCloudProductTier(serverlessSecurityConfig, logger); + + expect(tier).toBe('none'); + }); +}); + +describe('cloud defend metering', () => { + it('should return usageRecords with correct values', async () => { const cloudSecuritySolution = 'cloud_defend'; - // @ts-ignore - mockEsClient.search.mockResolvedValueOnce({ - hits: { hits: [{ _id: 'someRecord', _index: 'mockIndex' }] }, // mocking for indexHasDataInDateRange - }); + const agentId1 = chance.guid(); + const eventIngestedStr = '2024-05-28T12:10:51Z'; + const eventIngestedTimestamp = new Date(eventIngestedStr); // @ts-ignore mockEsClient.search.mockResolvedValueOnce({ - aggregations: { - asset_count_groups: { - buckets: [ - { - key_as_string: 'true', - unique_assets: { - value: 10, - }, - min_timestamp: { - value_as_string: '2023-07-30T15:11:41.738Z', - }, - }, - { - key_as_string: 'false', - unique_assets: { - value: 5, - }, - min_timestamp: { - value_as_string: '2023-07-30T15:11:41.738Z', + hits: { + hits: [ + { + _id: 'someRecord', + _index: 'mockIndex', + _source: { + 'cloud_defend.block_action_enabled': true, + 'agent.id': agentId1, + event: { + ingested: eventIngestedStr, }, }, - ], - }, + }, + ], }, }); @@ -336,48 +321,33 @@ describe('should return the relevant product tier', () => { const tier = 'essentials' as ProductTier; - const result = await getCloudSecurityUsageRecord({ + const result = await getCloudDefendUsageRecords({ esClient: mockEsClient, projectId, - logger, taskId, lastSuccessfulReport: new Date(), cloudSecuritySolution, + logger, tier, }); + const roundedIngestedTimestamp = eventIngestedTimestamp; + roundedIngestedTimestamp.setMinutes(0); + roundedIngestedTimestamp.setSeconds(0); + roundedIngestedTimestamp.setMilliseconds(0); + expect(result).toEqual([ { id: expect.stringContaining( - `${CLOUD_SECURITY_TASK_TYPE}_${cloudSecuritySolution}_${projectId}` + `${projectId}_${agentId1}_${roundedIngestedTimestamp.toISOString()}` ), - usage_timestamp: '2023-07-30T15:11:41.738Z', - creation_timestamp: expect.any(String), // Expect a valid ISO string + usage_timestamp: eventIngestedStr, + creation_timestamp: expect.any(String), usage: { type: CLOUD_SECURITY_TASK_TYPE, - sub_type: `${cloudSecuritySolution}_block_action_enabled_true`, - quantity: 10, - period_seconds: expect.any(Number), - }, - source: { - id: taskId, - instance_group_id: projectId, - metadata: { - tier: 'essentials', - }, - }, - }, - { - id: expect.stringContaining( - `${CLOUD_SECURITY_TASK_TYPE}_${cloudSecuritySolution}_${projectId}` - ), - usage_timestamp: '2023-07-30T15:11:41.738Z', - creation_timestamp: expect.any(String), // Expect a valid ISO string - usage: { - type: CLOUD_SECURITY_TASK_TYPE, - sub_type: `${cloudSecuritySolution}_block_action_enabled_false`, - quantity: 5, - period_seconds: expect.any(Number), + sub_type: CLOUD_DEFEND, + quantity: 1, + period_seconds: 3600, }, source: { id: taskId, @@ -390,15 +360,102 @@ describe('should return the relevant product tier', () => { ]); }); - it('should return none tier in case cloud product line is missing ', async () => { - const serverlessSecurityConfig = { - enabled: true, - developer: {}, - productTypes: [{ product_line: 'endpoint', product_tier: 'complete' }], - } as unknown as ServerlessSecurityConfig; + it('should return an empty array when Elasticsearch returns an empty response', async () => { + // @ts-ignore + mockEsClient.search.mockResolvedValueOnce({ + hits: { + hits: [], + }, + }); + const tier = 'essentials' as ProductTier; + // Call the function with mock parameters + const result = await getCloudDefendUsageRecords({ + esClient: mockEsClient, + projectId: chance.guid(), + taskId: chance.guid(), + lastSuccessfulReport: new Date(), + cloudSecuritySolution: 'cloud_defend', + logger, + tier, + }); - const tier = getCloudProductTier(serverlessSecurityConfig, logger); + // Assert that the result is an empty array + expect(result).toEqual([]); + }); - expect(tier).toBe('none'); + it('should handle errors from Elasticsearch', async () => { + // Mock Elasticsearch client's search method to throw an error + mockEsClient.search.mockRejectedValueOnce(new Error('Elasticsearch query failed')); + + const tier = 'essentials' as ProductTier; + + // Call the function with mock parameters + await getCloudDefendUsageRecords({ + esClient: mockEsClient, + projectId: chance.guid(), + taskId: chance.guid(), + lastSuccessfulReport: new Date(), + cloudSecuritySolution: 'cloud_defend', + logger, + tier, + }); + + // Assert that the logger's error method was called with the correct error message + expect(logger.error).toHaveBeenCalledWith( + 'Failed to fetch cloud_defend metering data Error: Elasticsearch query failed' + ); + }); + + it('should return usageRecords when Elasticsearch returns multiple records', async () => { + // Mock Elasticsearch response with multiple records + const agentId1 = chance.guid(); + const agentId2 = chance.guid(); + const eventIngestedStr1 = '2024-05-28T12:10:51Z'; + const eventIngestedStr2 = '2024-05-28T13:10:51Z'; + + // @ts-ignore + mockEsClient.search.mockResolvedValueOnce({ + hits: { + hits: [ + { + _id: 'record1', + _index: 'mockIndex', + _source: { + 'cloud_defend.block_action_enabled': true, + 'agent.id': agentId1, + event: { + ingested: eventIngestedStr1, + }, + }, + }, + { + _id: 'record2', + _index: 'mockIndex', + _source: { + 'cloud_defend.block_action_enabled': true, + 'agent.id': agentId2, + event: { + ingested: eventIngestedStr2, + }, + }, + }, + ], + }, + }); + const tier = 'essentials' as ProductTier; + + // Call the function with mock parameters + const result = await getCloudDefendUsageRecords({ + esClient: mockEsClient, + projectId: chance.guid(), + taskId: chance.guid(), + lastSuccessfulReport: new Date(), + cloudSecuritySolution: 'cloud_defend', + logger, + tier, + }); + + // Assert that the result contains usage records for both records + expect(result).toHaveLength(2); }); }); diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts index aa9ae18a0a37a..7827c5d25ebe6 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts @@ -10,7 +10,6 @@ import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import { AGGREGATION_PRECISION_THRESHOLD, ASSETS_SAMPLE_GRANULARITY, - CLOUD_DEFEND, CLOUD_SECURITY_TASK_TYPE, CNVM, CSPM, @@ -24,7 +23,6 @@ import type { CloudSecurityMeteringCallbackInput, CloudSecuritySolutions, AssetCountAggregation, - CloudDefendAssetCountAggregation, } from './types'; export const getUsageRecords = ( @@ -58,18 +56,13 @@ export const getUsageRecords = ( } const roundedCreationTimestamp = creationTimestamp.toISOString(); - const subType = - cloudSecuritySolution === CLOUD_DEFEND - ? `${CLOUD_DEFEND}_block_action_enabled_${assetCountAggregation.key_as_string}` - : cloudSecuritySolution; - const usageRecord: UsageRecord = { id: `${CLOUD_SECURITY_TASK_TYPE}_${cloudSecuritySolution}_${projectId}_${roundedCreationTimestamp}`, usage_timestamp: minTimestamp, creation_timestamp: creationTimestamp.toISOString(), usage: { type: CLOUD_SECURITY_TASK_TYPE, - sub_type: subType, + sub_type: cloudSecuritySolution, quantity: assetCount, period_seconds: periodSeconds, }, @@ -88,28 +81,6 @@ export const getUsageRecords = ( export const getAggregationByCloudSecuritySolution = ( cloudSecuritySolution: CloudSecuritySolutions ) => { - if (cloudSecuritySolution === CLOUD_DEFEND) { - return { - asset_count_groups: { - terms: { - field: 'cloud_defend.block_action_enabled', - }, - aggs: { - unique_assets: { - cardinality: { - field: METERING_CONFIGS[cloudSecuritySolution].assets_identifier, - }, - }, - min_timestamp: { - min: { - field: '@timestamp', - }, - }, - }, - }, - }; - } - return { unique_assets: { cardinality: { @@ -131,16 +102,6 @@ export const getSearchQueryByCloudSecuritySolution = ( ) => { const mustFilters = []; - if (cloudSecuritySolution === CLOUD_DEFEND) { - mustFilters.push({ - range: { - '@timestamp': { - gt: searchFrom.toISOString(), - }, - }, - }); - } - if ( cloudSecuritySolution === CSPM || cloudSecuritySolution === KSPM || @@ -201,16 +162,6 @@ export const getAssetAggByCloudSecuritySolution = async ( ): Promise => { const assetsAggQuery = getAssetAggQueryByCloudSecuritySolution(cloudSecuritySolution, searchFrom); - if (cloudSecuritySolution === CLOUD_DEFEND) { - const response = await esClient.search( - assetsAggQuery - ); - - if (!response.aggregations || !response.aggregations.asset_count_groups.buckets.length) - return []; - return response.aggregations.asset_count_groups.buckets; - } - const response = await esClient.search(assetsAggQuery); if (!response.aggregations) return []; diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts index 2a6d5825746db..25504b1da2e64 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/constants.ts @@ -14,7 +14,7 @@ import { } from '@kbn/cloud-security-posture-plugin/common/constants'; import { INTEGRATION_PACKAGE_NAME } from '@kbn/cloud-defend-plugin/common/constants'; -const CLOUD_DEFEND_HEARTBEAT_INDEX = 'metrics-cloud_defend.heartbeat'; +export const CLOUD_DEFEND_HEARTBEAT_INDEX = 'metrics-cloud_defend.heartbeat-*'; export const CLOUD_SECURITY_TASK_TYPE = 'cloud_security'; export const AGGREGATION_PRECISION_THRESHOLD = 40000; export const ASSETS_SAMPLE_GRANULARITY = '24h'; diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts new file mode 100644 index 0000000000000..949eb709ec3a5 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts @@ -0,0 +1,147 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { + AggregationsAggregate, + SearchResponse, + SortResults, +} from '@elastic/elasticsearch/lib/api/types'; +import type { Tier, UsageRecord } from '../types'; +import type { CloudSecurityMeteringCallbackInput } from './types'; +import { CLOUD_DEFEND, CLOUD_SECURITY_TASK_TYPE, CLOUD_DEFEND_HEARTBEAT_INDEX } from './constants'; + +const BATCH_SIZE = 1000; +const SAMPLE_WEIGHT_SECONDS = 3600; // 1 Hour + +export interface CloudDefendHeartbeat { + '@timestamp': string; + 'agent.id': string; + event: { + ingested: string; + }; +} + +const buildMeteringRecord = ( + agentId: string, + timestampStr: string, + taskId: string, + tier: Tier, + projectId: string +): UsageRecord => { + const timestamp = new Date(timestampStr); + timestamp.setMinutes(0); + timestamp.setSeconds(0); + timestamp.setMilliseconds(0); + const creationTimestamp = new Date(); + const usageRecord = { + id: `${projectId}_${agentId}_${timestamp.toISOString()}`, + usage_timestamp: timestampStr, + creation_timestamp: creationTimestamp.toISOString(), + usage: { + type: CLOUD_SECURITY_TASK_TYPE, + sub_type: CLOUD_DEFEND, + period_seconds: SAMPLE_WEIGHT_SECONDS, + quantity: 1, + }, + source: { + id: taskId, + instance_group_id: projectId, + metadata: { + tier, + }, + }, + }; + + return usageRecord; +}; +export const getUsageRecords = async ( + esClient: ElasticsearchClient, + searchFrom: Date, + searchAfter?: SortResults +): Promise>> => { + return esClient.search( + { + index: CLOUD_DEFEND_HEARTBEAT_INDEX, + size: BATCH_SIZE, + sort: [{ 'event.ingested': 'asc' }, { 'agent.id': 'asc' }], + search_after: searchAfter, + query: { + bool: { + must: [ + { + range: { + 'event.ingested': { + gt: searchFrom.toISOString(), + }, + }, + }, + { + term: { + 'cloud_defend.block_action_enabled': true, + }, + }, + ], + }, + }, + }, + { ignore: [404] } + ); +}; + +export const getCloudDefendUsageRecords = async ({ + esClient, + projectId, + taskId, + lastSuccessfulReport, + cloudSecuritySolution, + tier, + logger, +}: CloudSecurityMeteringCallbackInput): Promise => { + try { + let allRecords: UsageRecord[] = []; + let searchAfter: SortResults | undefined; + let fetchMore = true; + + while (fetchMore) { + const usageRecords = await getUsageRecords(esClient, lastSuccessfulReport, searchAfter); + + if (!usageRecords?.hits?.hits?.length) { + break; + } + + const records = usageRecords.hits.hits.reduce((acc, { _source }) => { + if (!_source) { + return acc; + } + + const { event } = _source; + const record = buildMeteringRecord( + _source['agent.id'], + event.ingested, + taskId, + tier, + projectId + ); + + return [...acc, record]; + }, [] as UsageRecord[]); + + allRecords = [...allRecords, ...records]; + + if (usageRecords.hits.hits.length < BATCH_SIZE) { + fetchMore = false; + } else { + searchAfter = usageRecords.hits.hits[usageRecords.hits.hits.length - 1].sort; + } + } + + return allRecords; + } catch (err) { + logger.error(`Failed to fetch ${cloudSecuritySolution} metering data ${err}`); + } +}; diff --git a/x-pack/plugins/security_solution_serverless/server/task_manager/usage_reporting_task.ts b/x-pack/plugins/security_solution_serverless/server/task_manager/usage_reporting_task.ts index 2026132c5a661..2d612708f5bf3 100644 --- a/x-pack/plugins/security_solution_serverless/server/task_manager/usage_reporting_task.ts +++ b/x-pack/plugins/security_solution_serverless/server/task_manager/usage_reporting_task.ts @@ -163,7 +163,7 @@ export class SecurityUsageReportingTask { if (!usageReportResponse.ok) { const errorResponse = await usageReportResponse.json(); - this.logger.warn(`API error ${usageReportResponse.status}, ${errorResponse}`); + this.logger.error(`API error ${usageReportResponse.status}, ${errorResponse}`); return { state: taskInstance.state, runAt: new Date() }; } @@ -175,7 +175,7 @@ export class SecurityUsageReportingTask { }, ${usageReportResponse.statusText}` ); } catch (err) { - this.logger.warn( + this.logger.error( `Failed to send (${ usageRecords.length }) usage records starting from ${lastSuccessfulReport.toISOString()}: ${err} ` From 7abbfca0bead76ec0a9b210c3de3cc953e0405a7 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 30 May 2024 10:40:38 +0200 Subject: [PATCH 60/95] [SLOs] Update storybook decorator usage (#184452) ## Summary We shouldn't be exporting storybook helpers via plugin bundles !! --- src/dev/storybook/aliases.ts | 1 + .../observability/public/index.ts | 1 - .../burn_rate_rule_editor.stories.tsx | 2 +- .../slo_selector.stories.tsx | 2 +- .../auto_refresh_button.stories.tsx | 2 +- .../slo_delete_confirmation_modal.stories.tsx | 2 +- .../slo_active_alerts_badge.stories.tsx | 2 +- .../slo_status_badge.stories.tsx | 2 +- .../components/header_control.stories.tsx | 2 +- .../components/header_title.stories.tsx | 2 +- .../components/overview/overview.stories.tsx | 2 +- .../components/slo_details.stories.tsx | 2 +- ...ailability_indicator_type_form.stories.tsx | 2 +- .../apm_common/field_selector.stories.tsx | 2 +- ...pm_latency_indicator_type_form.stories.tsx | 2 +- .../common/query_builder.stories.tsx | 2 +- .../custom_common/index_selection.stories.tsx | 2 +- ...custom_kql_indicator_type_form.stories.tsx | 2 +- .../custom_metric_type_form.stories.tsx | 2 +- .../components/slo_edit_form.stories.tsx | 2 +- ..._edit_form_description_section.stories.tsx | 2 +- ...lo_edit_form_objective_section.stories.tsx | 2 +- ...m_objective_section_timeslices.stories.tsx | 2 +- .../components/badges/slo_badges.stories.tsx | 2 +- .../slo_indicator_type_badge.stories.tsx | 2 +- .../badges/slo_rules_badge.stories.tsx | 2 +- .../badges/slo_time_window_badge.stories.tsx | 2 +- .../slos/components/header_title.stories.tsx | 2 +- .../slos/components/slo_list.stories.tsx | 2 +- .../components/slo_list_empty.stories.tsx | 2 +- .../components/slo_list_error.stories.tsx | 2 +- .../slo_list_search_bar.stories.tsx | 2 +- .../slo_list_view/slo_list_item.stories.tsx | 2 +- .../slos/components/slo_sparkline.stories.tsx | 2 +- .../slos/components/slo_summary.stories.tsx | 2 +- .../slos_welcome/slos_welcome.stories.tsx | 2 +- .../kibana_react.storybook_decorator.tsx | 118 ++++++++++++++++++ .../slo/scripts/storybook.js | 16 +++ .../observability_solution/slo/tsconfig.json | 4 +- 39 files changed, 172 insertions(+), 36 deletions(-) create mode 100644 x-pack/plugins/observability_solution/slo/public/utils/kibana_react.storybook_decorator.tsx create mode 100644 x-pack/plugins/observability_solution/slo/scripts/storybook.js diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts index 1bec4f797e2fd..3e7efefc1b859 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -53,6 +53,7 @@ export const storybookAliases = { 'x-pack/plugins/observability_solution/observability_ai_assistant/.storybook', observability_ai_assistant_app: 'x-pack/plugins/observability_solution/observability_ai_assistant_app/.storybook', + observability_slo: 'x-pack/plugins/observability_solution/slo/.storybook', presentation: 'src/plugins/presentation_util/storybook', random_sampling: 'x-pack/packages/kbn-random-sampling/.storybook', text_based_editor: 'packages/kbn-text-based-editor/.storybook', diff --git a/x-pack/plugins/observability_solution/observability/public/index.ts b/x-pack/plugins/observability_solution/observability/public/index.ts index b6da758f02cd8..d655b872ca3e5 100644 --- a/x-pack/plugins/observability_solution/observability/public/index.ts +++ b/x-pack/plugins/observability_solution/observability/public/index.ts @@ -78,7 +78,6 @@ export { useCreateRule } from './hooks/use_create_rule'; export { getApmTraceUrl } from './utils/get_apm_trace_url'; export { buildEsQuery } from './utils/build_es_query'; -export { KibanaReactStorybookDecorator } from './utils/kibana_react.storybook_decorator'; export type { ObservabilityRuleTypeFormatter, diff --git a/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx b/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx index 86fb2b6d6c249..67d084c2bfff0 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx @@ -7,9 +7,9 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; import { BurnRateRuleParams } from '../../typings'; import { BurnRateRuleEditor as Component } from './burn_rate_rule_editor'; +import { KibanaReactStorybookDecorator } from '../../utils/kibana_react.storybook_decorator'; export default { component: Component, diff --git a/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/slo_selector.stories.tsx b/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/slo_selector.stories.tsx index 508bf924901ed..0bf35eea5ffe9 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/slo_selector.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/burn_rate_rule_editor/slo_selector.stories.tsx @@ -5,10 +5,10 @@ * 2.0. */ -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; import { SLODefinitionResponse } from '@kbn/slo-schema'; import { ComponentStory } from '@storybook/react'; import React from 'react'; +import { KibanaReactStorybookDecorator } from '../../utils/kibana_react.storybook_decorator'; import { SloSelector as Component } from './slo_selector'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/auto_refresh_button/auto_refresh_button.stories.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/auto_refresh_button/auto_refresh_button.stories.tsx index e892ebe5d2090..5a5b94401253e 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/auto_refresh_button/auto_refresh_button.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/auto_refresh_button/auto_refresh_button.stories.tsx @@ -8,7 +8,7 @@ import React, { useState } from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { AutoRefreshButton as Component } from './auto_refresh_button'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/delete_confirmation_modal/slo_delete_confirmation_modal.stories.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/delete_confirmation_modal/slo_delete_confirmation_modal.stories.tsx index da00028bf1e12..e6b969d9d89ac 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/delete_confirmation_modal/slo_delete_confirmation_modal.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/delete_confirmation_modal/slo_delete_confirmation_modal.stories.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; import { ComponentStory } from '@storybook/react'; import React from 'react'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { buildSlo } from '../../../data/slo/slo'; import { Props, SloDeleteModal as Component } from './slo_delete_confirmation_modal'; diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.stories.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.stories.tsx index 487dc17eba66c..c9f07555897c5 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_active_alerts_badge.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloActiveAlertsBadge as Component, Props } from './slo_active_alerts_badge'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_status_badge.stories.tsx b/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_status_badge.stories.tsx index e14af67c323ca..a7acf522c0b46 100644 --- a/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_status_badge.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/components/slo/slo_status_badge/slo_status_badge.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloStatusBadge as Component, SloStatusProps } from './slo_status_badge'; import { buildSlo } from '../../../data/slo/slo'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.stories.tsx index 3f4efc2f9bf73..af6338d4a3977 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_control.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { buildSlo } from '../../../data/slo/slo'; import { HeaderControl as Component, Props } from './header_control'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_title.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_title.stories.tsx index 3a4289a840765..daf5e8038fdd3 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_title.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/header_title.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { buildSlo } from '../../../data/slo/slo'; import { HeaderTitle as Component, Props } from './header_title'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/overview/overview.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/overview/overview.stories.tsx index 4e04957b631fd..c393846e23a7d 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/overview/overview.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/overview/overview.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { buildSlo } from '../../../../data/slo/slo'; import { Overview as Component, Props } from './overview'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/slo_details.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/slo_details.stories.tsx index 537bca9b3c7f3..03b0fdbe62723 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/slo_details.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/slo_details.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { buildSlo } from '../../../data/slo/slo'; import { SloDetails as Component, Props } from './slo_details'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.stories.tsx index 235c45db8c986..c3c506eb484eb 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { ApmAvailabilityIndicatorTypeForm as Component } from './apm_availability_indicator_type_form'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_common/field_selector.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_common/field_selector.stories.tsx index 9e13afe04d796..47111ee1c565b 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_common/field_selector.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_common/field_selector.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { FieldSelector as Component, Props } from './field_selector'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_latency/apm_latency_indicator_type_form.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_latency/apm_latency_indicator_type_form.stories.tsx index 7c432141ef80b..3ca02641f9bfa 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_latency/apm_latency_indicator_type_form.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_latency/apm_latency_indicator_type_form.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { ApmLatencyIndicatorTypeForm as Component } from './apm_latency_indicator_type_form'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_builder.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_builder.stories.tsx index a20e00985a66e..88d2679ceb6e9 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_builder.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_builder.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { QueryBuilder as Component, SearchBarProps } from './query_builder'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.stories.tsx index d9a8386b7ed84..4b8dce62f43bb 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { IndexSelection as Component } from './index_selection'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.stories.tsx index 24342ce10a64c..5eb0b68070789 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { CustomKqlIndicatorTypeForm as Component } from './custom_kql_indicator_type_form'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/custom_metric_type_form.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/custom_metric_type_form.stories.tsx index 499e87f04d09f..1abbff61a0dc8 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/custom_metric_type_form.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/custom_metric_type_form.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { CustomMetricIndicatorTypeForm as Component } from './custom_metric_type_form'; import { SLO_EDIT_FORM_DEFAULT_VALUES_CUSTOM_METRIC } from '../../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form.stories.tsx index 9e90d5e315db8..ace1088d4a3bb 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloEditForm as Component, Props } from './slo_edit_form'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_description_section.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_description_section.stories.tsx index bac591b6ec365..8365b8ef27545 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_description_section.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_description_section.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloEditFormDescriptionSection as Component } from './slo_edit_form_description_section'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section.stories.tsx index 8f5a0e73d424c..ee2938321d136 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloEditFormObjectiveSection as Component } from './slo_edit_form_objective_section'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section_timeslices.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section_timeslices.stories.tsx index b33267f06690b..b4066c8f9a961 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section_timeslices.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/slo_edit_form_objective_section_timeslices.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloEditFormObjectiveSectionTimeslices as Component } from './slo_edit_form_objective_section_timeslices'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from '../constants'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_badges.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_badges.stories.tsx index 7c84e7e570b3b..ab4a5d0086da3 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_badges.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_badges.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { buildForecastedSlo } from '../../../../data/slo/slo'; import { SloBadges as Component, SloBadgesProps } from './slo_badges'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_indicator_type_badge.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_indicator_type_badge.stories.tsx index 727189580382b..fbc65fb1a2c12 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_indicator_type_badge.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_indicator_type_badge.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { buildCustomKqlIndicator, buildApmAvailabilityIndicator, diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.stories.tsx index ff11b8035d8b4..b88971e2a1355 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_rules_badge.stories.tsx @@ -10,7 +10,7 @@ import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { SloRulesBadge as Component, Props } from './slo_rules_badge'; import { BurnRateRuleParams } from '../../../../typings'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_time_window_badge.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_time_window_badge.stories.tsx index 69d7920e74726..8998cb0de9492 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_time_window_badge.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/badges/slo_time_window_badge.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { SloTimeWindowBadge as Component, Props } from './slo_time_window_badge'; import { buildSlo } from '../../../../data/slo/slo'; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/header_title.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/header_title.stories.tsx index 7ccdcf51d4d0b..05ecb3ab4bde3 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/header_title.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/header_title.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { HeaderTitle as Component } from './header_title'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.stories.tsx index 132d96a669aa3..3e6dd1c87d798 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloList as Component } from './slo_list'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_empty.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_empty.stories.tsx index 8204683836a13..b8c49050143fc 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_empty.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_empty.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloListEmpty as Component } from './slo_list_empty'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_error.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_error.stories.tsx index 632dde7858ab0..a3e2503449da8 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_error.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_error.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloListError as Component } from './slo_list_error'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.stories.tsx index 4d16c40c1edae..0d36156cfeced 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_search_bar.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { SloListSearchBar as Component } from './slo_list_search_bar'; export default { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_view/slo_list_item.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_view/slo_list_item.stories.tsx index ae6f75186917c..8e1c7b2ab3f33 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_view/slo_list_item.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_list_view/slo_list_item.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; import { HEALTHY_ROLLING_SLO, historicalSummaryData, diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.stories.tsx index 3306f12b9962a..3b46d028f731e 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.stories.tsx @@ -8,7 +8,7 @@ import { HistoricalSummaryResponse } from '@kbn/slo-schema'; import { ComponentStory } from '@storybook/react'; import React from 'react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { DEGRADING_FAST_ROLLING_SLO, HEALTHY_RANDOM_ROLLING_SLO, diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_summary.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_summary.stories.tsx index d13b033ede550..c62ff1d4156d4 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_summary.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_summary.stories.tsx @@ -7,7 +7,7 @@ import { ComponentStory } from '@storybook/react'; import React from 'react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; +import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; import { HEALTHY_ROLLING_SLO, historicalSummaryData, diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos_welcome/slos_welcome.stories.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos_welcome/slos_welcome.stories.tsx index 2b050c76a3fe5..186d8c600f7d9 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos_welcome/slos_welcome.stories.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos_welcome/slos_welcome.stories.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '@kbn/observability-plugin/public'; import { SlosWelcomePage as Component } from './slos_welcome'; +import { KibanaReactStorybookDecorator } from '../../utils/kibana_react.storybook_decorator'; export default { component: Component, diff --git a/x-pack/plugins/observability_solution/slo/public/utils/kibana_react.storybook_decorator.tsx b/x-pack/plugins/observability_solution/slo/public/utils/kibana_react.storybook_decorator.tsx new file mode 100644 index 0000000000000..8785772608b55 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/utils/kibana_react.storybook_decorator.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 React, { ComponentType } from 'react'; +import { of } from 'rxjs'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { AppMountParameters } from '@kbn/core-application-browser'; +import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; +import { CoreTheme } from '@kbn/core-theme-browser'; +import { MemoryRouter } from 'react-router-dom'; +import { casesFeatureId, sloFeatureId } from '@kbn/observability-shared-plugin/common'; +import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; +import { PluginContext } from '../context/plugin_context'; + +export function KibanaReactStorybookDecorator(Story: ComponentType) { + const queryClient = new QueryClient(); + + const appMountParameters = { + setHeaderActionMenu: () => {}, + } as unknown as AppMountParameters; + const observabilityRuleTypeRegistry = createObservabilityRuleTypeRegistryMock(); + + const mockTheme: CoreTheme = { + darkMode: false, + }; + + const createTheme$Mock = () => { + return of({ ...mockTheme }); + }; + + return ( + {}, + capabilities: { + [sloFeatureId]: { + read: true, + write: true, + }, + [casesFeatureId]: { read_cases: true }, + }, + }, + cases: { + getAllCases: () => <>Get All Cases component from Cases app, + helpers: { getUICapabilities: () => ({ read_cases: true }) }, + ui: { + getCases: () => <>Get Cases component from Cases app, + }, + }, + charts: { + theme: { + useChartsBaseTheme: () => {}, + }, + activeCursor: () => {}, + }, + data: {}, + dataViews: { + create: () => Promise.resolve({}), + }, + docLinks: { + links: { + query: {}, + }, + }, + http: { + basePath: { + prepend: (_: string) => '', + }, + }, + notifications: { + toasts: { + addDanger: () => {}, + }, + }, + share: { + url: { locators: { get: () => {} } }, + }, + storage: { + get: () => {}, + }, + theme: { + theme$: createTheme$Mock(), + }, + triggersActionsUi: { getAddRuleFlyout: {} }, + uiSettings: { + get: (setting: string) => { + if (setting === 'dateFormat') { + return 'MMM D, YYYY @ HH:mm:ss.SSS'; + } + if (setting === 'format:percent:defaultPattern') { + return '0,0.[000]%'; + } + }, + }, + unifiedSearch: {}, + }} + > + + + + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/slo/scripts/storybook.js b/x-pack/plugins/observability_solution/slo/scripts/storybook.js new file mode 100644 index 0000000000000..cb3dc7227b002 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/scripts/storybook.js @@ -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 { join } from 'path'; + +require('@kbn/storybook').runStorybookCli({ + name: 'observability_slo', + storyGlobs: [ + join(__dirname, '..', 'public', 'components', '**', '*.stories.tsx'), + join(__dirname, '..', 'public', 'pages', '**', '*.stories.tsx'), + ], +}); diff --git a/x-pack/plugins/observability_solution/slo/tsconfig.json b/x-pack/plugins/observability_solution/slo/tsconfig.json index d59deae17902c..b3974d1e20c91 100644 --- a/x-pack/plugins/observability_solution/slo/tsconfig.json +++ b/x-pack/plugins/observability_solution/slo/tsconfig.json @@ -94,6 +94,8 @@ "@kbn/dashboard-plugin", "@kbn/monaco", "@kbn/code-editor", - "@kbn/react-kibana-context-render" + "@kbn/react-kibana-context-render", + "@kbn/core-application-browser", + "@kbn/core-theme-browser" ] } From 71ea578bcba8814decd109264b4322984e65ec92 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Thu, 30 May 2024 09:48:07 +0100 Subject: [PATCH 61/95] [Security Solution][Detection Engine] fix flaky new terms suppression cypress test (#184347) ## Summary - addresses https://github.com/elastic/kibana/issues/183941 - It looks there is some kind of race condition when adding another Group by field during editing for New terms rule. Around 2-3 tests fails for 200 runs. So, I decided to exclude this command from a test - [kibana-flaky-test-suite-runner#6157](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6157) --- .../detection_engine/rule_edit/new_terms_rule.cy.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts index 63ba3e876c7d4..9957887d7c611 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/new_terms_rule.cy.ts @@ -33,7 +33,6 @@ import { saveEditedRule } from '../../../../tasks/edit_rule'; import { selectAlertSuppressionPerRuleExecution, selectDoNotSuppressForMissingFields, - fillAlertSuppressionFields, } from '../../../../tasks/create_new_rule'; import { visit } from '../../../../tasks/navigation'; @@ -52,13 +51,12 @@ describe( deleteAlertsAndRules(); }); - // FLAKY: https://github.com/elastic/kibana/issues/183941 - describe.skip('with suppression configured', () => { + describe('with suppression configured', () => { beforeEach(() => { createRule({ ...rule, alert_suppression: { - group_by: SUPPRESS_BY_FIELDS.slice(0, 1), + group_by: SUPPRESS_BY_FIELDS, duration: { value: 20, unit: 'm' }, missing_fields_strategy: 'suppress', }, @@ -78,12 +76,11 @@ describe( .eq(1) .should('be.enabled') .should('have.value', 'm'); - cy.get(ALERT_SUPPRESSION_FIELDS).should('contain', SUPPRESS_BY_FIELDS.slice(0, 1).join('')); + cy.get(ALERT_SUPPRESSION_FIELDS).should('contain', SUPPRESS_BY_FIELDS.join('')); cy.get(ALERT_SUPPRESSION_MISSING_FIELDS_SUPPRESS).should('be.checked'); - selectAlertSuppressionPerRuleExecution(); selectDoNotSuppressForMissingFields(); - fillAlertSuppressionFields(SUPPRESS_BY_FIELDS.slice(1)); + selectAlertSuppressionPerRuleExecution(); saveEditedRule(); From 3e44cca7e74e0b59f1afedcabb445b937e1bf730 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Thu, 30 May 2024 06:04:55 -0400 Subject: [PATCH 62/95] Identify CSP test functions (#184456) --- .../core-rendering-server-internal/src/views/template.tsx | 3 ++- packages/kbn-handlebars/src/utils.ts | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/rendering/core-rendering-server-internal/src/views/template.tsx b/packages/core/rendering/core-rendering-server-internal/src/views/template.tsx index c1db2fd69d7a8..358cd267f653a 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/views/template.tsx +++ b/packages/core/rendering/core-rendering-server-internal/src/views/template.tsx @@ -110,7 +110,8 @@ export const Template: FunctionComponent = ({